Поделиться через


Развертывание шаблона ARM с помощью операции "что если"

Перед развертыванием шаблона Azure Resource Manager (шаблон ARM) можно просмотреть изменения, которые будут происходить. Azure Resource Manager предоставляет операцию "что если", чтобы узнать, как будут изменяться ресурсы при развертывании шаблона. Операция what-if не вносит никаких изменений в существующие ресурсы. Вместо этого она прогнозирует изменения, которые произойдут при развертывании указанного шаблона.

Вы можете использовать операцию what-if с операциями Azure PowerShell, Azure CLI или REST API. Поддержка функции "Что произойдет, если" осуществляется для групп ресурсов, подписок, групп управления и развертываний на уровне арендатора.

Обучающие материалы

Чтобы узнать больше о what-if и получить практические рекомендации, см. статью Предварительный просмотр изменений развертывания Azure, используя what-if.

Предпосылки

Необходимые разрешения

Для развертывания шаблона Bicep или Azure Resource Manager (ARM) требуется доступ на запись для ресурсов, которые развертываете, и доступ ко всем операциям для типа ресурса Microsoft.Resources/deployments. Например, для развертывания виртуальной машины необходимы разрешения Microsoft.Compute/virtualMachines/write и Microsoft.Resources/deployments/*. Операция what-if имеет те же требования к разрешениям.

Azure CLI версии 2.76.0 или более поздней и Azure PowerShell версии 13.4.0 или более поздней представляют параметр ValidationLevel, чтобы определить, насколько тщательно ARM проверяет шаблон Bicep в процессе. Дополнительные сведения см. в разделе "Что если"

Список ролей и разрешений см. в статье Встроенные роли Azure.

Ограничения типа "Что, если"

Функция "What-if" разворачивает вложенные шаблоны, пока не будут достигнуты установленные ограничения.

  • 500 вложенных шаблонов.
  • 800 групп ресурсов в развертывании, охватывающем несколько групп ресурсов.
  • Затрачено 5 минут на расширение вложенных шаблонов.

При достижении одного из ограничений для остальных ресурсов тип изменения устанавливается на "Игнорировать".

Установка модуля Azure PowerShell

Чтобы использовать операцию "что если" в PowerShell, необходимо иметь версию 4.2 или более позднюю модуля Az.

Для установки модуля используйте:

Install-Module -Name Az -Force

Дополнительные сведения об установке модулей см. в статье Установка Azure PowerShell.

Установка модуля Azure CLI

Чтобы использовать операцию "что если" в Azure CLI, необходимо иметь Azure CLI версии 2.14.0 или более поздней версии. При необходимости установите последнюю версию Azure CLI.

Просмотр результатов

При использовании функции "что если" в 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.

Замечание

Операция "что если" не может разрешить функцию ссылки. Каждый раз, когда свойству задается выражение шаблона, включающее функцию reference, то операция "что если" сообщает, что свойство изменится. Это происходит, потому что операция "что если" сравнивает текущее значение свойства (например, true или false для логического значения) с неразрешенным выражением шаблона. Очевидно, что эти значения не будут совпадать. При развертывании шаблона свойство изменится только при разрешении выражения шаблона на другое значение.

Команды "что если"

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 (Интерфейс командной строки для Azure)

Чтобы предварительно просмотреть изменения перед развертыванием шаблона, используйте:

Можно использовать параметр-переключатель --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 API используйте:

Типы изменений

Операция "что если" содержит семь различных типов изменений:

  • Create: ресурс в настоящее время не существует, но определен в шаблоне. Этот ресурс будет создан.
  • Удаление. Этот тип изменения применяется только при использовании полного режима для развертывания. Ресурс существует, но не определен в шаблоне. В полном режиме ресурс будет удален. Этот тип изменения применяется только к ресурсам, поддерживающим удаление в полном режиме.
  • Игнорировать: ресурс существует, но не определен в шаблоне. Ресурс не будет развернут или изменён. Когда вы достигнете ограничений для расширения вложенных шаблонов, вы столкнетесь с этим типом изменений. См. ограничения сценария "Что если".
  • 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.
    

Выполните операцию "что если"

Настройка среды

Чтобы узнать, как работает операция "что если", давайте выполним некоторые тесты. Сначала разверните шаблон, создающий виртуальную сеть. Вы будете использовать эту виртуальную сеть для тестирования того, как изменения сообщаются операцией "что если".

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"

Проверка изменений

После завершения развертывания вы можете протестировать операцию "что если". На этот раз вы развернете шаблон, который изменяет виртуальную сеть. Отсутствует один из исходных тегов, одна подсеть была удалена, и префикс адреса изменился.

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"

Результат операции "что если" выглядит примерно так:

Снимок экрана с результатами гипотетической операции развертывания шаблона 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 удалена. Не забудьте, эти изменения так и не были развернуты. Вы увидите предварительный просмотр изменений, которые будут происходить при развертывании шаблона.

Некоторые свойства, перечисленные как удаленные, фактически не меняются. Свойства могут быть неправильно сообщены как удаленные, если они не находятся в шаблоне, но автоматически задаются во время развертывания в качестве значений по умолчанию. Этот результат считается "шумом" в гипотетическом ответе. Окончательный развернутый ресурс будет иметь значения, заданные для свойств. После завершения операции "что если" эти свойства отфильтруются из результата.

Программное вычисление результатов "что если"

Теперь давайте программно оценим результаты "что если", присвоив команде значение переменной.

$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" через SDK Azure.

Дальнейшие шаги