Compartir a través de


Tutorial: Creación de eventos previos y posteriores mediante un webhook con Automatización

Se aplica a: ✔️ VM de Windows ✔️ VM de Linux ✔️ Entorno local ✔️ VM de Azure ✔️ Servidores habilitados para Azure Arc.

Los eventos previos y posteriores, también conocidos como scripts previos o posteriores, permiten ejecutar acciones definidas por el usuario antes y después de la instalación de revisiones programadas. Uno de los escenarios más comunes es iniciar y detener una máquina virtual (VM). Con los eventos previos, puede ejecutar un script de aprovisionamiento previo para iniciar la máquina virtual antes de iniciar el proceso de aplicación de revisiones de programación. Una vez completada la aplicación de revisiones de programación y se reinicia el servidor, se puede ejecutar un script posterior a la aplicación de revisiones para apagar la máquina virtual de forma segura.

En este tutorial se explica cómo crear eventos previos y posteriores para iniciar y detener una máquina virtual en un flujo de trabajo de revisión de programación mediante un webhook.

En este tutorial, aprenderá a:

  • Requisitos previos
  • Creación y publicación del runbook de Automation
  • Agregar webhooks
  • Creación de una suscripción a evento

Requisitos previos

  1. Asegúrese de que usa un runbook de PowerShell 7.2.

  2. Asignación de permisos a identidades administradas: puede asignar permisos a la identidad administrada adecuada. El runbook puede usar la identidad administrada asignada por el sistema de la cuenta de Automation o una identidad administrada asignada por el usuario.

    Puede usar cmdlets de PowerShell o del portal para asignar permisos a cada identidad:

    Siga los pasos de Asignación de roles de Azure mediante Azure Portal para asignar privilegio


  1. Importe el módulo Az.ResourceGraph, asegúrese de que el módulo se actualiza a ThreadJob con la versión 2.0.3 del módulo.

Creación y publicación del runbook de Automation

  1. Inicie sesión en Azure Portal y vaya a la cuenta de Azure Automation

  2. Creación y publicación de un runbook de Automation.

  3. Si estaba usando Runbooks que se usaban para tareas previas o posteriores en Update Management de Azure Automation, es fundamental seguir los pasos siguientes para evitar un impacto inesperado en las máquinas y las ejecuciones de mantenimiento con errores.

    1. Para los runbooks, analice la carga del webhook para asegurarse de que solo se desencadena en eventos Microsoft.Maintenance.PreMaintenanceEvent o microsoft.Maintenance.PostMaintenanceEvent solo. Por diseño, los webhooks se desencadenan en otros eventos de suscripción si se agrega algún otro evento con el mismo punto de conexión.

      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. El parámetro SoftwareUpdateConfigurationRunContext, que contiene información sobre la lista de máquinas de la implementación de actualizaciones, no se pasará a los scripts previos o posteriores cuando los use para eventos previos o posteriores mientras usa webhook de automatización. Puede consultar la lista de máquinas de Azure Resource Graph o tener la lista de máquinas codificadas en los scripts.

      • Asegúrese de que se conceden roles y permisos adecuados a las identidades administradas que usa en el script para ejecutar consultas de Resource Graph y para iniciar o detener máquinas.
      • Consulte los permisos relacionados con las consultas de gráfico de recursos
      • Consulte rol de colaborador de máquinas virtuales.
      • Consulte los códigos que aparecen a continuación:
    3. Consulte carga útil de webhooks

      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. Para personalizar, puede usar los scripts existentes con las modificaciones anteriores realizadas o usar los siguientes scripts.

Muestras 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 
    } 
} 

Agregar webhooks

Agregue webhooks a los runbooks publicados anteriores y copie las direcciones URL de webhooks.

Nota:

Asegúrese de copiar la dirección URL después de crear un webhook, ya que no puede recuperar la dirección URL de nuevo.

Cree una suscripción a un evento

  1. Inicie sesión en Azure Portal y vaya a su Administrador de actualizaciones de Azure.

  2. En Administrar, seleccione Máquinas, Configuración de mantenimiento.

  3. En la página Configuración de mantenimiento, seleccione la configuración.

  4. En Configuración, seleccione Eventos.

    Captura de pantalla de las opciones para seleccionar la opción de menú de eventos.

  5. Seleccione +Suscripción de eventos para crear un evento previo y posterior al mantenimiento.

    Captura de pantalla de las opciones para seleccionar las suscripciones de eventos.

  6. En la página Crear suscripción de eventos, escriba los siguientes detalles:

    1. En la sección Detalles de la suscripción de eventos, proporcione un nombre adecuado.
    2. Mantenga el esquema como Esquema de Event Grid.
    3. En la sección Tipos de evento, Filtro para tipos de evento.
      1. Seleccione Eventos previos al mantenimiento para un evento previo.
        • En la sección Detalles del punto de conexión, seleccione el punto de conexión webhook y seleccione Configurar y punto de conexión.
        • Proporcione los detalles adecuados, como la dirección URL del webhook previo al evento para desencadenar el evento.
      2. Seleccione Eventos posteriores al mantenimiento para un evento posterior.
        • En la sección Detalles del punto de conexión, el punto de conexión webhook y seleccione Configurar y punto de conexión.
        • Proporcione los detalles adecuados, como la dirección URL del webhook posterior al evento para desencadenar el evento. Captura de pantalla de las opciones para crear las suscripciones de eventos.
  7. Seleccione Crear.

Pasos siguientes