عملية 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 على الوضع yes.

Azure REST API

بالنسبة لواجهة برمجة تطبيقات REST، استخدم:

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

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

  • إنشاء: لا يكون المورد موجود حاليًا ولكن تم تعريفه في ملف 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@2023-11-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@2023-11-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، ولكن يتم تعيينها تلقائيًا أثناء التوزيع كقيم افتراضية. تعتبر هذه النتيجة خاطئة "noise" في استجابة عملية "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» من خلال عدة تطوير البرامج (SDKs) من Azure.

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