Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Перед развертыванием шаблона 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)
Чтобы предварительно просмотреть изменения перед развертыванием шаблона, используйте:
- Используйте команду az deployment group what-if для развертывания групп ресурсов.
- Для развертывания на уровне подписки: az deployment sub what-if
- Развертывание групп управления с помощью функции az deployment mg what-if
- Для развертывания тенантов: az deployment tenant what-if
Можно использовать параметр-переключатель --confirm-with-what-if (или его короткую форму-c) для предварительного просмотра изменений и получения запроса на продолжение развертывания. Добавьте этот переключатель в:
- az deployment group create
- az deployment sub create
- az deployment mg create
- az deployment tenant create
Например, используйте 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 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 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.
Для Python используйте what-if.
Для Java используйте DeploymentWhatIf Class.
Для .NET используйте DeploymentWhatIf Class.
Дальнейшие шаги
- Расширение ARM Deployment Insights позволяет легко интегрировать операцию "что если" в конвейере Azure DevOps.
- Сведения об использовании операции "что если" в конвейере см. в статье Тестирование шаблонов ARM с операцией "что если" в конвейере.
- Если вы заметили неверные результаты операции "что если", пожалуйста, сообщите о проблемах по адресу https://aka.ms/whatifissues.
- Для ознакомления с модулем Learn, охватывающим использование функции "what-if", см. Предварительный просмотр изменений и проверка ресурсов Azure с помощью функции "what-if" и тестового набора инструментов шаблонов ARM.