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


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

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

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

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

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

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

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

  1. Убедитесь, что вы используете рабочую книгу PowerShell 7.2.

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

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

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


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

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

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

  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. Нажмите кнопку создания.

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