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.

Pre-eventi e post-eventi, noti anche come pre-script e post-script, consentono di eseguire azioni definite dagli utenti prima e dopo l’installazione di patch di pianificazione. Uno degli scenari più comuni consiste nell’avviare e arrestare una macchina virtuale. Con i pre-eventi, è possibile eseguire uno script di prepatching per avviare la macchina virtuale prima di avviare il processo di applicazione di patch di pianificazione. Una volta completata l’applicazione di patch di pianificazione e dopo il riavvio del server, è possibile eseguire uno script di post-applicazione di patch per arrestare in modo sicuro la macchina virtuale.

Questa esercitazione illustra come creare pre-eventi e post-eventi per avviare e arrestare una macchina virtuale in un flusso di lavoro di patch di pianificazione 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 la procedura descritta in Assegnare i ruoli di Azure usando il portale di Azure per assegnare le autorizzazioni


  1. Importare il modulo Az.ResourceGraph, assicurarsi che il modulo venga 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 all’account di Automazione di Azure

  2. Creare e Pubblicare un runbook di Automazione.

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

    1. Per i runbook, analizzare il payload del webhook per assicurarsi che venga attivato solo in caso di 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" -and $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 o 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 computer.
      • Vedere le autorizzazioni correlate alle query di Resource Graph
      • Vedere il ruolo Collaboratore delle macchine virtuali.
      • Vedere il codice elencato di seguito:
    3. Vedere 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 eseguire una personalizzazione, è possibile usare gli script esistenti con le modifiche precedenti eseguite 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 Computer, Configurazione di manutenzione.

  3. Nella pagina Configurazione di manutenzione, selezionare la configurazione.

  4. In Impostazioni, selezionare Eventi.

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

  5. Selezionare Crea sottoscrizione di eventi per creare un pre-evento/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 eventi, Filtrare in base ai tipi di eventi.
      1. Selezionare Pre-evento di manutenzione per un pre-evento.
        • Nella sezione Dettagli endpoint, selezionare l’endpoint del webhook e selezionare Configura un endpoint.
        • Specificare i dettagli appropriati, ad esempio l’URL del webhook del pre-evento per attivare l’evento.
      2. Selezionare Post-evento di manutenzione per un post-evento.
        • Nella sezione Dettagli endpoint, l’endpoint del webhook e selezionare Configura un endpoint.
        • Specificare i dettagli appropriati, ad esempio l’URL del webhook del post-evento per attivare l’evento. Screenshot che mostra le opzioni per creare le sottoscrizioni di eventi.
  7. Seleziona Crea.

Passaggi successivi