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

لقطة شاشة لعملية what-if لتوزيع قالب Resource Manager مع حمولة الموارد الكاملة وأنواع التغيير.

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

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

لمعاينة التغييرات قبل توزيع أحد القوالب، استخدم:

يمكنك استخدام مفتاح التبديل --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 سبعة أنواع مختلفة من التغييرات:

  • الإنشاء: عندما يكون المورد غير موجود حاليًّا ولكن تم تحديده في القالب. سيتم إنشاء المورد.
  • الحذف: يُطبق نوع التغيير هذا فقط عند استخدام وضع الإكمال للتوزيع. المورد موجود، ولكن غير معرّف في القالب. عند استخدام وضع الاستكمال، سيتم حذف المورد. يتم فقط تضمين الموارد التي تدعم حذف الوضع الكامل في نوع التغيير هذا.
  • التجاهل: المورد موجود ولكن غير معرّف في القالب. لن يتم توزيع المورد أو تعديله. عند الوصول إلى حدود توسيع القوالب المتداخلة، ستواجه نوع التغيير هذا. راجع حدود ماذا لو.
  • لا يوجد تغيير: المورد موجود ومعرّف في القالب. ستتم إعادة توزيع المورد، ولكن لن تتغير خصائص المورد. يُرجع هذا النوع من التغيير عند تعيين 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 Manager تظهر مخرجات عملية 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 Manager اكتمل إخراج عملية what-if في وضع التوزيع.

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

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.

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