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


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

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

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

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

Изучив это руководство, вы:

  • Создайте и опубликуйте runbook службы автоматизации Azure.
  • Добавьте веб-перехватчики.
  • Создайте подписку на события.

Предварительные условия

  1. Убедитесь, что вы используете руководство PowerShell Runbook 7.4.

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

    В следующих примерах скриптов (запуск и остановка виртуальных машин) требуется роль участника виртуальной машины или пользовательская роль с этими конкретными разрешениями:

    • Microsoft.Compute/virtualMachines/start/action
    • Microsoft.Compute/virtualMachines/deallocate/action
    • Microsoft.Compute/виртуальныеМашины/перезапуск/действие
    • Microsoft.Compute/virtualMachines/powerOff/action

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

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


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

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

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

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

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

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

    2. Параметр SoftwareUpdateConfigurationRunContext содержит сведения о списках компьютеров в развертывании обновления. Он не будет передан в сценарии при их использовании для предварительных мероприятий по техническому обслуживанию или мероприятий после технического обслуживания при использовании вебхука автоматизации. Вы можете запросить список компьютеров из Azure Resource Graph или получить список компьютеров, закодированных в скриптах.

      • Убедитесь, что соответствующие роли и разрешения предоставляются управляемым удостоверениям, которые вы используете в скрипте, для выполнения запросов Resource Graph и запуска или остановки компьютеров.

      • Ознакомьтесь с разрешениями, связанными с запросами Resource Graph.

      • См. роль участника виртуальной машины.

      • См. полезную нагрузку вебхука.

      • См. следующий код:

        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    
        }
        }
        

Для настройки можно использовать существующие скрипты с предыдущими изменениями или использовать следующие скрипты.

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

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. На панели "Создание подписки на события" в разделе "Сведения о подписке на события " укажите соответствующее имя. Сохраните схему как схему сетки событий.

  7. В разделе "Типы событий " для фильтрации по типам событий выберите событие предварительного обслуживания или событие после обслуживания.

  8. В разделе "Сведения о конечной точке" выберите конечную точку веб-перехватчика , а затем выберите "Настроить конечную точку".

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

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

  10. Нажмите кнопку создания.