Condividi tramite


Tutorial: Creare eventi pre e post usando un webhook con Automazione

Si applica a: ✔️ Macchine virtuali Windows ✔️ Macchine virtuali Linux ✔️ Ambiente locale ✔️ Macchine virtuali Azure ✔️ Server abilitati per Azure Arc.

I pre- eventi e post-eventi, noti anche come pre-script/post-script, consentono di eseguire azioni definite dall'utente prima e dopo l'installazione della patch di pianificazione. Uno degli scenari più comuni consiste nell'avviare e arrestare una macchina virtuale. Con gli eventi pre, è possibile eseguire uno script di applicazione preliminare di patch per avviare la macchina virtuale prima di avviare il processo di applicazione delle patch di pianificazione. Una volta completata l'applicazione delle patch di pianificazione e riavviato il server, è possibile eseguire uno script dopo l'applicazione delle patch per arrestare in modo sicuro la macchina virtuale.

Questa esercitazione spiega come creare pre-eventi e post-eventi per avviare e arrestare una macchina virtuale in un flusso di lavoro di pianificazione delle patch usando un webhook.

In questa esercitazione apprenderai a:

  • Prerequisiti
  • Creare e pubblicare runbook di Automazione
  • Aggiungere webhook
  • Creare una sottoscrizione di eventi

Prerequisiti

  1. Assicurarsi di usare il runbook di PowerShell 7.2.

  2. Assegnare l'autorizzazione alle identità gestite: è possibile assegnare autorizzazioni all'identità gestita appropriata. Il runbook può usare l'identità gestita assegnata dal sistema dell'account di Automazione o un'identità gestita assegnata dall'utente.

    È possibile usare il portale o i cmdlet di PowerShell per assegnare autorizzazioni a ogni identità:

    Seguire i passaggi descritti in Assegnare i ruoli di Azure usando il portale di Azure per assegnare le autorizzazioni


  1. Importare il modulo Az.ResourceGraph, verificare che il modulo sia aggiornato a ThreadJob con la versione 2.0.3 del modulo.

Creare e pubblicare runbook di Automazione

  1. Accedere al portale di Azure e passare al proprio account di Automazione di Azure.

  2. Creare e pubblicare un runbook di Automazione.

  3. Se si usano runbook impiegati per pre-attività o post-attività in Gestione aggiornamenti di Automazione di Azure, è fondamentale seguire questa procedura per evitare conseguenze impreviste sui computer e sulle esecuzioni di manutenzione non riuscite.

    1. Per i runbook, analizzare il payload del webhook per assicurarsi che venga attivato solo con gli eventi Microsoft.Maintenance.PreMaintenanceEvent o Microsoft.Maintenance.PostMaintenanceEvent. Per impostazione predefinita, i webhook vengono attivati in altri eventi di sottoscrizione se viene aggiunto qualsiasi altro evento con lo stesso endpoint.

      param 
      
      (  
        [Parameter(Mandatory=$false)]  
      
        [object] $WebhookData  
      
      )  
      $notificationPayload = ConvertFrom-Json -InputObject $WebhookData.RequestBody  
      $eventType = $notificationPayload[0].eventType  
      
      if ($eventType -ne “Microsoft.Maintenance.PreMaintenanceEvent” -or $eventType –ne “Microsoft.Maintenance.PostMaintenanceEvent” ) {  
        Write-Output "Webhook not triggered as part of pre or post patching for maintenance run"  
      return  
      } 
      
    2. Il parametro SoftwareUpdateConfigurationRunContext, che contiene informazioni sull'elenco di computer nella distribuzione degli aggiornamenti, non verrà passato ai pre-script i post-script quando vengono usati per pre-eventi o post-eventi durante l'uso del webhook di automazione. È possibile eseguire una query sull'elenco dei computer da Azure Resource Graph o visualizzare l'elenco dei computer codificati negli script.

      • Assicurarsi che i ruoli e le autorizzazioni appropriati vengano concessi alle identità gestite in uso nello script, per eseguire query di Resource Graph e avviare o arrestare i computer.
      • Visualizzare le autorizzazioni correlate alle query di Resource Graph.
      • Vedere Ruolo Collaboratore macchine virtuali.
      • Vedere il codice riportato di seguito:
    3. Visualizzare il payload del 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. Per personalizzare è possibile usare gli script esistenti apportandovi le modifiche precedenti o usare gli script seguenti.

Script di esempio

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

Aggiungere webhook

Aggiungere webhook ai runbook pubblicati sopra e copiare gli URL dei webhook.

Nota

Assicurarsi di copiare l'URL dopo aver creato un webhook perché non è possibile recuperare nuovamente l'URL.

Creare una sottoscrizione di eventi

  1. Accedere al portale di Azure e passare a Gestore aggiornamenti di Azure.

  2. In Gestisci, selezionare Macchine virtuali, Configurazioni manutenzione.

  3. Nella pagina Configurazione manutenzione selezionare la configurazione.

  4. In Impostazioni selezionare Eventi.

    Screenshot che mostra le opzioni per selezionare l'opzione di menu Eventi.

  5. Selezionare +Sottoscrizione di eventi per creare un pre-evento e un post-evento di manutenzione.

    Screenshot che mostra le opzioni per selezionare le sottoscrizioni degli eventi.

  6. Nella pagina Crea sottoscrizione di eventi immettere i dettagli seguenti:

    1. Nella sezione Dettagli sottoscrizione eventi specificare un nome appropriato.
    2. Mantenere lo schema come schema di Griglia di eventi.
    3. Nella sezione Tipi di evento, selezionare Filtra in base ai tipi di evento.
      1. Selezionare Pre-evento manutenzione per un pre-evento.
        • Nella sezione Dettagli endpoint selezionare l'endpoint per Webhook e selezionare Configura endpoint.
        • Specificare i dettagli appropriati, ad esempio l'URL del webhook pre-evento per attivare l'evento.
      2. Selezionare Post-evento manutenzione per un post-evento.
        • Nella sezione Dettagli endpoint selezionare l'endpoint per Webhook e selezionare Configura endpoint.
        • Specificare i dettagli appropriati, ad esempio l'URL del webhook post-evento per attivare l'evento. Screenshot che mostra le opzioni per creare le sottoscrizioni degli eventi.
  7. Seleziona Crea.

Passaggi successivi