Partager via


Tutoriel : Créer des événements de pré-maintenance et de post-maintenance à l’aide d’un webhook avec des runbooks Automation

S’applique à : ✔️ Machines virtuelles Windows ✔️ Machines virtuelles Linux ✔️ Environnement local ✔️ Machines virtuelles Azure ✔️ Serveurs compatibles avec Azure Arc.

Vous pouvez utiliser des événements de pré-maintenance et de post-maintenance pour exécuter des actions définies par l’utilisateur avant et après l’installation planifiée des correctifs. L’un des scénarios les plus courants consiste à démarrer et à arrêter une machine virtuelle. Avec les événements de pré-maintenance, vous pouvez exécuter un script pour démarrer la machine virtuelle avant de lancer le processus de mise à jour corrective planifiée. Une fois la mise à jour corrective planifiée terminée et que le serveur est redémarré, vous pouvez exécuter un script pour arrêter la machine virtuelle en toute sécurité.

Ce tutoriel explique comment créer des événements de pré-maintenance et de post-maintenance pour démarrer et arrêter une machine virtuelle dans un workflow de correctif planifié à l’aide d’un webhook.

Dans ce tutoriel, vous allez :

  • Créez et publiez un runbook Azure Automation.
  • Ajoutez des webhooks.
  • Créez un abonnement aux événements.

Prérequis

  1. Assurez-vous que vous utilisez un runbook PowerShell 7.4.

  2. Affectez des autorisations à l’identité managée appropriée. Le runbook peut utiliser l’identité managée attribuée par le système du compte Automation ou une identité managée attribuée par l’utilisateur.

    Les exemples de script suivants (démarrage et arrêt de machines virtuelles) nécessitent le rôle Contributeur de machine virtuelle ou un rôle personnalisé avec ces autorisations spécifiques :

    • Microsoft.Compute/virtualMachines/start/action
    • Microsoft.Compute/virtualMachines/deallocate/action
    • Microsoft.Compute/virtualMachines/restart/action
    • Microsoft.Compute/virtualMachines/powerOff/action

    Vous pouvez utiliser le portail Azure ou les applets de commande Azure PowerShell pour attribuer des autorisations à chaque identité :

    Pour attribuer des autorisations, suivez les étapes décrites dans Affecter des rôles Azure à l’aide du portail Azure.


  1. Importez le Az.ResourceGraph module. Vérifiez que le module est mis à jour vers ThreadJob avec le module version 2.0.3.

Créer et publier un runbook d'automatisation

  1. Connectez-vous au portail Azure et accédez à votre compte Azure Automation .

  2. Créez et publiez un runbook d'automatisation.

  3. Si vous avez utilisé des runbooks pour les tâches de pré-maintenance et de post-maintenance dans Azure Automation Update Management, il est essentiel d’utiliser les étapes suivantes pour éviter un impact inattendu sur vos machines et les exécutions de maintenance ayant échoué :

    1. Pour vos runbooks, analysez la charge utile du webhook pour vous assurer qu’elle se déclenche uniquement sur des événements Microsoft.Maintenance.PreMaintenanceEvent ou Microsoft.Maintenance.PostMaintenanceEvent. Par définition, 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 suivant :

        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. Le paramètre SoftwareUpdateConfigurationRunContext contient des informations sur les listes de machines dans le déploiement de mise à jour. Il ne sera pas transmis aux scripts lorsque vous les utilisez pour les événements d'avant maintenance ou d'après maintenance lors de l’utilisation d’un webhook d'automatisation. 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.

      • Consultez les autorisations relatives aux requêtes Resource Graph.

      • Consultez le Rôle Contributeur de machines virtuelles.

      • Consultez la charge utile du webhook.

      • Consultez le code suivant :

        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 personnaliser, vous pouvez utiliser vos scripts existants avec les modifications précédentes ou utiliser 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 précédemment et copiez les URL des webhooks.

Remarque

Veillez à copier l’URL après avoir créé un webhook. Vous ne pouvez plus récupérer l’URL.

Créer un abonnement d’événement

  1. Connectez-vous au Portail Microsoft Azure et accédez à Azure Update Manager.

  2. Sous Gérer, sélectionnezConfiguration de maintenance>.

  3. Dans le volet Configuration de maintenance, sélectionnez la configuration.

  4. Sous Paramètres, sélectionnez Événements.

    Capture d’écran montrant l’option de menu pour les événements.

  5. Sélectionnez +Abonnement aux événements pour créer un événement de pré-maintenance ou de post-maintenance.

    Capture d’écran montrant les abonnements aux événements avec l’option permettant de créer un abonnement aux événements.

  6. Dans le volet Créer un abonnement aux événements, dans la section Détails de l’abonnement aux événements, indiquez un nom approprié. Conservez Schéma Event Grid comme schéma.

  7. Dans la section Types d’événements, pour filtrer les types d’événements, sélectionnez Événement de pré maintenance ou après maintenance.

  8. Dans la section Détails du point de terminaison, sélectionnez le point de terminaison Web Hook , puis configurez un point de terminaison.

  9. Fournissez les détails appropriés, tels que l’URL du webhook de l’événement de pré-maintenance ou de post-maintenance, pour déclencher l’événement.

    Capture d’écran montrant les options de création d’abonnements aux événements.

  10. Sélectionnez Create (Créer).