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 VMs ✔️ 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 agendado. Um dos cenários mais comuns é iniciar e parar uma máquina virtual (VM). Com pré-eventos, você pode executar um script de pré-aplicação de patches para iniciar a VM antes de iniciar o processo de aplicação de patches de agendamento. Quando o patch de agendamento estiver concluído e o servidor for reinicializado, um script de pós-aplicação de patches poderá ser executado para desligar a VM com segurança.

Este tutorial explica como criar eventos pré e pós para iniciar e parar uma VM em um fluxo de trabalho de patch de agendamento usando um webhook.

Neste tutorial, irá aprender a:

  • Pré-requisitos
  • Criar e publicar runbook 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 runbook 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 seus runbooks, analise a carga útil do webhook para garantir que ela seja acionada somente nos eventos Microsoft.Maintenance.PreMaintenanceEvent ou Microsoft.Maintenance.PostMaintenanceEvent . Por design, webhooks são acionados em outros eventos de assinatura se qualquer outro evento for adicionado com o mesmo ponto de extremidade.

      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 amostra

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.

  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 Pré-evento de manutenção 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 disparar o evento.
      2. Selecione Pós-evento de 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