عملية ""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 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 على نعم.

Azure REST API

بالنسبة لـ REST API، استخدم:

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

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

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

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

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

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

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.

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