Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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
Asegúrese de que usa un runbook de PowerShell 7.4 .
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.
- Importe el
Az.ResourceGraphmó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
Inicie sesión en Azure Portal y vaya a su cuenta de Azure Automation .
Cree y publique un libro de instrucciones de automatización.
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:
Para sus runbooks, analice el payload del webhook para asegurarse de que se desencadena solo en eventos de
Microsoft.Maintenance.PreMaintenanceEventoMicrosoft.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 }
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
Inicie sesión en Azure Portal y vaya a Administrador de actualizaciones de Azure.
En Administrar, seleccioneConfiguración de mantenimiento>.
En el panel Configuración de mantenimiento , seleccione la configuración.
En Configuración, seleccione Eventos.
Seleccione +Suscripción de eventos para crear un evento previo al mantenimiento o posterior al mantenimiento.
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.
En la sección Tipos de eventos , en Filtrar a tipos de eventos, seleccione Evento de mantenimiento previo o Evento posterior al mantenimiento.
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.
Proporcione los detalles adecuados, como la dirección URL de webhook del evento de mantenimiento previo o posterior al mantenimiento para desencadenar el evento.
Seleccione Crear.
Contenido relacionado
- Obtenga información general sobre los eventos previos al mantenimiento y posteriores al mantenimiento en Azure Update Manager.
- Obtenga más información sobre cómo crear eventos previos al mantenimiento y posteriores al mantenimiento.
- Obtenga información sobre cómo administrar eventos previos y posteriores al mantenimiento o cancelar una ejecución programada.
- Aprenda a crear eventos previos al mantenimiento y posteriores al mantenimiento mediante Azure Functions.