إشعار
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
ينطبق على: ✔️ Windows VMs ✔️ Linux VMs ✔️ البيئة ✔️ المحلية خوادم Azure VMs ✔️ Azure Arc الممكنة.
يمكنك استخدام أحداث ما قبل الصيانة وما بعدها لتنفيذ إجراءات يحددها المستخدم قبل وبعد تثبيت التصحيح المجدول. واحدة من أكثر السيناريوهات شيوعا هي بدء وإيقاف آلة افتراضية (VM). مع أحداث ما قبل الصيانة، يمكنك تشغيل سكريبت لبدء الجهاز الافتراضي قبل بدء عملية التحديث المجدولة. بعد الانتهاء من التحديث المجدول وإعادة تشغيل الخادم، يمكنك تشغيل سكريبت لإيقاف الجهاز الافتراضي بأمان.
يشرح هذا الدرس كيفية إنشاء أحداث ما قبل الصيانة وما بعدها لبدء وإيقاف آلة افتراضية في سير عمل تحديث مجدول باستخدام webhook.
في هذا البرنامج التعليمي، سوف تتعلّم:
- إنشاء ونشر دفتر تشغيل لأتمتة Azure.
- أضف خطافات الويب.
- أنشئ اشتراكا في الحدث.
المتطلبات الأساسية
تأكد من أنك تستخدم دفتر تشغيل PowerShell 7.4 .
تعيين أذونات إلى الهوية المُدارةالمناسبة. يمكن لدفتر التشغيل استخدام هوية الإدارة المعينة من قبل النظام لحساب الأتمتة أو هوية مدارة معينة من قبل المستخدم.
تتطلب أمثلة السكريبتات التالية (بدء وإيقاف الأجهزة الافتراضية) دور مساهم في الآلة الافتراضية أو دورا مخصصا بهذه الأذونات المحددة:
- Microsoft.Compute/virtualMachines/start/action
- Microsoft.Compute/virtualMachines/deallocate/action
- Microsoft.Compute/virtualMachines/restart/action
- Microsoft.Compute/virtualMachines/powerOff/action
يمكنك استخدام بوابة Azure أو مجموعات Azure PowerShell لتعيين الأذونات لكل هوية:
لتعيين الأصوات، اتبع الخطوات في تعيين أدوار Azure باستخدام بوابة Azure.
- استورد الوحدة
Az.ResourceGraph. تأكد من تحديث الوحدة إلى ThreadJob مع إصدار الوحدة 2.0.3.
إنشاء ونشر كتاب تشغيل الأتمتة
سجل الدخول إلى بوابة Azure واذهب إلى حسابك في Azure Automation .
إذا كنت تستخدم دفاتر التشغيل لمهام ما قبل الصيانة وما بعدها في Azure Automation Update Management، فمن الضروري أن تستخدم الخطوات التالية لتجنب التأثير غير المتوقع على أجهزتك أو فشل عمليات الصيانة:
بالنسبة لدفاتر الجري، قم بتحليل حمولة webhook للتأكد من أنها تعمل على
Microsoft.Maintenance.PreMaintenanceEventMicrosoft.Maintenance.PostMaintenanceEventأو فقط على الأحداث. بحسب التصميم، يتم تفعيل webhooks على أحداث اشتراك أخرى إذا تمت إضافة أي حدث آخر بنفس نقطة النهاية.راجع مخطط حدث Azure Event Grid.
اطلع على مخطط شبكة الأحداث الخاص بتكوينات الصيانة.
انظر الكود التالي:
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 }
يحتوي معامل SoftwareUpdateConfigurationRunContext على معلومات حول قوائم الأجهزة في نشر التحديث. لن يتم تمريرها إلى السكربتات عند استخدامها لأحداث ما قبل الصيانة أو ما بعد الصيانة أثناء استخدام webhook الأتمتة. يمكنك إما الاستعلام عن قائمة الأجهزة من Azure Resource Graph أو الحصول على قائمة الأجهزة المشفرة في البرامج النصية.
تأكد من منح الأدوار والأذونات المناسبة للهويات المدارة التي تستخدمها في البرنامج النصي، لتنفيذ استعلامات Resource Graph وبدء تشغيل الأجهزة أو إيقافها.
راجع الأذونات المتعلقة باستعلامات رسم الموارد.
انظر حمولة 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 } }
للتخصيص، يمكنك إما استخدام السكريبتات الموجودة لديك مع التعديلات السابقة أو استخدام السكريبتات التالية.
نماذج البرامج النصية
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
}
}
إضافة خطافات الويب
أضف webhooks إلى كتب الrunbooks المنشورة السابقة وانسخ عناوين webhook.
إشعار
تأكد من نسخ الرابط بعد إنشاء webhook. لا يمكنك استرجاع الرابط مرة أخرى.
إنشاء اشتراك حدث
سجل الدخول إلى مدخل Microsoft Azure وانتقل إلى Azure Update Manager.
تحت إدارة الإعدادات، اخترإعدادات صيانةالآلات>.
في لوحة إعدادات الصيانة ، اختر التكوين.
ضمن Settings، حدد Events.
اختر +اشتراك الحدث لإنشاء حدث ما قبل الصيانة أو بعد الصيانة.
في قسم إنشاء اشتراك الحدث ، في قسم تفاصيل اشتراك الحدث ، قدم اسما مناسبا. احتفظ بالمخطط كمخطط شبكة الأحداث.
في قسم أنواع الأحداث ، لاختيار التصفية إلى أنواع الأحداث، اختر حدث ما قبل الصيانة أو حدث ما بعد الصيانة.
في قسم تفاصيل نقطة النهاية ، اختر نقطة نهاية Web Hook ، ثم اختر تكوين نقطة نهاية.
قدم التفاصيل المناسبة، مثل رابط webhook الخاص بحدث ما قبل الصيانة أو ما بعد الصيانة لتفعيل الحدث.
حدد إنشاء.