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
Assicurarsi di usare il runbook di PowerShell 7.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
- 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
Accedere al portale di Azure e passare all’account di Automazione di Azure
Creare e Pubblicare un runbook di Automazione.
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.
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.
- Vedere lo schema di eventi di Griglia di eventi di Azure.
- Vedere lo schema di Griglia di eventi specifico delle configurazioni di manutenzione
- Vedere il codice elencato di seguito:
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 }
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:
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 } }
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
Accedere al portale di Azure e passare a Gestore aggiornamenti di Azure.
In Gestisci, selezionare Computer, Configurazione di manutenzione.
Nella pagina Configurazione di manutenzione, selezionare la configurazione.
In Impostazioni, selezionare Eventi.
Selezionare Crea sottoscrizione di eventi per creare un pre-evento/post-evento di manutenzione.
Nella pagina Crea sottoscrizione di eventi immettere i dettagli seguenti:
- Nella sezione Dettagli sottoscrizione eventi specificare un nome appropriato.
- Mantenere lo schema come schema di Griglia di eventi.
- Nella sezione Tipi di eventi, Filtrare in base ai tipi di eventi.
- 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.
- Selezionare Post-evento di manutenzione per un post-evento.
- Selezionare Pre-evento di manutenzione per un pre-evento.
Seleziona Crea.
Passaggi successivi
- Altre informazioni sulla panoramica dei pre-eventi e post-eventi in Gestore aggiornamenti di Azure.
- Altre informazioni su Come creare pre-eventi e post-eventi
- Per informazioni su come gestire pre-eventi e post-eventi o annullare un’esecuzione pianificata, vedere Pre-eventi e post-eventi di configurazione di manutenzione.
- Altre informazioni su Come creare pre-eventi e post-eventi usando Funzioni di Azure.