Partilhar via


Tutorial: Crie eventos pré- e pós-manutenção usando um webhook com runbooks de automação

Aplica-se a: ✔️ VMs do Windows ✔️ VMs Linux ✔️ Ambiente local ✔️ VMs do Azure ✔️ Servidores habilitados para Azure Arc.

Pode usar eventos pré-manutenção e pós-manutenção para executar ações definidas pelo utilizador antes e depois da instalação programada do patch. Um dos cenários mais comuns é iniciar e parar uma máquina virtual (VM). Com eventos pré-manutenção, podes executar um script para iniciar a VM antes de iniciar o processo de patch agendado. Depois de a atualização agendada estar concluída e o servidor ser reiniciado, podes executar um script para desligar a VM em segurança.

Este tutorial explica como criar eventos pré-e pós-manutenção para iniciar e parar uma VM num fluxo de trabalho de patch programado, usando um webhook.

Neste tutorial, você:

  • Crie e publique um runbook do Azure Automation.
  • Adicionar webhooks.
  • Crie uma subscrição para o evento.

Pré-requisitos

  1. Certifica-te de que estás a usar um runbook do PowerShell 7.4 .

  2. Atribua permissões à identidade gerenciada apropriada. O runbook pode usar a identidade gerida atribuída pelo sistema da conta de Automação ou uma identidade gerida atribuída pelo utilizador.

    Os seguintes exemplos de scripts (VMs de início e paragem) requerem o papel de Contribuidor da Máquina Virtual ou um papel personalizado com estas permissões específicas:

    • Microsoft.Compute/virtualMachines/start/action
    • Microsoft.Compute/virtualMachines/deslocalizar/ação
    • Microsoft.Compute/máquinas virtuais/reiniciar/ação
    • Microsoft.Compute/virtualMachines/powerOff/action

    Pode usar o portal Azure ou os cmdlets Azure PowerShell para atribuir permissões a cada identidade:

    Para atribuir permissões, siga os passos em Atribuir funções Azure usando o portal Azure.


  1. Importa o Az.ResourceGraph módulo. Certifique-se de que o módulo está atualizado para ThreadJob com a versão 2.0.3 do módulo.

Crie e publique um manual de execução de automação

  1. Inicie sessão no portal Azure e aceda à sua conta Azure Automation .

  2. Crie e publique um runbook de automação.

  3. Caso tenha utilizado runbooks (manuais de operação) para tarefas pré e pós-manutenção no Azure Automation Update Management, é crucial seguir os passos abaixo para evitar um impacto imprevisto nas suas máquinas e operações de manutenção falhadas:

    1. Para os teus runbooks, analisa o payload do webhook para garantir que está configurado para ativar apenas em eventos Microsoft.Maintenance.PreMaintenanceEvent ou Microsoft.Maintenance.PostMaintenanceEvent. Por design, os webhooks são ativados noutros eventos de subscrição se algum outro evento for adicionado com o mesmo endpoint.

      • Consulte o esquema de eventos da Grade de Eventos do Azure.

      • Consulte o esquema da Grelha de Eventos específico para configurações de manutenção.

      • Veja o seguinte código:

        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. O parâmetro SoftwareUpdateConfigurationRunContext contém informações sobre listas de máquinas na implementação da atualização. Não será transmitido aos scripts quando os mesmos forem utilizados para eventos de pré-manutenção ou pós-manutenção ao usares um webhook de Automação. Você pode consultar a lista de máquinas do Azure Resource Graph ou ter a lista de máquinas codificada nos scripts.

      • Certifique-se de que as funções e permissões adequadas sejam concedidas às identidades gerenciadas que você está usando no script, para executar consultas do Gráfico de Recursos e para iniciar ou parar máquinas.

      • Consulte as permissões relacionadas com consultas no Grafo de Recursos.

      • Veja a função de Contribuidor de Máquina Virtual.

      • Veja a carga útil do webhook.

      • Veja o seguinte código:

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

Para personalizar, pode usar os seus scripts existentes com as modificações anteriores ou usar os scripts seguintes.

Scripts de exemplo

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

Adicionar webhooks

Adicione webhooks aos runbooks publicados anteriormente e copie os URLs dos webhooks.

Nota

Certifica-te de copiar o URL depois de criares um webhook. Não podes recuperar o URL outra vez.

Criar uma subscrição de evento

  1. Inicie sessão no portal do Azure e aceda ao Gestor de Atualizações do Azure.

  2. Em Gerir, selecioneConfiguração de Manutenção de >.

  3. No painel de Configuração de Manutenção , selecione a configuração.

  4. Em Configurações, selecione Eventos.

    Captura de ecrã que mostra a opção de menu para eventos.

  5. Selecione +Subscrição de Evento para criar um evento pré-manutenção ou pós-manutenção.

    Captura de ecrã que mostra subscrições de eventos com a opção de criar uma subscrição de evento.

  6. No painel de Criar Subscrição de Evento , na secção Detalhes de Subscrição de Evento , indique um nome apropriado. Mantenha o esquema como Esquema de Grade de Eventos.

  7. Na secção de Tipos de Eventos , para Filtrar para Tipos de Eventos, selecione Evento Pré-Manutenção ou Evento Pós-Manutenção.

  8. Na secção Detalhes do Endpoint , selecione o endpoint Web Hook e depois selecione Configurar um endpoint.

  9. Forneça os detalhes apropriados, como a URL do webhook para ativar o evento pré-manutenção ou pós-manutenção.

    Captura de ecrã que mostra as opções para criar subscrições de eventos.

  10. Selecione Criar.