Поделиться через


Руководство: Создание событий, происходящих до и после операций, с использованием веб-перехватчика со службой автоматизации

Применимо: ✔️ виртуальные машины ✔️ ✔️ Linux под управлением Windows На локальных ✔️ ✔️ серверах azure Arc.

События предварительного и последующего выполнения, также известные как предварительные или пост-скрипты, позволяют выполнять пользовательские действия до и после установки исправлений по расписанию. Одним из наиболее распространенных сценариев является запуск и остановка виртуальной машины. С предварительными событиями можно запустить скрипт предварительного обновления, чтобы запустить виртуальную машину перед началом процесса исправления расписания. После завершения исправления расписания и перезагрузки сервера можно выполнить скрипт после исправления, чтобы безопасно завершить работу виртуальной машины.

В этом руководстве объясняется, как создать предварительные и постовые события для запуска и остановки виртуальной машины в рабочем процессе исправления расписания с помощью веб-перехватчика.

В этом руководстве описано следующее:

  • Необходимые компоненты
  • Создание и публикация модуля Runbook службы автоматизации
  • Добавление веб-перехватчиков
  • Создание подписки на событие

Необходимые компоненты

  1. Убедитесь, что вы используете runbook PowerShell 7.2 .

  2. Назначьте разрешение управляемым удостоверениям. Вы можете назначить разрешения соответствующему управляемому удостоверению. Runbook может использовать управляемое удостоверение учетной записи службы автоматизации, назначаемое пользователем или системой.

    Вы можете использовать портал или командлеты PowerShell для назначения разрешений каждому удостоверению:

    Выполните действия, описанные в статье "Назначение ролей Azure" с помощью портал Azure для назначения разрешений


  1. Az.ResourceGraph Импортируйте модуль, убедитесь, что модуль обновлен до ThreadJob с помощью модуля версии 2.0.3.

Создание и публикация модуля Runbook службы автоматизации

  1. Войдите в портал Azure и перейдите к учетной записи служба автоматизации Azure

  2. Создание и публикация модуля Runbook службы автоматизации.

  3. Если вы использовали модули Runbook, которые использовались для задач предварительной или последующей отправки в служба автоматизации Azure управлении обновлениями, важно выполнить приведенные ниже действия, чтобы избежать непредвиденных последствий для компьютеров и неудачных запусков обслуживания.

    1. Для модулей Runbook необходимо проанализировать полезные данные веб-перехватчика, чтобы убедиться, что он активируется только в событиях Microsoft.Maintenance.PreMaintenanceEvent или Microsoft.Maintenance.PostMaintenanceEvent . При разработке веб-перехватчиков активируются другие события подписки, если любое другое событие добавляется с той же конечной точкой.

      param 
      (  
        [Parameter(Mandatory=$false)]  
        [object] $WebhookData  
      
      )  
      $notificationPayload = ConvertFrom-Json -InputObject $WebhookData.RequestBody  
      $eventType = $notificationPayload[0].eventType  
      
      if ($eventType -ne "Microsoft.Maintenance.PreMaintenanceEvent" -and $eventType –ne "Microsoft.Maintenance.PostMaintenanceEvent" ) {  
        Write-Output "Webhook not triggered as part of pre or post patching for maintenance run"  
      return  
      } 
      
    2. Параметр SoftwareUpdateConfigurationRunContext , содержащий сведения о списке компьютеров в развертывании обновления, не будет передаваться в скрипты предварительной версии или публикации при использовании веб-перехватчика службы автоматизации. Вы можете запросить список компьютеров из Azure Resource Graph или получить список компьютеров, закодированных в скриптах.

      • Убедитесь, что соответствующие роли и разрешения предоставляются управляемым удостоверениям, которые вы используете в скрипте, для выполнения запросов Resource Graph и запуска или остановки компьютеров.
      • Просмотр разрешений, связанных с запросами графа ресурсов
      • См . роль участника виртуальных машин.
      • См. приведенный ниже код:
    3. Просмотр полезных данных веб-перехватчика

      param   
      (   
          [Parameter(Mandatory=$false)]   
          [object] $WebhookData   
      )   
      
      Connect-AzAccount -Identity   
      
      # Install the Resource Graph module from PowerShell Gallery   
      # Install-Module -Name Az.ResourceGraph   
      
      $notificationPayload = ConvertFrom-Json -InputObject $WebhookData.RequestBody   
      $maintenanceRunId = $notificationPayload[0].data.CorrelationId   
      $resourceSubscriptionIds = $notificationPayload[0].data.ResourceSubscriptionIds   
      
      if ($resourceSubscriptionIds.Count -gt 0) {    
      
          Write-Output "Querying ARG to get machine details[MaintenanceRunId=$maintenanceRunId][ResourceSubscriptionIdsCount=$($resourceSubscriptionIds.Count)]"    
          $argQuery = @"maintenanceresources     
          | where type =~ 'microsoft.maintenance/applyupdates'    
          | where properties.correlationId =~ '$($maintenanceRunId)'  
          | where id has '/providers/microsoft.compute/virtualmachines/'    
          | project id, resourceId = tostring(properties.resourceId)    
          | order by id asc 
      "@  
      
      Write-Output "Arg Query Used: $argQuery"    
      $allMachines = [System.Collections.ArrayList]@()    
      $skipToken = $null     
      $res = Search-AzGraph -Query $argQuery -First 1000 -SkipToken $skipToken -Subscription $resourceSubscriptionIds    
      $skipToken = $res.SkipToken    
      $allMachines.AddRange($res.Data)    
      } while ($skipToken -ne $null -and $skipToken.Length -ne 0)  
      
      if ($allMachines.Count -eq 0) {    
      Write-Output "No Machines were found."    
      break    
      }
      }
      
    4. Для настройки можно использовать существующие скрипты с приведенными выше изменениями или использовать следующие сценарии.

