عملية ""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
لمعاينة التغييرات قبل توزيع قالب، استخدم:
- مجموعة التوزيع من الألف إلى الياء "what-if" لعمليات توزيع مجموعة الموارد
- توزيع az-sub what-if لعمليات التوزيع على مستوى الاشتراك
- az deployment mg what-if لعمليات توزيع مجموعة الإدارة
- مستأجر التوزيع az what-if لعمليات توزيع المستأجر
يمكنك استخدام مفتاح --confirm-with-what-if
(أو شكله المختصر -c
) لمعاينة التغييرات والمطالبة بمتابعة التوزيع. أضف رمز التبديل هذا إلى:
- إنشاء مجموعة التوزيع من الألف إلى الياء
- إنشاء فرعي للتوزيع من الألف إلى الياء.
- إنشاء مجموعة التوزيع من الألف إلى الياء
- إنشاء مستأجر للتوزيع من الألف إلى الياء
على سبيل المثال، استخدم 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 على نعم.
Azure REST API
بالنسبة لـ REST API، استخدم:
- عمليات التوزيع - "what-if" لعمليات توزيع مجموعة الموارد
- عمليات التوزيع - "what-if" في نطاق الاشتراك لعمليات توزيع الاشتراك
- عمليات التوزيع - What If At Management Group Scope لعمليات توزيع مجموعة الإدارة
- عمليات التوزيع - "what-if" في Tenant Scope لعمليات توزيع المستأجر.
أنواع التغيير
تسرد عملية ماذا لو سبعة أنواع مختلفة من التغييرات:
- إنشاء: المورد غير موجود حالياً ولكن تم تحديده في النموذج. سيتم إنشاء المورد.
- حذف: ينطبق نوع التغيير هذا فقط عند استخدام الوضع الكامل للتوزيع. المورد موجود، لكن لم يتم تعريفه في القالب. عند استخدام وضع الاستكمال، سيتم حذف المورد. يتم فقط تضمين الموارد التي تدعم الحذف الكامل للوضع في نوع التغيير هذا.
- تجاهل: المورد موجود ولكن لم يتم تعريفه في القالب. لن يتم توزيع المورد أو تعديله. عند الوصول إلى حدود توسيع القوالب المتداخلة، ستواجه نوع التغيير هذا. راجع حدود ماذا لو.
- NoChange: المورد موجود ومعرف في القالب. ستتم إعادة توزيع المورد، ولكن لن تتغير خصائص المورد. يتم إرجاع نوع التغيير هذا عند تعيين 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. تذكر أن هذه التغييرات لم يتم توزيعها. ترى معاينة للتغييرات التي ستحدث إذا قمت بتوزيع القالب.
بعض الخصائص المدرجة على أنها محذوفة لن تتغير بالفعل. يمكن الإبلاغ عن الخصائص بشكل غير صحيح على أنها محذوفة عندما لا تكون في القالب، ولكن يتم تعيينها تلقائياً أثناء التوزيع كقيم ظاهرية. تعتبر هذه النتيجة "ضوضاء" في استجابة "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" من خلال حزم Azure SDK.
بالنسبة إلى Python، استخدم what-if.
لـ Java، استخدم DeploymentWhatIf Class.
بالنسبة إلى NET.، استخدم DeploymentWhatIf Class.
الخطوات التالية
- يوفر ملحقARM Deployment Insights طريقة سهلة لدمج عملية ماذا لو في تدفق البنية الأساسية لبرنامج ربط العمليات التجارية Azure DevOps.
- لاستخدام عملية "what-if" في خط التدفق، راجع اختبار قوالب ARM باستخدام What-If in a pipeline.
- إذا لاحظت نتائج غير صحيحة من عملية "what-if"، فالرجاء الإبلاغ عن المشكلات على https://aka.ms/whatifissues.
- للوصول إلى وحدة Learn النمطية التي تتناول كيفية استخدام عملية "what-if"، راجع معاينة التغييرات والتحقق من صحة موارد Azure باستخدام عملية "what-if" ومجموعة أدوات اختبار قالب ARM.