Partilhar via


Tutorial: Criar pré-eventos e pós-eventos utilizando um webhook com Automação

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

Os eventos pré e pós, também conhecidos como pré/pós-scripts, permitem executar ações definidas pelo usuário antes e depois da instalação do patch programado. Um dos cenários mais comuns é iniciar e parar uma máquina virtual (VM). Com pré-eventos, pode-se executar um script de pré-patch para iniciar a VM antes de começar o processo de agendamento de aplicação de patches. Quando a atualização de agendamento estiver concluída e o servidor for reiniciado, um script de pós-atualização poderá ser executado para desligar a VM com segurança.

Este tutorial explica como criar eventos anteriores e posteriores para iniciar e parar uma VM num fluxo de trabalho de atualização agendada através de um webhook.

Neste tutorial, irá aprender a:

  • Pré-requisitos
  • Criar e publicar manual de execução de automação
  • Adicionar webhooks
  • Criar uma subscrição de evento

Pré-requisitos

  1. Verifique se você está usando o runbook do PowerShell 7.2 .

  2. Atribuir permissão a identidades gerenciadas - Você pode atribuir permissões à identidade gerenciada apropriada. O runbook pode usar a identidade gerenciada atribuída pelo sistema de conta de automação ou uma identidade gerenciada atribuída pelo usuário.

    Você pode usar cmdlets do portal ou do PowerShell para atribuir permissões a cada identidade:

    Siga as etapas em Atribuir funções do Azure usando o portal do Azure para atribuir permissões


  1. Importe o Az.ResourceGraph módulo, certifique-se de que o módulo está atualizado para ThreadJob com o módulo versão 2.0.3.

Criar e publicar livro de operações de automação

  1. Entre no portal do Azure e vá para sua conta de Automação do Azure

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

  3. Se você estava usando Runbooks que estavam sendo usados para pré ou pós-tarefas no Azure Automation Update Management, é fundamental seguir as etapas abaixo para evitar um impacto inesperado em suas máquinas e execuções de manutenção com falha.

    1. Para os seus runbooks, interprete a carga útil do webhook para garantir que seja desencadeada somente nos eventos Microsoft.Maintenance.PreMaintenanceEvent ou Microsoft.Maintenance.PostMaintenanceEvent. Por configuração, webhooks são acionados em outros eventos de subscrição se qualquer outro evento for adicionado com o mesmo endpoint.

      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 , que contém informações sobre a lista de máquinas na implantação da atualização, não será passado para os scripts pré ou pós quando você usá-los para eventos pré ou pós ao usar o 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.
      • Veja as permissões relacionadas às consultas de gráfico de recursos
      • Consulte Função de colaborador de máquinas virtuais.
      • Veja o código listado abaixo:
    3. Ver carga útil do webhook

      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. Para personalizar, você pode usar seus scripts existentes com as modificações acima feitas ou usar os scripts a seguir.

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 acima e copie os URLs dos webhooks.

Nota

Certifique-se de copiar o URL depois de criar um webhook, pois não é possível recuperá-lo novamente.

Criar uma subscrição de evento

  1. Entre no portal do Azure e vá para o Azure Update Manager.

  2. Em Gerir, selecione Máquinas, Configuração de manutenção.

  3. Na página Configuração de Manutenção, selecione a configuração preferida.

  4. Em Configurações, selecione Eventos.

    Captura de tela que mostra as opções para selecionar a opção do menu de eventos.

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

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

  6. Na página Criar Subscrição de Eventos , introduza os seguintes detalhes:

    1. Na seção Detalhes da Assinatura do Evento, forneça um nome apropriado.
    2. Mantenha o esquema como Esquema de Grade de Eventos.
    3. Na seção Tipos de Evento, Filtre para Tipos de Evento.
      1. Selecione Pre Maintenance Event para um pré-evento.
        • Na seção Detalhes do ponto de extremidade, selecione o ponto de extremidade Webhook e selecione Configurar um ponto de extremidade.
        • Forneça os detalhes apropriados, como URL de webhook pré-evento para acionar o evento.
      2. Selecione Evento de Pós-Manutenção para um pós-evento.
        • Na seção Detalhes do ponto de extremidade, o ponto de extremidade Webhook e selecione Configurar um ponto de extremidade.
        • Forneça os detalhes apropriados, como URL de webhook pós-evento para disparar o evento. Captura de ecrã que mostra as opções para criar as subscrições de eventos.
  7. Selecione Criar.

Próximos passos