Aracılığıyla paylaş


Öğretici: Otomasyon ile web kancası kullanarak önceki ve sonraki olayları oluşturma

Şunlar için geçerlidir: ✔️ Windows VM'leri ✔️ Linux VM'leri ✔️ Şirket içi ortam ✔️ Azure VM'leri ✔️ Azure Arc özellikli sunucular.

Ön/son betik olarak da bilinen olaylar öncesi ve sonrası, zamanlama düzeltme eki yüklemeden önce ve sonra kullanıcı tanımlı eylemleri yürütmenize olanak tanır. En yaygın senaryolardan biri vm'yi başlatmak ve durdurmaktır. Ön olaylarla, zamanlama düzeltme eki uygulama işlemini başlatmadan önce VM'yi başlatmak için bir ön düzeltme eki uygulama betiği çalıştırabilirsiniz. Zamanlama düzeltme eki uygulama tamamlandıktan ve sunucu yeniden başlatıldıktan sonra, VM'yi güvenli bir şekilde kapatmak için bir düzeltme eki uygulama sonrası betiği yürütülebilir

Bu öğreticide, web kancası kullanarak bir zamanlama düzeltme eki iş akışında VM'yi başlatmak ve durdurmak için olayları önceden oluşturma ve gönderme açıklanmaktadır.

Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:

  • Önkoşullar
  • Otomasyon runbook'u oluşturma ve yayımlama
  • Web kancaları ekleme
  • Olay aboneliği oluşturma

Önkoşullar

  1. PowerShell 7.2 runbook kullandığınızdan emin olun.

  2. Yönetilen kimliklere izin atama - İzinleri uygun yönetilen kimliğe atayabilirsiniz. Runbook, Otomasyon hesabı sistem tarafından atanan yönetilen kimliği veya kullanıcı tarafından atanan yönetilen kimliği kullanabilir.

    Her kimliğe izin atamak için portal veya PowerShell cmdlet'lerini kullanabilirsiniz:

    İzinleri atamak için Azure portalını kullanarak Azure rolleri atama başlığındaki adımları izleyin


  1. Modülü içeri aktarın Az.ResourceGraph , modülün 2.0.3 modülü sürümüyle ThreadJob'a güncelleştirildiğinden emin olun.

Otomasyon runbook'u oluşturma ve yayımlama

  1. Azure portalında oturum açın ve Azure Otomasyonu hesabınıza gidin

  2. Otomasyon runbook'u oluşturma ve yayımlama .

  3. Azure Otomasyonu Güncelleştirme Yönetimi'nde görevlerin öncesi veya sonrası için kullanılan Runbook'ları kullanıyorsanız, makineleriniz ve başarısız bakım çalıştırmaları üzerinde beklenmeyen bir etkiyi önlemek için aşağıdaki adımları izlemeniz kritik önem taşır.

    1. Runbook'larınız için web kancası yükünü ayrıştırarak yalnızca Microsoft.Maintenance.PreMaintenanceEvent veya Microsoft.Maintenance.PostMaintenanceEvent olaylarında tetiklendiğinden emin olun. Tasarım gereği web kancaları, aynı uç noktaya başka bir olay eklenirse diğer abonelik olaylarında tetiklenir.

      param 
      
      (  
        [Parameter(Mandatory=$false)]  
      
        [object] $WebhookData  
      
      )  
      $notificationPayload = ConvertFrom-Json -InputObject $WebhookData.RequestBody  
      $eventType = $notificationPayload[0].eventType  
      
      if ($eventType -ne “Microsoft.Maintenance.PreMaintenanceEvent” -or $eventType –ne “Microsoft.Maintenance.PostMaintenanceEvent” ) {  
        Write-Output "Webhook not triggered as part of pre or post patching for maintenance run"  
      return  
      } 
      
    2. Güncelleştirme dağıtımındaki makinelerin listesi hakkında bilgi içeren SoftwareUpdateConfigurationRunContext parametresi, otomasyon web kancasını kullanırken bunları olaylar öncesi veya sonrası için kullandığınızda betiklere geçirilmeyecek veya gönderilmeyecektir. Azure Kaynak Grafı'daki makinelerin listesini sorgulayabilir veya betiklerde kodlanmış makine listesini kullanabilirsiniz.

      • Betikte kullandığınız yönetilen kimliklere, Kaynak Grafı sorguları yürütmek ve makineleri başlatmak veya durdurmak için uygun rollerin ve izinlerin verildiğinden emin olun.
      • Kaynak grafı sorguları ile ilgili izinlere bakın
      • Bkz. Sanal makineler katkıda bulunan rolü.
      • Aşağıda listelenen koda bakın:
    3. Bkz. web kancası yükü

      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. Özelleştirmek için, yukarıdaki değişiklikleri yaptıktan sonra mevcut betiklerinizi kullanabilir veya aşağıdaki betikleri kullanabilirsiniz.

Örnek betikler

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

Web kancaları ekleme

Yukarıdaki yayımlanan runbook'lara web kancaları ekleyin ve web kancaları URL'lerini kopyalayın.

Not

Url'yi yeniden alamadığınızdan, web kancası oluşturduktan sonra URL'yi kopyaladığınızdan emin olun.

Olay aboneliği oluşturma

  1. Azure portalında oturum açın ve Azure Update Manager'ınıza gidin.

  2. Yönet'in altında Makineler, Bakım Yapılandırması'yı seçin.

  3. Bakım Yapılandırması sayfasında yapılandırmayı seçin.

  4. Ayarlar altında Olaylar'ı seçin.

    Olaylar menü seçeneğini belirleme seçeneklerini gösteren ekran görüntüsü.

  5. Bakım öncesi/sonrası olayı oluşturmak için +Olay Aboneliği'ne tıklayın.

    Olay aboneliklerini seçme seçeneklerini gösteren ekran görüntüsü.

  6. Olay Aboneliği Oluştur sayfasında aşağıdaki ayrıntıları girin:

    1. Olay Aboneliği Ayrıntıları bölümünde uygun bir ad girin.
    2. Şemayı Event Grid Şeması olarak tutun.
    3. Olay Türleri bölümünde, Olay Türlerine Filtre Uygula'yı seçin.
      1. Bir ön olay için Bakım Öncesi Olay'ı seçin.
        • Uç nokta ayrıntıları bölümünde Web kancasıuç noktasını seçin ve Yapılandır ve Uç Nokta'yı seçin.
        • Olayı tetikleme amacıyla olay öncesi web kancası URL'si gibi uygun ayrıntıları sağlayın.
      2. Olay sonrası için Bakım Sonrası Olay'ı seçin.
        • Uç nokta ayrıntıları bölümünde Web kancası uç noktası ve Yapılandır ve Uç Nokta'yı seçin.
        • Olayı tetikleme amacıyla olay sonrası web kancası URL'si gibi uygun ayrıntıları sağlayın. Olay aboneliklerini oluşturma seçeneklerini gösteren ekran görüntüsü.
  7. Oluştur'u belirleyin.

Sonraki adımlar

Birden çok makineyi yönetme hakkında bilgi edinin.