Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a: ✔️ VMs do Windows ✔️ VMs Linux ✔️ Ambiente local ✔️ VMs do Azure ✔️ Servidores habilitados para Azure Arc.
Os eventos pré e pós, também conhecidos como pré/pós-scripts, permitem executar ações definidas pelo usuário antes e depois da instalação do patch programado. Um dos cenários mais comuns é iniciar e parar uma máquina virtual (VM). Com pré-eventos, pode-se executar um script de pré-patch para iniciar a VM antes de começar o processo de agendamento de aplicação de patches. Quando a atualização de agendamento estiver concluída e o servidor for reiniciado, um script de pós-atualização poderá ser executado para desligar a VM com segurança.
Este tutorial explica como criar eventos anteriores e posteriores para iniciar e parar uma VM num fluxo de trabalho de atualização agendada através de um webhook.
Neste tutorial, irá aprender a:
- Pré-requisitos
- Criar e publicar manual de execução de automação
- Adicionar webhooks
- Criar uma subscrição de evento
Pré-requisitos
Verifique se você está usando o runbook do PowerShell 7.2 .
Atribuir permissão a identidades gerenciadas - Você pode atribuir permissões à identidade gerenciada apropriada. O runbook pode usar a identidade gerenciada atribuída pelo sistema de conta de automação ou uma identidade gerenciada atribuída pelo usuário.
Você pode usar cmdlets do portal ou do PowerShell para atribuir permissões a cada identidade:
Siga as etapas em Atribuir funções do Azure usando o portal do Azure para atribuir permissões
- Importe o
Az.ResourceGraph
módulo, certifique-se de que o módulo está atualizado para ThreadJob com o módulo versão 2.0.3.
Criar e publicar livro de operações de automação
Entre no portal do Azure e vá para sua conta de Automação do Azure
Se você estava usando Runbooks que estavam sendo usados para pré ou pós-tarefas no Azure Automation Update Management, é fundamental seguir as etapas abaixo para evitar um impacto inesperado em suas máquinas e execuções de manutenção com falha.
Para os seus runbooks, interprete a carga útil do webhook para garantir que seja desencadeada somente nos eventos Microsoft.Maintenance.PreMaintenanceEvent ou Microsoft.Maintenance.PostMaintenanceEvent. Por configuração, webhooks são acionados em outros eventos de subscrição se qualquer outro evento for adicionado com o mesmo endpoint.
- Consulte o esquema de eventos da Grade de Eventos do Azure.
- Consulte o esquema do Event Grid específico para configurações de manutenção
- Veja o código listado abaixo:
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 }
O parâmetro SoftwareUpdateConfigurationRunContext , que contém informações sobre a lista de máquinas na implantação da atualização, não será passado para os scripts pré ou pós quando você usá-los para eventos pré ou pós ao usar o webhook de automação. Você pode consultar a lista de máquinas do Azure Resource Graph ou ter a lista de máquinas codificada nos scripts.
- Certifique-se de que as funções e permissões adequadas sejam concedidas às identidades gerenciadas que você está usando no script, para executar consultas do Gráfico de Recursos e para iniciar ou parar máquinas.
- Veja as permissões relacionadas às consultas de gráfico de recursos
- Consulte Função de colaborador de máquinas virtuais.
- Veja o código listado abaixo:
-
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, você pode usar seus scripts existentes com as modificações acima feitas ou usar os scripts a seguir.
Scripts de exemplo
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
}
}
Adicionar webhooks
Adicione webhooks aos runbooks publicados acima e copie os URLs dos webhooks.
Nota
Certifique-se de copiar o URL depois de criar um webhook, pois não é possível recuperá-lo novamente.
Criar uma subscrição de evento
Entre no portal do Azure e vá para o Azure Update Manager.
Em Gerir, selecione Máquinas, Configuração de manutenção.
Na página Configuração de Manutenção, selecione a configuração preferida.
Em Configurações, selecione Eventos.
Selecione +Subscrição de Eventos para criar um evento de pré/pós-manutenção.
Na página Criar Subscrição de Eventos , introduza os seguintes detalhes:
- Na seção Detalhes da Assinatura do Evento, forneça um nome apropriado.
- Mantenha o esquema como Esquema de Grade de Eventos.
- Na seção Tipos de Evento, Filtre para Tipos de Evento.
- Selecione Pre Maintenance Event para um pré-evento.
- Na seção Detalhes do ponto de extremidade, selecione o ponto de extremidade Webhook e selecione Configurar um ponto de extremidade.
- Forneça os detalhes apropriados, como URL de webhook pré-evento para acionar o evento.
- Selecione Evento de Pós-Manutenção para um pós-evento.
- Selecione Pre Maintenance Event para um pré-evento.
Selecione Criar.
Próximos passos
- Saiba mais sobre a visão geral de eventos pré e pós no Azure Update Manager.
- Saiba mais sobre como criar pré e pós eventos
- Para saber como gerir eventos pré e pós ou cancelar uma execução agendada, consulte eventos de configuração pré e pós-manutenção.
- Saiba mais sobre como criar eventos pré e pós usando o Azure Functions.