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


Операция "что если" развертывания Bicep

Перед развертыванием Bicep-файла можно предварительно посмотреть изменения, которые произойдут. Операция "что если" в Azure Resource Manager позволяет узнать, как изменятся ресурсы при развертывании Bicep-файла. Операция "что если" не вносит изменений в существующие ресурсы. Вместо этого она прогнозирует изменения, которые произойдут при развертывании указанного Bicep-файла.

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

Во время операций What-If оценка и расширение templateLink не поддерживаются. В результате все ресурсы, развернутые с помощью ссылок на шаблон во вложенных развертываниях, включая ссылки на спецификации шаблонов, не будут отображаться в результатах операции What-If.

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

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

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

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

Список ролей и разрешений см. в статье Встроенные роли 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 для логического значения) с неразрешенным выражением шаблона. Очевидно, что эти значения не будут совпадать. При развертывании Bicep-файла свойство только изменится в том случае, если выражение шаблона приводится к другому значению.

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

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 API используйте:

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

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

  • Create: ресурс в настоящее время не существует, но определен в Bicep-файле. Этот ресурс будет создан.
  • Delete: этот тип изменения возможен только при использовании полного режима развертывания шаблона JSON. Ресурс существует, но не определен в Bicep-файле. В полном режиме ресурс будет удален. Этот тип изменения применяется только к ресурсам, поддерживающим удаление в полном режиме.
  • Ignore: ресурс существует, но не определен в Bicep-файле. Ресурс не будет развернут или изменён. Когда вы достигнете ограничений для расширения вложенных шаблонов, вы столкнетесь с этим типом изменений. См. ограничения сценария "Что если".
  • NoChange: ресурс существует и определен в Bicep-файле. Ресурс будет развернут повторно, но его свойства не изменятся. Такой тип изменения возвращается, если для ResultFormat установлено значение FullResourcePayloads, которое используется по умолчанию.
  • NoEffect: свойство готово только и будет игнорироваться службой. Например, свойство sku.tier всегда должно совпадать с sku.name в пространстве имен Microsoft.ServiceBus.
  • Modify: ресурс существует и определен в Bicep-файле. Ресурс будет развернут повторно, и его свойства изменятся. Такой тип изменения возвращается, если для ResultFormat установлено значение FullResourcePayloads, которое используется по умолчанию.
  • Deploy: ресурс существует и определен в 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.
    

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

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

Чтобы узнать, как работает операция "что если", давайте выполним некоторые тесты. Сначала разверните Bicep-файл, который создает виртуальную сеть. Вы будете использовать эту виртуальную сеть для тестирования того, как изменения сообщаются операцией "что если". Загрузите копию файла 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"

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

После завершения развертывания вы можете протестировать операцию "что если". В этот раз вы развертываете 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"

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

Выходные данные операции

Текстовые выходные данные:

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-файле, но автоматически устанавливаются во время развертывания в качестве значений по умолчанию. Этот результат считается "шумом" в гипотетическом ответе. Окончательный развернутый ресурс будет иметь значения, заданные для свойств. После завершения операции "что если" эти свойства отфильтруются из результата.

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

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

$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"

Гипотетический вариант развертывания 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" через SDK Azure.

Следующие шаги