Partager via


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

  1. Vérifiez que vous utilisez le runbook PowerShell 7.2.

  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


  1. 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

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

  2. Créer et Publier un runbook Azure Automation.

  3. 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é.

    1. 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.

      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  
      } 
      
    2. 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 :
    3. 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    
      }
      }
      
    4. Pour la personnalisation, vous pouvez utiliser soit vos scripts existants avec les modifications ci-dessus, 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

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

  2. Sous Gérer, sélectionnez Machines, Configuration de maintenance.

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

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

    Capture d’écran montrant les options permettant de sélectionner l’option menu des événements.

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

    Capture d’écran montrant les options permettant de sélectionner des abonnements aux événements.

  6. Dans la page Créer un abonnement aux événements, entrez les détails suivantes :

    1. Dans la section Détails des abonnements aux événements, indiquez un nom approprié.
    2. Conservez Schéma Event Grid comme schéma.
    3. Dans la section Types d’événements, Filtrer sur les types d’événements.
      1. 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 et point de terminaison.
        • Fournissez les détails appropriés, tels que l’URL du webhook pré-événement pour déclencher l’événement.
      2. Sélectionnez Événement de post-maintenance pour un post-événement.
        • Dans la section Détails du point de terminaison, le point de terminaison Webhook, puis Configurer et point de terminaison.
        • Fournissez les détails appropriés, tels que l’URL du webhook post-événement pour déclencher l’événement. Capture d’écran montrant les options permettant de créer des abonnements aux événements.
  7. Sélectionnez Create (Créer).

Étapes suivantes

Découvrez comment gérer plusieurs machines.