Примеры сценариев

param 
( 
    [Parameter(Mandatory=$false)] 
    [object] $WebhookData 
) 
Connect-AzAccount -Identity 

# Install the Resource Graph module from PowerShell Gallery 
# Install-Module -Name Az.ResourceGraph 

$notificationPayload = ConvertFrom-Json -InputObject $WebhookData.RequestBody 
$eventType = $notificationPayload[0].eventType 

if ($eventType -ne "Microsoft.Maintenance.PreMaintenanceEvent") { 
    Write-Output "Webhook not triggered as part of pre-patching for maintenance run" 
    return 
} 

$maintenanceRunId = $notificationPayload[0].data.CorrelationId 
$resourceSubscriptionIds = $notificationPayload[0].data.ResourceSubscriptionIds 

if ($resourceSubscriptionIds.Count -eq 0) { 
    Write-Output "Resource subscriptions are not present." 
    break 
} 
 
Write-Output "Querying ARG to get machine details [MaintenanceRunId=$maintenanceRunId][ResourceSubscriptionIdsCount=$($resourceSubscriptionIds.Count)]" 

$argQuery = @" 
    maintenanceresources  
    | where type =~ 'microsoft.maintenance/applyupdates' 
    | where properties.correlationId =~ '$($maintenanceRunId)' 
    | where id has '/providers/microsoft.compute/virtualmachines/' 
    | project id, resourceId = tostring(properties.resourceId) 
    | order by id asc 
"@ 

Write-Output "Arg Query Used: $argQuery" 

 
$allMachines = [System.Collections.ArrayList]@() 
$skipToken = $null 

do 
{ 
    $res = Search-AzGraph -Query $argQuery -First 1000 -SkipToken $skipToken -Subscription $resourceSubscriptionIds 
    $skipToken = $res.SkipToken 
    $allMachines.AddRange($res.Data) 
} while ($skipToken -ne $null -and $skipToken.Length -ne 0) 

if ($allMachines.Count -eq 0) { 
    Write-Output "No Machines were found." 
    break 
} 

$jobIDs= New-Object System.Collections.Generic.List[System.Object] 
$startableStates = "stopped" , "stopping", "deallocated", "deallocating" 
$allMachines | ForEach-Object { 
    $vmId =  $_.resourceId 
    $split = $vmId -split "/"; 
    $subscriptionId = $split[2];  
    $rg = $split[4]; 
    $name = $split[8]; 

    Write-Output ("Subscription Id: " + $subscriptionId) 
    $mute = Set-AzContext -Subscription $subscriptionId 
    $vm = Get-AzVM -ResourceGroupName $rg -Name $name -Status -DefaultProfile $mute 
    $state = ($vm.Statuses[1].DisplayStatus -split " ")[1] 
    if($state -in $startableStates) { 
        Write-Output "Starting '$($name)' ..." 
        $newJob = Start-ThreadJob -ScriptBlock { param($resource, $vmname, $sub) $context = Set-AzContext -Subscription $sub; Start-AzVM -ResourceGroupName $resource -Name $vmname -DefaultProfile $context} -ArgumentList $rg, $name, $subscriptionId 
        $jobIDs.Add($newJob.Id) 
    } else { 
        Write-Output ($name + ": no action taken. State: " + $state)  
    } 
} 

$jobsList = $jobIDs.ToArray() 
if ($jobsList) 
{ 
    Write-Output "Waiting for machines to finish starting..." 
    Wait-Job -Id $jobsList 
} 
foreach($id in $jobsList) 
{ 
    $job = Get-Job -Id $id 
    if ($job.Error) 
    { 
        Write-Output $job.Error 
    } 
} 

Добавление веб-перехватчиков

Добавьте веб-перехватчики в приведенные выше опубликованные модули Runbook и скопируйте URL-адреса веб-перехватчиков.

Примечание.

Скопируйте URL-адрес после создания веб-перехватчика, так как вы не сможете получить URL-адрес еще раз.

Создание подписки на события

  1. Войдите в портал Azure и перейдите в Диспетчер обновлений Azure.

  2. В разделе "Управление" выберите "Компьютеры", "Конфигурация обслуживания".

  3. На странице "Конфигурация обслуживания" выберите конфигурацию.

  4. В разделе "Параметры" выберите "События".

    Снимок экрана: параметры для выбора параметра меню событий.

  5. Выберите +Подписка на события событий, чтобы создать событие предварительного или последующего обслуживания.

    Снимок экрана: параметры выбора подписок на события.

  6. На странице "Создание подписки на события" введите следующие сведения:

    1. В разделе "Сведения о подписке на события" укажите соответствующее имя.
    2. Сохраните схему как схему сетки событий.
    3. В разделе "Типы событий" отфильтруйте типы событий.
      1. Выберите событие предварительного обслуживания для предварительного события.
        • В разделе сведений о конечной точке выберите конечную точку веб-перехватчика и выберите "Настроить конечную точку".
        • Укажите соответствующие сведения, такие как URL-адрес веб-перехватчика предварительного события для активации события.
      2. Выберите событие после обслуживания для события после выполнения.
        • В разделе "Сведения о конечной точке" конечная точка веб-перехватчика и выберите "Настроить конечную точку".
        • Укажите соответствующие сведения, такие как URL-адрес веб-перехватчика после события, чтобы активировать событие. Снимок экрана: параметры для создания подписок на события.
  7. Нажмите кнопку создания.

Следующие шаги