Didacticiel : Créer des pré-/post-événements à l’aide d’un webhook avec Automation
S’applique à : ✔️ Machines virtuelles Windows ✔️ Machines virtuelles Linux ✔️ Environnement local ✔️ Machines virtuelles Azure ✔️ Serveurs compatibles avec Azure Arc.
Les pré-événements et post-événements, également connus en tant que pré ou post-scripts, vous permettent d’exécuter des actions définies par l’utilisateur avant et après l’installation planifiée du correctif. L’un des scénarios les plus courants consiste à démarrer et à arrêter une machine virtuelle. Avec les pré-événements, vous pouvez exécuter un script de pré-mise à jour corrective pour démarrer la machine virtuelle avant d'initier le processus de mise à jour corrective de la planification. Une fois la programmation des correctifs terminée et le serveur redémarré, un script de post-mise à jour corrective peut être exécuté pour arrêter la machine virtuelle en toute sécurité.
Ce tutoriel explique comment créer des événements avant et après le démarrage et l'arrêt d'une machine virtuelle dans un flux de travail de correctifs programmés à l'aide d'un webhook.
Dans ce tutoriel, vous allez apprendre à :
- Prérequis
- Créer et publier un runbook Azure Automation
- Ajouter des webhooks
- Créer un abonnement d’événement
Prérequis
Vérifiez que vous utilisez le runbook PowerShell 7.2.
Attribuer l’autorisation aux identités managées : vous pouvez attribuer des autorisations à l’identité managée appropriée. Le runbook peut utiliser l’identité managée affectée par le système du compte Automation ou une identité managée affectée par l’utilisateur.
Vous pouvez utiliser le portail ou les cmdlets PowerShell pour attribuer des autorisations à chaque identité :
Effectuez les étapes dans Attribuer des rôles Azure à l’aide du Portail Microsoft Azure pour attribuer des autorisations
- Importez le module
Az.ResourceGraph
, vérifiez que le module est mis à jour vers ThreadJob avec le module version 2.0.3.
Créer et publier un runbook Azure Automation
Connectez-vous au Portail Microsoft Azure et accédez à votre compte Azure Automation
Si vous utilisiez des Runbooks utilisés pour les tâches antérieures ou postérieures dans Azure Automation Update Management, il est essentiel que vous suiviez les étapes ci-dessous pour éviter un impact inattendu sur vos machines et les exécutions de maintenance ayant échoué.
Pour vos runbooks, analysez la charge utile du webhook pour vous assurer qu’elle se déclenche uniquement sur les événements Microsoft.Maintenance.PreMaintenanceEvent ou Microsoft.Maintenance.PostMaintenanceEvent. Par conception, les webhooks sont déclenchés sur d'autres événements d'abonnement si un autre événement est ajouté avec le même point de terminaison.
- Consultez le Schéma d’événement Azure Event Grid.
- Consultez le Schéma Event Grid spécifique aux configurations de maintenance
- Consultez le code répertorié ci-dessous :
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 }
Le paramètre SoftwareUpdateConfigurationRunContext, qui contient des informations sur la liste des machines dans le déploiement de mise à jour ne sera pas transmis aux scripts de pré ou de publication lorsque vous les utilisez pour les événements de pré ou de publication lors de l’utilisation du webhook Automation. Vous pouvez soit interroger la liste des machines à partir d'Azure Resource Graph, soit coder la liste des machines dans les scripts.
- Assurez-vous que les rôles et autorisations appropriés sont accordés aux identités gérées que vous utilisez dans le script, pour exécuter les requêtes Resource Graph et pour démarrer ou arrêter les machines.
- Voir les autorisations relatives aux requêtes de graphe de ressources
- Consultez Rôle contributeur de machines virtuelles.
- Consultez le code répertorié ci-dessous :
Consultez charge utile de 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 } }
Pour la personnalisation, vous pouvez utiliser soit vos scripts existants auxquels vous ajouterez les modifications susmentionnées, soit les scripts suivants.
Exemples de scripts
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
}
}
Ajouter des webhooks
Ajoutez des webhooks aux runbooks publiés ci-dessus et copiez les URL des webhooks.
Remarque
Veillez à copier l'URL après avoir créé un webhook, car vous ne pourrez plus la récupérer.
Créez un abonnement à un Événement
Connectez-vous au Portail Microsoft Azure et accédez à votre Azure Update Manager.
Sous Gérer, sélectionnez Machines, Configuration de maintenance.
Dans la page Configuration de la maintenance, sélectionnez la configuration.
Sous Paramètres, sélectionnez Événements.
Sélectionnez +Abonnement aux événements pour créer un événement de pré/post-maintenance.
Dans la page Créer un abonnement aux événements, entrez les détails suivantes :
- Dans la section Détails des abonnements aux événements, indiquez un nom approprié.
- Conservez Schéma Event Grid comme schéma.
- Dans la section Types d’événements, Filtrer sur les types d’événements.
- Sélectionnez Événement de pré-maintenance pour un pré-événement.
- Dans la section Détails du point de terminaison, sélectionnez le point de terminaison Webhook, puis Configurer un point de terminaison.
- Fournissez les détails appropriés, tels que l’URL du webhook pré-événement pour déclencher l’événement.
- Sélectionnez Événement de post-maintenance pour un post-événement.
- Sélectionnez Événement de pré-maintenance pour un pré-événement.
Sélectionnez Create (Créer).
Étapes suivantes
- En savoir plus sur la vue d’ensemble des pré- et post-événements dans le Gestionnaire de mise à jour Azure.
- En savoir plus sur la création des pré- et post-événements
- Pour savoir comment gérer des pré-événements et des post-événements ou annuler une exécution de planification, consultez Pré-événements et post-événements de la configuration de la maintenance.
- En savoir plus sur comment créer des pré-événements et des post-événements à l’aide d’Azure Functions.