عملية ""what-if"" الخاصة بتوزيع قالب ARM
قبل توزيع قالب Azure Resource Manager (قالب ARM)، يمكنك معاينة التغييرات التي ستطرأ. ويوفر Azure Resource Manager عملية "what-if" ليسمح لك بمعرفة كيف ستتغير الموارد إذا قمت بتوزيع القالب. لا تُدخِل عملية "what-if" أي تغييرات على الموارد الحالية. بدلاً من ذلك، تتوقع التغييرات إذا تم توزيع القالب المحدد.
يمكنك استخدام عملية "what-if" مع عمليات Azure PowerShell أو واجهة سطر الأوامر Azure CLI أو واجهة برمجة تطبيقات REST API. تدعم عملية «What-if» مجموعة الموارد، والاشتراك، ومجموعة الإدارة، وعمليات التوزيع على مستوى المستأجرين.
موارد التدريب
ولمعرفة المزيد حول عملية «what-if» وللإرشادات العملية عنها، راجع معاينة التغييرات الحادثة في توزيع Azure باستخدام «what-if».
الأذونات المطلوبة
لتوزيع ملف Bicep أو قالب ARM، يلزم الوصول إلى الكتابة على الموارد التي تستخدمها والوصول إلى جميع العمليات على نوع المورد Microsoft.Resources/deployments. على سبيل المثال، لتوزيع جهاز ظاهري، تحتاج إلى أذونات Microsoft.Compute/virtualMachines/write
وMicrosoft.Resources/deployments/*
. عملية "ماذا لو" لها متطلبات الإذن نفسها.
للحصول على قائمة بالأدوار والأذونات، انظر أدوار Azure المضمنة.
حدود ماذا لو
تقوم وظيفة "ماذا لو" بتوسيع القوالب المتداخلة حتى يتم الوصول إلى هذه الحدود:
- 500 قالبا متداخلا.
- 800 مجموعة موارد في توزيع مجموعة موارد مشتركة.
- 5 دقائق مستغرقة لتوسيع القوالب المتداخلة.
عند الوصول إلى أحد الحدود، يتم تعيين نوع تغيير الموارد المتبقية إلى تجاهل.
قم بتثبيت وحدة Azure PowerShell
لاستخدام عملية «what-if» في PowerShell، يجب أن يتوفر لديك الإصدار 4.2 أو أحدث من الوحدة النمطية Az.
لتثبيت هذه الوحدة، استخدم:
Install-Module -Name Az -Force
للحصول على مزيد من المعلومات حول تثبيت الوحدات النمطية، راجع تثبيت Azure PowerShell.
تثبيت وحدة Azure CLI
لاستخدام عملية «what-if» في Azure CLI، يجب أن يتوفر لديك الإصدار Azure CLI 2.14.0 أو إصدار أحدث. إذا لزم الأمر، ثبّت آخر إصدار من Azure CLI.
رؤية النتائج
عند استخدام عملية «what-if» في PowerShell أو Azure CLI، يتضمن الإخراج نتائج تم ترميزها بالألوان لتساعدك على رؤية أنواع مختلفة من التغييرات.
يكون نص الإخراج هو:
Resource and property changes are indicated with these symbols:
- Delete
+ Create
~ Modify
The deployment will update the following scope:
Scope: /subscriptions/./resourceGroups/ExampleGroup
~ Microsoft.Network/virtualNetworks/vnet-001 [2018-10-01]
- tags.Owner: "Team A"
~ properties.addressSpace.addressPrefixes: [
- 0: "10.0.0.0/16"
+ 0: "10.0.0.0/15"
]
~ properties.subnets: [
- 0:
name: "subnet001"
properties.addressPrefix: "10.0.0.0/24"
]
Resource changes: 1 to modify.
إشعار
لا تستطيع عملية "what-if" حل الدالة المرجعية. وفي كل مرة تعيّن خاصية إلى تعبير قالب به الدالة المرجعية، ستتغيّر تقارير عملية «what-if» في الخاصية. ويحدث هذا السلوك لأن عملية «what-if» تقارن القيمة الحالية للخاصية (مثل true
أو false
لإحدى القيم المنطقية) بتعبير القالب الذي لم يتم حله. ومن الظاهر جليًّا أن هذه القيم لن تتطابق. فعند توزيع القالب، ستتغير الخاصية فقط عندما يتغير تعبير القالب إلى قيمة مختلفة.
أوامر عملية "what-if"
Azure PowerShell
لمعاينة التغييرات قبل توزيع قالب، استخدم New-AzResourceGroupDeployment أو New-AzSubscriptionDeployment. وأضف معلمة التبديل -Whatif
إلى أمر التوزيع.
استخدم
New-AzResourceGroupDeployment -Whatif
في عمليات توزيع مجموعة الموارداستخدم
New-AzSubscriptionDeployment -Whatif
وNew-AzDeployment -Whatif
في عمليات التوزيع على مستوى الاشتراك
يمكنك استخدام معلمة التبديل -Confirm
في معاينة التغييرات والمطالبة باستمرار التوزيع.
- استخدم
New-AzResourceGroupDeployment -Confirm
في عمليات توزيع مجموعة الموارد - استخدم
New-AzSubscriptionDeployment -Confirm
وNew-AzDeployment -Confirm
في عمليات التوزيع على مستوى الاشتراك
الأوامر السابقة تُرجع ملخصًا نصيًّا يمكنك التحقق منه يدويًّا. وللحصول على عنصر يمكنك فحصه برمجيًّا بحثًا عن التغييرات الطارئة عليه، استخدم Get-AzResourceGroupDeploymentWhatIfResult أو Get-AzSubscriptionDeploymentWhatIfResult.
- استخدم
$results = Get-AzResourceGroupDeploymentWhatIfResult
في عمليات توزيع مجموعة الموارد - استخدم
$results = Get-AzSubscriptionDeploymentWhatIfResult
و$results = Get-AzDeploymentWhatIfResult
في عمليات التوزيع على مستوى الاشتراك
Azure CLI
لمعاينة التغييرات قبل توزيع أحد القوالب، استخدم:
- az deployment group what-if لعمليات توزيع مجموعة الموارد
- az deployment sub what-if لعمليات التوزيع على مستوى الاشتراك
- az deployment mg what-if لعمليات توزيع مجموعة الإدارة
- az deployment tenant what-if لعمليات توزيع المستأجر
يمكنك استخدام مفتاح التبديل --confirm-with-what-if
(أو رمزه المختصر -c
) لمعاينة التغييرات والمطالبة باستمرار التوزيع. وأضف مفتاح التبديل هذا إلى:
- az deployment group create
- az deployment sub create.
- az deployment mg create
- az deployment tenant create
على سبيل المثال، استخدم az deployment group create --confirm-with-what-if
أو -c
في عمليات توزيع مجموعة الموارد.
الأوامر السابقة تُرجع ملخصًا نصيًّا يمكنك التحقق منه يدويًّا. وللحصول على عنصر JSON يمكنك فحص التغييرات برمجيًّا، عبر استخدام مفتاح التبديل --no-pretty-print
. على سبيل المثال، استخدم az deployment group what-if --no-pretty-print
في عمليات توزيع مجموعة الموارد.
إذا كنت ترغب في إرجاع النتائج بدون الترميز بالألوان، فافتح ملف تكوين Azure CLI. وعيّن التعليمة no_color على الوضع yes.
Azure REST API
بالنسبة لواجهة برمجة تطبيقات REST، استخدم:
- Deployments - What If في عمليات توزيع مجموعة الموارد
- Deployments - What If At Subscription Scope في عمليات توزيع الاشتراك
- Deployments - What If At Management Group Scope في عمليات توزيع مجموعة الإدارة
- Deployments - What If At Tenant Scope في عمليات توزيع المستأجر.
أنواع التغيير
تسرد عملية what-if سبعة أنواع مختلفة من التغييرات:
- الإنشاء: عندما يكون المورد غير موجود حاليًّا ولكن تم تحديده في القالب. سيتم إنشاء المورد.
- الحذف: يُطبق نوع التغيير هذا فقط عند استخدام وضع الإكمال للتوزيع. المورد موجود، ولكن غير معرّف في القالب. عند استخدام وضع الاستكمال، سيتم حذف المورد. يتم فقط تضمين الموارد التي تدعم حذف الوضع الكامل في نوع التغيير هذا.
- التجاهل: المورد موجود ولكن غير معرّف في القالب. لن يتم توزيع المورد أو تعديله. عند الوصول إلى حدود توسيع القوالب المتداخلة، ستواجه نوع التغيير هذا. راجع حدود ماذا لو.
- لا يوجد تغيير: المورد موجود ومعرّف في القالب. ستتم إعادة توزيع المورد، ولكن لن تتغير خصائص المورد. يُرجع هذا النوع من التغيير عند تعيين ResultFormat على القيمة
FullResourcePayloads
، وهي القيمة الافتراضية. - NoEffect: الخاصية جاهزة فقط وسيتم تجاهلها من قبل الخدمة. على سبيل المثال، يتم تعيين الخاصية
sku.tier
دائما للمطابقةsku.name
فيMicrosoft.ServiceBus
مساحة الاسم. - التعديل: المورد موجود ومعرّف في القالب. ستتم إعادة توزيع المورد، وسيتم تغيير خصائص المورد. يُرجع هذا النوع من التغيير عند تعيين ResultFormat على القيمة
FullResourcePayloads
، وهي القيمة الافتراضية. - التوزيع: المورد موجود ومعرَّف في القالب. ستتم إعادة توزيع المورد. خصائص هذا المورد قد تتغير أو لا تتغير. ترجع العملية بنوع التغيير هذا إذا لم تتوفر لديها معلومات كافية لتحديد ما إذا كانت هناك أي خصائص ستتغير. لن ترى هذا الشرط إلا عند تعيين ResultFormat على القيمة
ResourceIdOnly
.
تنسيق النتيجة
يمكنك التحكم في مستوى التفاصيل تُرجَع حول التغييرات المتوقع حدوثها. لديك خياران:
- FullResourcePayloads - تُرجع قائمة بالموارد التي ستتغير وتفاصيل حول الخصائص التي ستتغير
- ResourceIdOnly - تُرجع قائمة بالموارد التي ستتغير
القيمة الافتراضية هي FullResourcePayloads.
في أوامر توزيع PowerShell، استخدم المعلمة -WhatIfResultFormat
. بينما في أوامر العنصر البرمجي، استخدم المعلمة ResultFormat
.
في واجهة سطر الأوامر Azure CLI، استخدم المعلمة --result-format
.
توضح النتائج التالية تنسيقين مختلفين من الإخراج:
البيانات الأساسية للموارد الكاملة
Resource and property changes are indicated with these symbols: - Delete + Create ~ Modify The deployment will update the following scope: Scope: /subscriptions/./resourceGroups/ExampleGroup ~ Microsoft.Network/virtualNetworks/vnet-001 [2018-10-01] - tags.Owner: "Team A" ~ properties.addressSpace.addressPrefixes: [ - 0: "10.0.0.0/16" + 0: "10.0.0.0/15" ] ~ properties.subnets: [ - 0: name: "subnet001" properties.addressPrefix: "10.0.0.0/24" ] Resource changes: 1 to modify.
معرّف المورد فقط
Resource and property changes are indicated with this symbol: ! Deploy The deployment will update the following scope: Scope: /subscriptions/./resourceGroups/ExampleGroup ! Microsoft.Network/virtualNetworks/vnet-001 Resource changes: 1 to deploy.
تشغيل عملية «what-if»
إعداد البيئة
لنرى كيف تعمل what-if، لنُجري بعض الاختبارات. أولاً - وزّع نموذج إنشاء شبكة ظاهرية. وسوف تستخدم هذه الشبكة الظاهرية في اختبار كيفية الإبلاغ عن التغييرات باستخدام عملية «what-if».
New-AzResourceGroup `
-Name ExampleGroup `
-Location centralus
New-AzResourceGroupDeployment `
-ResourceGroupName ExampleGroup `
-TemplateUri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/what-if/what-if-before.json"
تعديل الاختبار
بعد اكتمال التوزيع، تكون جاهزًا لاختبار عملية what-if. وهذه المرة وزّع النموذج الذي يغير الشبكة الظاهرية. تفتقد إحدى العلامات الأصلية، وتمت إزالة شبكة فرعية وتغيير بادئة العنوان.
New-AzResourceGroupDeployment `
-Whatif `
-ResourceGroupName ExampleGroup `
-TemplateUri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/what-if/what-if-after.json"
يظهر إخراج what-if مشابهة لـ:
يكون نص الإخراج هو:
Resource and property changes are indicated with these symbols:
- Delete
+ Create
~ Modify
The deployment will update the following scope:
Scope: /subscriptions/./resourceGroups/ExampleGroup
~ Microsoft.Network/virtualNetworks/vnet-001 [2018-10-01]
- tags.Owner: "Team A"
~ properties.addressSpace.addressPrefixes: [
- 0: "10.0.0.0/16"
+ 0: "10.0.0.0/15"
]
~ properties.subnets: [
- 0:
name: "subnet001"
properties.addressPrefix: "10.0.0.0/24"
]
Resource changes: 1 to modify.
لاحظ في الجزء العلوي من الإخراج أنه تم ترميز نوع التغييرات بألوان محددة.
وفي الجزء السفلي من الإخراج، يظهر أنه تم حذف مالك العلامة. وتم تغيير بادئة العنوان من 10.0.0.0/16 إلى 10.0.0.0/15. بينما حُذفت الشبكة الفرعية المسماة subnet001. تذكر أن هذه التغييرات لم يتم توزيعها. ويمكنك مشاهدة معاينة التغييرات التي ستطرأ عند توزيع القالب.
لن تتغير بعض الخصائص التي تم سردها على أنها محذوفة بالفعل. يمكن الإبلاغ عن الخصائص بشكل غير صحيح على أنها محذوفة عندما لا تكون في القالب، ولكن تعيَّن تلقائيًّا في أثناء التوزيع كقيم افتراضية. تعتبر هذه النتيجة خاطئة "noise" في استجابة عملية "what-if". سيتوفر في المورد النهائي الذي تم توزيعه القيم المحددة للخصائص. وعند الانتهاء من عملية «what-if»، سيجري تصفية هذه الخصائص من النتيجة.
تقييم نتائج عملية «what-if» برمجيًّا
الآن، دعنا نقيم نتائج "what-if" برمجيًّا عن طريق تعيين الأمر إلى أحد المتغيرات.
$results = Get-AzResourceGroupDeploymentWhatIfResult `
-ResourceGroupName ExampleGroup `
-TemplateUri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/what-if/what-if-after.json"
يمكنك الاطلاع على ملخص لكل تغيير يطرأ.
foreach ($change in $results.Changes)
{
$change.Delta
}
تأكيد الحذف
تدعم عملية "what-if" استخدام وضع التوزيع. فعند تعيين وضع الإكمال، تُحذف الموارد غير الموجودة في القالب. ويوضح المثال التالي توزيع نموذج لا يشمل موارد محددة في وضع الإكمال.
لتجربة التغييرات قبل توزيع قالب، استخدم معلمة تأكيد التبديل مع أمر التوزيع. إذا كانت التغييرات كما توقعت، فقدم رغبتك في إكمال النشر.
New-AzResourceGroupDeployment `
-ResourceGroupName ExampleGroup `
-Mode Complete `
-Confirm `
-TemplateUri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/what-if/azuredeploy.json"
نظرًا لعدم تحديد أي موارد في القالب وتعيين وضع التوزيع على وضع الإكمال، ستُحذف الشبكة الظاهرية.
يكون نص الإخراج هو:
Resource and property changes are indicated with this symbol:
- Delete
The deployment will update the following scope:
Scope: /subscriptions/./resourceGroups/ExampleGroup
- Microsoft.Network/virtualNetworks/vnet-001
id:
"/subscriptions/./resourceGroups/ExampleGroup/providers/Microsoft.Network/virtualNet
works/vnet-001"
location: "centralus"
name: "vnet-001"
tags.CostCenter: "12345"
tags.Owner: "Team A"
type: "Microsoft.Network/virtualNetworks"
Resource changes: 1 to delete.
Are you sure you want to execute the deployment?
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"):
ترى الآن التغييرات المتوقعة التي تؤكد رغبتك في تشغيل التوزيع.
SDK
يمكنك استخدام عملية «what-if» من خلال عدة تطوير البرامج (SDKs) من Azure.
بالنسبة للغة Python، استخدم what-if.
بالنسبة للغة Java، استخدم DeploymentWhatIf Class.
بالنسبة للغة NET.، استخدم DeploymentWhatIf Class.
الخطوات التالية
- يوفر ملحقARM Deployment Insights طريقة سهلة لدمج عملية ماذا لو في تدفق البنية الأساسية لبرنامج ربط العمليات التجارية Azure DevOps.
- لاستخدام عملية الفرضيات في المسار، راجع اختبار قوالب ARM باستخدام فرضيات في مسار.
- إذا لاحظت نتائج غير صحيحة عن عملية "what-if"، يُرجى الإبلاغ عن المشكلات على الموقع الإلكتروني https://aka.ms/whatifissues.
- للوصول إلى وحدة Learn النمطية التي تتناول كيفية استخدام عملية "what-if"، راجع معاينة التغييرات والتحقق من صحة موارد Azure باستخدام عملية "what-if" ومجموعة أدوات اختبار قالب ARM.