البرنامج التعليمي: إنشاء أحداث ما قبل النشر باستخدام إخطار على الويب مع التنفيذ التلقائي

ينطبق على: ✔️ Windows VMs ✔️ Linux VMs ✔️ البيئة ✔️ المحلية خوادم Azure VMs ✔️ Azure Arc الممكنة.

تسمح لك الأحداث السابقة واللاحقة، والمعروفة أيضا باسم البرامج النصية المسبقة/اللاحقة، بتنفيذ الإجراءات المعرفة من قبل المستخدم قبل تثبيت تصحيح الجدول وبعده. أحد السيناريوهات الأكثر شيوعا هو بدء تشغيل الجهاز الظاهري (VM) وإيقافه. مع الأحداث المسبقة، يمكنك تشغيل برنامج نصي prepatching لبدء الجهاز الظاهري قبل بدء عملية تصحيح الجدول الزمني. بمجرد اكتمال تصحيح الجدول الزمني، وإعادة تشغيل الخادم، يمكن تنفيذ برنامج نصي لما بعد التصحيح لإيقاف تشغيل الجهاز الظاهري بأمان.

يشرح هذا البرنامج التعليمي كيفية إنشاء أحداث ما قبل النشر لبدء تشغيل جهاز ظاهري وإيقافه في سير عمل تصحيح الجدول باستخدام إخطار على الويب.

في هذا البرنامج التعليمي، تتعلم كيفية:

  • المتطلبات الأساسية
  • إنشاء دفتر تشغيل التنفيذ التلقائي ونشره
  • إضافة خطافات الويب
  • إنشاء اشتراك حدث

المتطلبات الأساسية

  1. تأكد من استخدام دفتر تشغيل PowerShell 7.2 .

  2. تعيين إذن للهويات المدارة - يمكنك تعيين أذونات للهوية المدارة المناسبة. يمكن لدفتر التشغيل استخدام إما هوية مُدارة معينة من قبل نظام حساب التنفيذ التلقائي أو هوية مُدارة معينة من قبل المستخدم.

    يمكنك استخدام مدخل أو PowerShell cmdlets لتعيين أذونات لكل هوية:

    اتبع الخطوات الواردة في تعيين أدوار Azure باستخدام مدخل Microsoft Azure لتعيين الأذونات


  1. استيراد الوحدة النمطية Az.ResourceGraph ، تأكد من تحديث الوحدة النمطية إلى ThreadJob مع إصدار الوحدة النمطية 2.0.3.

إنشاء دفتر تشغيل التنفيذ التلقائي ونشره

  1. سجل الدخول إلى مدخل Microsoft Azure وانتقل إلى حساب Azure Automation الخاص بك

  2. إنشاء ونشر دفتر تشغيل التنفيذ التلقائي.

  3. إذا كنت تستخدم سجلات التشغيل التي يتم استخدامها للمهام السابقة أو اللاحقة في Azure Automation Update Management، فمن المهم أن تتبع الخطوات التالية لتجنب حدوث تأثير غير متوقع على أجهزتك وتشغيل الصيانة الفاشلة.

    1. بالنسبة لدفاتر التشغيل الخاصة بك، قم بتحليل حمولة خطاف الويب للتأكد من تشغيلها على أحداث Microsoft.Maintenance.PreMaintenanceEvent أو Microsoft.Maintenance.PostMaintenanceEvent فقط. يتم تشغيل خطافات الويب حسب التصميم في أحداث الاشتراك الأخرى إذا تمت إضافة أي حدث آخر بنفس نقطة النهاية.

      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. لن يتم تمرير المعلمة SoftwareUpdateConfigurationRunContext ، التي تحتوي على معلومات حول قائمة الأجهزة في نشر التحديث إلى البرامج النصية السابقة أو اللاحقة عند استخدامها للأحداث السابقة أو اللاحقة أثناء استخدام الإخطار التلقائي على الويب. يمكنك إما الاستعلام عن قائمة الأجهزة من Azure Resource Graph أو الحصول على قائمة الأجهزة المشفرة في البرامج النصية.

      • تأكد من منح الأدوار والأذونات المناسبة للهويات المدارة التي تستخدمها في البرنامج النصي، لتنفيذ استعلامات Resource Graph وبدء تشغيل الأجهزة أو إيقافها.
      • راجع الأذونات المتعلقة لاستعلامات الرسم البياني للمورد
      • راجع دور المساهم في الأجهزة الظاهرية.
      • راجع التعليمات البرمجية المذكورة أدناه:
    3. راجع حمولة خطاف الويب

      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. للتخصيص، يمكنك استخدام البرامج النصية الموجودة لديك مع التعديلات المذكورة أعلاه أو استخدام البرامج النصية التالية.

نماذج البرامج النصية

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

إضافة خطافات الويب

أضف خطافات الويب إلى دفاتر التشغيل المنشورة أعلاه وانسخ عناوين URL لخطافات الويب.

إشعار

تأكد من نسخ عنوان URL بعد إنشاء إخطار على الويب حيث لا يمكنك استرداد عنوان URL مرة أخرى.

إنشاء اشتراك حدث

  1. سجل الدخول إلى مدخل Microsoft Azure وانتقل إلى Azure Update Manager.

  2. ضمن إدارة، حدد الأجهزة، تكوين الصيانة.

  3. في صفحة تكوين الصيانة، حدد التكوين.

  4. ضمن Settings، حدد Events.

    لقطة شاشة تعرض خيارات تحديد خيار قائمة الأحداث.

  5. حدد +Event Subscription لإنشاء حدث صيانة قبل/بعد.

    لقطة شاشة تعرض خيارات تحديد اشتراكات الأحداث.

  6. في صفحة إنشاء اشتراك حدث، أدخل التفاصيل التالية:

    1. في قسم تفاصيل اشتراك الحدث، أدخل اسما مناسبا.
    2. احتفظ بالمخطط كمخطط شبكة الأحداث.
    3. في قسم أنواع الأحداث، قم بالتصفية إلى أنواع الأحداث.
      1. حدد حدث الصيانة المسبقة لحدث ما قبل الحدث.
        • في قسم Endpoint details ، حدد نقطة نهاية Webhook وحدد Configure an Endpoint.
        • قم بتوفير التفاصيل المناسبة مثل عنوان URL للإخطار على الويب قبل الحدث لتشغيل الحدث.
      2. حدد حدث ما بعد الصيانة لحدث ما بعد الحدث.
        • في قسم Endpoint details ، نقطة نهاية Webhook وحدد Configure an Endpoint.
        • قم بتوفير التفاصيل المناسبة مثل عنوان URL للإخطار على الويب لما بعد الحدث لتشغيل الحدث. لقطة شاشة تعرض خيارات إنشاء اشتراكات الأحداث.
  7. حدد إنشاء.

الخطوات التالية