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
Asegúrese de que usa un runbook de PowerShell 7.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
- 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
Inicie sesión en Azure Portal y vaya a la cuenta de Azure Automation
Creación y publicación de un runbook de Automation.
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.
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.
- Consulte el Esquema de eventos de Azure Event Grid.
- Consulte el Esquema de Event Grid específico de las configuraciones de mantenimiento
- Consulte los códigos que aparecen a continuació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 }
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:
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 } }
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
Inicie sesión en Azure Portal y vaya a su Administrador de actualizaciones de Azure.
En Administrar, seleccione Máquinas, Configuración de mantenimiento.
En la página Configuración de mantenimiento, seleccione la configuración.
En Configuración, seleccione Eventos.
Seleccione +Suscripción de eventos para crear un evento previo y posterior al mantenimiento.
En la página Crear suscripción de eventos, escriba los siguientes detalles:
- En la sección Detalles de la suscripción de eventos, proporcione un nombre adecuado.
- Mantenga el esquema como Esquema de Event Grid.
- En la sección Tipos de evento, Filtro para tipos de evento.
- 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.
- Seleccione Eventos posteriores al mantenimiento para un evento posterior.
- Seleccione Eventos previos al mantenimiento para un evento previo.
Seleccione Crear.
Pasos siguientes
- Obtenga más información sobre la Información general sobre eventos previos y posteriores en Azure Update Manager.
- Más información sobre cómo crear eventos previos y posteriores
- Para obtener información sobre cómo administrar eventos previos y posteriores o cancelar una ejecución del programa, consulte Eventos de configuración previos y posteriores al mantenimiento.
- Obtenga más información sobre Cómo crear eventos previos y posteriores mediante Azure Functions.