عملية what-if لتوزيع Bicep
يمكنك قبل توزيع ملف Bicep معاينة التغييرات التي ستحدث. يوفر Azure Resource Manager عملية what-if للسماح لك بالاطلاع على كيفية تغيير الموارد إذا قمت بنشر ملف Bicep. لا تُدخِل عملية "what-if" أي تغييرات على الموارد الحالية. بدلاً من ذلك، فإنه يتوقع التغييرات إذا تم نشر ملف Bicep المحدد.
يمكنك استخدام عملية what-if باستخدام عمليات Azure PowerShell أو Azure CLI أو REST API. تدعم عملية «What-if» مجموعة الموارد، والاشتراك، ومجموعة الإدارة، وعمليات التوزيع على مستوى المستأجرين.
أثناء What-If العمليات، لا يتم دعم تقييم وتوسيع templateLink
. ونتيجة لذلك، لن تكون أي موارد يتم توزيعها باستخدام ارتباطات القالب ضمن عمليات التوزيع المتداخلة، بما في ذلك مراجع مواصفات القالب، مرئية في نتائج العملية What-If.
موارد التدريب
إذا كنت تفضل معرفة المزيد حول عملية «ماذا لو» من خلال الإرشادات التفصيلية، راجع معاينة تغييرات توزيع Azure باستخدام عبارة «ماذا لو».
الأذونات المطلوبة
لنشر ملف 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
لقيمة منطقية) بتعبير القالب الذي لم يتم حله. ومن الواضح أن هذه القيم لن تتطابق. ستتغير الخاصية عند توزيع ملف Bicep فقط وذلك عندما يتحول تعبير القالب إلى قيمة مختلفة.
أوامر What-if
Azure PowerShell
لمعاينة التغييرات قبل توزيع ملف Bicep، استخدم 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
لمعاينة التغييرات قبل نشر ملف Bicep، استخدم:
- az deployment group 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 لعمليات توزيع المستأجر.
أنواع التغيير
تسرد عملية ماذا لو سبعة أنواع مختلفة من التغييرات:
- إنشاء: لا يكون المورد موجود حاليًا ولكن تم تعريفه في ملف Bicep. سيتم إنشاء المورد.
- حذف: ينطبق نوع التغيير هذا فقط عند استخدام الوضع الكامل لتوزيع قالب JSON. المورد موجود، ولكن غير معرف في ملف Bicep. عند استخدام وضع الاستكمال، سيتم حذف المورد. يتم فقط تضمين الموارد التي تدعم حذف الوضع الكامل في نوع التغيير هذا.
- تجاهل: المورد موجود، ولكن لم يتم تعريفه في ملف Bicep. لن يتم توزيع المورد أو تعديله. عند الوصول إلى حدود توسيع القوالب المتداخلة، ستواجه نوع التغيير هذا. راجع حدود ماذا لو.
- لا توجد تغييرات: المورد موجود، ويتم تعريفه في ملف Bicep. ستتم إعادة توزيع المورد، ولكن لن تتغير خصائص المورد. يتم إرجاع نوع التغيير هذا عند تعيين ResultFormat على
FullResourcePayloads
، وهي القيمة الظاهرية. - NoEffect: الخاصية جاهزة فقط وسيتم تجاهلها من قبل الخدمة. على سبيل المثال، يتم تعيين الخاصية
sku.tier
دائما للمطابقةsku.name
فيMicrosoft.ServiceBus
مساحة الاسم. - تعديل: المورد موجود، ويتم تعريفه في ملف Bicep. ستتم إعادة توزيع المورد، وسيتم تغيير خصائص المورد. يتم إرجاع نوع التغيير هذا عند تعيين ResultFormat إلى
FullResourcePayloads
، وهي القيمة الافتراضية. - توزيع: المورد موجود، ويتم تعريفه في ملف Bicep. ستتم إعادة توزيع المورد. قد تتغير أو لا تتغير خصائص المورد. ترجع العملية بنوع التغيير هذا إذا لم تتوفر لديها معلومات كافية لتحديد ما إذا كانت هناك أي خصائص ستتغير. ترى هذا الشرط فقط عند تعيين 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، لنُجري بعض الاختبارات. أولاً ، قم بنشر ملف Bicep الذي ينشئ شبكة افتراضية. ستستخدم هذه الشبكة الظاهرية لاختبار كيفية الإبلاغ عن التغييرات بواسطة what-if. تحميل نسخة من ملف Bicep.
resource vnet 'Microsoft.Network/virtualNetworks@2021-02-01' = {
name: 'vnet-001'
location: resourceGroup().location
tags: {
CostCenter: '12345'
Owner: 'Team A'
}
properties: {
addressSpace: {
addressPrefixes: [
'10.0.0.0/16'
]
}
enableVmProtection: false
enableDdosProtection: false
subnets: [
{
name: 'subnet001'
properties: {
addressPrefix: '10.0.0.0/24'
}
}
{
name: 'subnet002'
properties: {
addressPrefix: '10.0.1.0/24'
}
}
]
}
}
لتوزيع ملف Bicep، استخدم:
New-AzResourceGroup `
-Name ExampleGroup `
-Location centralus
New-AzResourceGroupDeployment `
-ResourceGroupName ExampleGroup `
-TemplateFile "what-if-before.bicep"
تعديل الاختبار
بعد اكتمال التوزيع، تكون جاهزًا لاختبار عملية what-if. يُوزع هذه المرة ملف Bicep الذي يغير شبكة الاتصال الظاهرية. وعند عدم إضافة إحدى العلامات الأصلية، تُزال الشبكة الفرعية، وتتغير بادئة العنوان. تحميل نسخة من ملف Bicep.
resource vnet 'Microsoft.Network/virtualNetworks@2021-02-01' = {
name: 'vnet-001'
location: resourceGroup().location
tags: {
CostCenter: '12345'
}
properties: {
addressSpace: {
addressPrefixes: [
'10.0.0.0/15'
]
}
enableVmProtection: false
enableDdosProtection: false
subnets: [
{
name: 'subnet002'
properties: {
addressPrefix: '10.0.1.0/24'
}
}
]
}
}
لعرض التغييرات، استخدم:
New-AzResourceGroupDeployment `
-Whatif `
-ResourceGroupName ExampleGroup `
-TemplateFile "what-if-after.bicep"
يبدو إخراج "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.enableVmProtection: false
~ 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. تذكر أنه لم يتم توزيع هذه التغييرات. يمكنك مراجعة معاينة التغييرات التي سيتم حدوثها إذا قمت بنشر ملف Bicep.
لن تتغير بعض الخصائص التي تم سردها على أنها محذوفة بالفعل. يمكن الإبلاغ عن الخصائص بشكل غير صحيح على أنها محذوفة عندما لا تكون في ملف Bicep، ولكن يتم تعيينها تلقائيًا أثناء التوزيع كقيم افتراضية. وتعتبر هذه النتيجة "الضوضاء" في استجابة what-if. المورد النهائي الذي تم توزيعه سيكون له القيم المحددة للخصائص. مع نضوج عملية "what-if"، سيتم تصفية هذه الخصائص خارج النتيجة.
تقييم نتائج "what-if" برمجياً
الآن، دعنا نقيم نتائج "what-if" برمجياً عن طريق تعيين الأمر إلى متغير.
$results = Get-AzResourceGroupDeploymentWhatIfResult `
-ResourceGroupName ExampleGroup `
--template-file "what-if-after.bicep"
يمكنك رؤية ملخص لكل تغيير.
foreach ($change in $results.Changes)
{
$change.Delta
}
تأكيد الحذف
لمعاينة التغييرات قبل توزيع ملف Bicep، استخدم معلمة تبديل التأكيد مع أمر التوزيع. إذا كانت التغييرات كما توقعت، فقدم رغبتك في إكمال النشر.
New-AzResourceGroupDeployment `
-ResourceGroupName ExampleGroup `
-Confirm `
-TemplateFile "what-if-after.bicep"
إخراج النص هو:
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.enableVmProtection: false
~ 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.
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"):
راجع التغييرات المتوقعة ويمكنك تأكيد رغبتك في تشغيل التوزيع.
تنظيف الموارد
عندما لم تعد بحاجة إلى موارد الأمثلة، استخدم Azure CLI أو Azure PowerShell لحذف مجموعة الموارد.
az group delete --name ExampleGroup
SDK
يمكنك استخدام عملية "what-if" من خلال حزم Azure SDK.
بالنسبة إلى Python، استخدم what-if.
لـ Java، استخدم DeploymentWhatIf Class.
بالنسبة إلى NET.، استخدم DeploymentWhatIf Class.
الخطوات التالية
- لاستخدام عملية "what-if" في خط التدفق، راجع اختبار قوالب ARM باستخدام What-If in a pipeline.
- إذا لاحظت نتائج غير صحيحة من عملية "what-if"، فالرجاء الإبلاغ عن المشكلات على https://aka.ms/whatifissues.
- للوصول إلى وحدة Learn النمطية التي تشرح كيفية استخدام عملية "what-if"، راجع معاينة التغييرات والتحقق من صحة موارد Azure باستخدام عملية "what-if" ومجموعة أدوات اختبار قالب ARM.