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
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 i passaggi descritti in Assegnare i ruoli di Azure usando il portale di Azure per assegnare le autorizzazioni
- 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
Accedere al portale di Azure e passare al proprio account di Automazione di Azure.
Creare e pubblicare un runbook di Automazione.
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.
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.
- Vedere Schema di eventi di Griglia di eventi di Azure.
- Vedere lo schema di Griglia di eventi specifico per le configurazioni di manutenzione.
- Vedere il codice riportato di seguito:
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 }
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:
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 } }
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
Accedere al portale di Azure e passare a Gestore aggiornamenti di Azure.
In Gestisci, selezionare Macchine virtuali, Configurazioni manutenzione.
Nella pagina Configurazione manutenzione selezionare la configurazione.
In Impostazioni selezionare Eventi.
Selezionare +Sottoscrizione di eventi per creare un pre-evento e un 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 evento, selezionare Filtra in base ai tipi di evento.
- 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.
- Selezionare Post-evento manutenzione per un post-evento.
- Selezionare Pre-evento 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 i pre- eventi e post-eventi o per annullare un'esecuzione pianificata, vedere Pre-eventi e post-eventi di configurazione di manutenzione.
- Altre informazioni su come creare pre- eventi e post-eventi con Funzioni di Azure.
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per