Compartir a través de


Tutorial: Creación de eventos previos y posteriores al mantenimiento mediante un webhook con runbooks de Automation

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

Puede usar eventos previos y posteriores al mantenimiento para 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 de mantenimiento previo, puede ejecutar un script para iniciar la máquina virtual antes de iniciar el proceso de aplicación de revisiones programada. Una vez completada la aplicación de revisiones programada y reiniciado el servidor, puede ejecutar un script para apagar la máquina virtual de forma segura.

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

En este tutorial, usted hará lo siguiente:

  • Cree y publique un libro de ejecución de Azure Automation.
  • Agregue webhooks.
  • Cree una suscripción de eventos.

Requisitos previos

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

  2. Asigne permisos a la identidad administrada adecuada. El runbook puede usar la identidad administrada asignada por el sistema de la cuenta de automatización o una identidad administrada asignada por el usuario.

    Los siguientes ejemplos de script (inicio y detención de máquinas virtuales) requieren el rol Colaborador de máquina virtual o un rol personalizado con estos permisos específicos:

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

    Puede usar Azure Portal o cmdlets de Azure PowerShell para asignar permisos a cada identidad:

    Para asignar permisos, siga los pasos descritos en Asignación de roles de Azure mediante Azure Portal.


  1. Importe el Az.ResourceGraph módulo. 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 de un runbook de Automation

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

  2. Cree y publique un libro de instrucciones de automatización.

  3. Si ha usado runbooks para tareas previas al mantenimiento y posteriores al mantenimiento en Azure Automation Update Management, es fundamental usar los pasos siguientes para evitar un impacto inesperado en las máquinas y las ejecuciones de mantenimiento con errores:

    1. Para sus runbooks, analice el payload del webhook para asegurarse de que se desencadena solo en eventos de Microsoft.Maintenance.PreMaintenanceEvent o Microsoft.Maintenance.PostMaintenanceEvent. 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.

      • Consulte el Esquema de eventos de Azure Event Grid.

      • Consulte el esquema de Event Grid específico de las configuraciones de mantenimiento.

      • Vea el código siguiente:

        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 contiene información sobre las listas de máquinas de la implementación de actualizaciones. No se pasará a los scripts cuando los use para eventos previos o posteriores al mantenimiento mientras se usa un webhook de Automation. 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 Resource Graph.

      • Consulte el rol de colaborador de Máquina Virtual.

      • Consulte la carga del webhook.

      • Vea el código siguiente:

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

Para personalizarlo, puede usar los scripts existentes con las modificaciones anteriores 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 anteriores publicados y copie las direcciones URL de los webhooks.

Nota:

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

Creación de una suscripción a evento

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

  2. En Administrar, seleccioneConfiguración de mantenimiento>.

  3. En el panel Configuración de mantenimiento , seleccione la configuración.

  4. En Configuración, seleccione Eventos.

    Captura de pantalla que muestra la opción de menú para eventos.

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

    Captura de pantalla que muestra las suscripciones de eventos con la opción para crear una suscripción de eventos.

  6. En el panel Crear suscripción de eventos , en la sección Detalles de la suscripción de eventos, proporcione un nombre adecuado. Mantenga el esquema como Esquema de Event Grid.

  7. En la sección Tipos de eventos , en Filtrar a tipos de eventos, seleccione Evento de mantenimiento previo o Evento posterior al mantenimiento.

  8. En la sección Detalles del punto de conexión, seleccione el punto de conexión de Web Hook y, a continuación, seleccione Configurar un punto de conexión.

  9. Proporcione los detalles adecuados, como la dirección URL de webhook del evento de mantenimiento previo o posterior al mantenimiento para desencadenar el evento.

    Captura de pantalla que muestra las opciones para crear suscripciones de eventos.

  10. Seleccione Crear.