Tutorial: Membuat peristiwa pra-pemeliharaan dan pasca-pemeliharaan dengan menggunakan webhook dengan runbook Automation

Berlaku untuk: ✔️ VM Windows ✔️ VM Linux ✔️ Lingkungan di tempat ✔️ VM Azure ✔️ Server dengan Azure Arc diaktifkan.

Anda dapat menggunakan peristiwa pra-pemeliharaan dan pasca-pemeliharaan untuk menjalankan tindakan yang ditentukan pengguna sebelum dan sesudah penginstalan patch terjadwal. Salah satu skenario yang paling umum adalah memulai dan menghentikan komputer virtual (VM). Dengan peristiwa pra-pemeliharaan, Anda dapat menjalankan skrip untuk memulai VM sebelum memulai proses patching terjadwal. Setelah patching terjadwal selesai dan server di-boot ulang, Anda dapat menjalankan skrip untuk mematikan VM dengan aman.

Tutorial ini menjelaskan cara membuat peristiwa pra-pemeliharaan dan pasca-pemeliharaan untuk memulai dan menghentikan VM dalam alur kerja patch terjadwal dengan menggunakan webhook.

Di tutorial ini, Anda akan:

  • Buat dan terbitkan runbook Azure Automation.
  • Tambahkan webhook.
  • Buat langganan acara.

Prasyarat

  1. Pastikan Anda menggunakan runbook PowerShell 7.4 .

  2. Tetapkan izin untuk identitas terkelola yang sesuai. Runbook dapat menggunakan identitas terkelola yang ditetapkan sistem pada akun Automation atau identitas terkelola yang ditetapkan pengguna.

    Contoh skrip berikut (memulai dan menghentikan VM) memerlukan peran Kontributor Komputer Virtual atau peran kustom dengan izin khusus ini:

    • Microsoft.Compute/virtualMachines/start/tindakan
    • Microsoft.Compute/virtualMachines/deallocate/action
    • Microsoft.Compute/virtualMachines/mulai ulang/tindakan
    • Microsoft.Compute/virtualMachines/powerOff/action

    Anda dapat menggunakan cmdlet portal Microsoft Azure atau Azure PowerShell untuk menetapkan izin ke setiap identitas:

    Untuk menetapkan izin, ikuti langkah-langkah dalam Menetapkan peran Azure menggunakan portal Microsoft Azure.


  1. Impor modul Az.ResourceGraph. Pastikan bahwa modul diperbarui ke ThreadJob dengan modul versi 2.0.3.

Membuat dan menerbitkan runbook Otomasi

  1. Masuk ke portal Microsoft Azure dan buka akun Azure Automation Anda.

  2. Membuat dan menerbitkan runbook Automasi.

  3. Jika Anda menggunakan runbook untuk tugas pra-pemeliharaan dan pasca-pemeliharaan di Azure Automation Update Management, Anda harus menggunakan langkah-langkah berikut untuk menghindari dampak tak terduga pada komputer Anda dan pemeliharaan yang gagal dijalankan:

    1. Untuk runbook Anda, urai payload webhook untuk memastikan bahwa itu hanya memicu pada peristiwa Microsoft.Maintenance.PreMaintenanceEvent atau Microsoft.Maintenance.PostMaintenanceEvent. Secara desain, webhook dipicu pada peristiwa langganan lain jika ada peristiwa lain yang ditambahkan dengan titik akhir yang sama.

      • Lihat skema acara Azure Event Grid.

      • Lihat skema Event Grid khusus untuk konfigurasi pemeliharaan.

      • Lihat kode berikut:

        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. Parameter SoftwareUpdateConfigurationRunContext berisi informasi tentang daftar komputer dalam penyebaran pembaruan. Ini tidak akan diteruskan ke skrip saat Anda menggunakannya untuk peristiwa pra-pemeliharaan atau pasca-pemeliharaan saat menggunakan webhook Automation. Anda dapat mengkueri daftar komputer dari Azure Resource Graph atau membuat daftar komputer yang dikodekan dalam skrip.

      • Pastikan bahwa peran dan izin yang tepat diberikan ke identitas terkelola yang Anda gunakan dalam skrip, untuk menjalankan kueri Resource Graph dan untuk memulai atau menghentikan komputer.

      • Lihat izin yang terkait dengan kueri Resource Graph.

      • Lihat peran Kontributor Komputer Virtual.

      • Lihat payload webhook.

      • Lihat kode berikut:

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

Untuk menyesuaikan, Anda dapat menggunakan skrip yang sudah ada dengan modifikasi sebelumnya atau menggunakan skrip berikut.

Skrip contoh

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

Tambahkan webhook

Tambahkan webhook ke runbook yang diterbitkan sebelumnya dan salin URL webhook.

Catatan

Pastikan untuk menyalin URL setelah Anda membuat webhook. Anda tidak dapat mengambil URL lagi.

Membuat langganan peristiwa

  1. Masuk ke portal Azure dan buka Manajer Pembaruan Azure.

  2. Di bawah Kelola, pilihKonfigurasi Pemeliharaan>.

  3. Pada panel Konfigurasi Pemeliharaan , pilih konfigurasi.

  4. Di bawah Pengaturan, pilih Peristiwa.

    Cuplikan layar yang memperlihatkan opsi menu untuk peristiwa.

  5. Pilih +Langganan Acara untuk membuat acara sebelum pemeliharaan atau setelah pemeliharaan.

    Cuplikan layar yang memperlihatkan langganan peristiwa dengan opsi untuk membuat langganan peristiwa.

  6. Pada panel Buat Langganan Peristiwa , di bagian Detail Langganan Peristiwa , berikan nama yang sesuai. Pertahankan skema sebagai Event Grid Schema.

  7. Di bagian Jenis Peristiwa , untuk Filter ke Jenis Peristiwa, pilih Peristiwa Pra Pemeliharaan atau Peristiwa Pemeliharaan Pasca.

  8. Di bagian Detail Titik Akhir , pilih titik akhir Web Hook , lalu pilih Konfigurasikan titik akhir.

  9. Berikan detail yang sesuai, seperti URL webhook peristiwa pra-pemeliharaan atau pasca-pemeliharaan agar peristiwa dapat dipicu.

    Cuplikan layar yang memperlihatkan opsi untuk membuat langganan peristiwa.

  10. Pilih Buat.