Bagikan melalui


Tutorial: Membuat peristiwa pra dan posting menggunakan webhook dengan Automation

Berlaku untuk: ✔️ VM Windows VM ✔️ ✔️ Linux Lingkungan ✔️ lokal Azure VM server ✔️ yang didukung Azure Arc.

Sebelum dan posting peristiwa, juga dikenal sebagai pra/pasca-skrip, memungkinkan Anda untuk menjalankan tindakan yang ditentukan pengguna sebelum dan sesudah penginstalan patch jadwal. Salah satu skenario yang paling umum adalah memulai dan menghentikan Komputer Virtual (VM). Dengan pra-peristiwa, Anda dapat menjalankan skrip pra-pengiriman untuk memulai VM sebelum memulai proses patching jadwal. Setelah patching jadwal selesai, dan server di-boot ulang, skrip pasca-patching dapat dijalankan untuk mematikan VM dengan aman.

Tutorial ini menjelaskan cara membuat peristiwa pra dan posting untuk memulai dan menghentikan VM dalam alur kerja patch jadwal menggunakan webhook.

Dalam tutorial ini, Anda akan mempelajari cara:

  • Prasyarat
  • Membuat dan menerbitkan runbook Automation
  • Menambahkan webhook
  • Membuat langganan peristiwa

Prasyarat

  1. Pastikan Anda menggunakan runbook PowerShell 7.2 .

  2. Tetapkan izin ke identitas terkelola - Anda dapat menetapkan izin ke identitas terkelola yang sesuai. Runbook dapat menggunakan identitas terkelola yang ditetapkan sistem akun Automation atau identitas terkelola yang ditetapkan pengguna.

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

    Ikuti langkah-langkah dalam Menetapkan peran Azure menggunakan portal Azure untuk menetapkan izin


  1. Az.ResourceGraph Impor modul, pastikan modul diperbarui ke ThreadJob dengan modul versi 2.0.3.

Membuat dan menerbitkan runbook Automation

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

  2. Membuat dan Menerbitkan runbook Automation.

  3. Jika Anda menggunakan Runbook yang digunakan untuk tugas pra atau posting di Manajemen Pembaruan Azure Automation, sangat penting bagi Anda untuk mengikuti langkah-langkah di bawah ini untuk menghindari dampak tak terduga pada mesin Anda dan pemeliharaan yang gagal dijalankan.

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

      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 , yang berisi informasi tentang daftar komputer dalam penyebaran pembaruan tidak akan diteruskan ke skrip pra atau pasca saat Anda menggunakannya untuk pra atau posting peristiwa saat menggunakan webhook otomatisasi. 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 grafik sumber daya
      • Lihat Peran kontributor komputer virtual.
      • Lihat kode yang tercantum di bawah ini:
    3. Lihat payload webhook

      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    
      }
      }
      
    4. Untuk menyesuaikan, Anda dapat menggunakan skrip yang ada dengan modifikasi di atas yang dilakukan atau menggunakan skrip berikut.

Skrip sampel

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

Menambahkan webhook

Tambahkan webhook ke runbook yang diterbitkan di atas dan salin URL webhook.

Catatan

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

Membuat langganan Peristiwa

  1. Masuk ke portal Azure dan buka Azure Update Manager Anda.

  2. Di bawah Kelola, pilih Mesin, Konfigurasi Pemeliharaan.

  3. Pada halaman Konfigurasi Pemeliharaan, pilih konfigurasi.

  4. Di bawah Pengaturan, pilih Peristiwa.

    Cuplikan layar yang memperlihatkan opsi untuk memilih opsi menu peristiwa.

  5. Pilih +Langganan Peristiwa untuk membuat peristiwa pemeliharaan pra/pasca pemeliharaan.

    Cuplikan layar yang memperlihatkan opsi untuk memilih langganan peristiwa.

  6. Pada halaman Buat Langganan Peristiwa, masukkan detail berikut ini:

    1. Di bagian Detail Langganan Peristiwa, berikan nama yang sesuai.
    2. Pertahankan skema sebagai Skema Event Grid.
    3. Di bagian Jenis Peristiwa, Filter ke Jenis Peristiwa.
      1. Pilih Peristiwa Pra-Pemeliharaan untuk pra-peristiwa.
        • Di bagian Detail titik akhir, pilih titik akhir Webhook dan pilih Konfigurasikan Titik Akhir.
        • Berikan detail yang sesuai seperti URL webhook pra-peristiwa untuk memicu peristiwa.
      2. Pilih Pasca Pemeliharaan Peristiwa untuk pasca-peristiwa.
        • Di bagian Detail titik akhir, titik akhir Webhook dan pilih Konfigurasikan Titik Akhir.
        • Berikan detail yang sesuai seperti URL webhook pasca-peristiwa untuk memicu peristiwa. Cuplikan layar yang memperlihatkan opsi untuk membuat langganan peristiwa.
  7. Pilih Buat.

Langkah berikutnya