عملية 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، يتضمن الإخراج نتائج مرمزة بالألوان تساعدك في رؤية الأنواع المختلفة من التغييرات.

عملية what-if لتوزيع Bicep fullresourcepayload وتغيير الأنواع

إخراج النص هو:

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، استخدم:

يمكنك استخدام مفتاح --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، استخدم:

أنواع التغيير

تسرد عملية ماذا لو سبعة أنواع مختلفة من التغييرات:

  • إنشاء: لا يكون المورد موجود حاليًا ولكن تم تعريفه في ملف 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" مشابهاً لـ:

إخراج عملية what-if لتوزيع 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.

لاحظ في الجزء العلوي من الإخراج أن الألوان محددة للإشارة إلى نوع التغييرات.

في الجزء السفلي من الإخراج، يظهر أنه تم حذف مالك العلامة. تم تغيير بادئة العنوان من 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"

إخراج عملية what-if لتوزيع 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.

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