Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Перед развертыванием файла Bicep можно предварительно просмотреть изменения, которые будут происходить. Azure Resource Manager предоставляет операцию "что если", чтобы узнать, как будут изменяться ресурсы при развертывании файла Bicep. Операция "что если" не вносит изменений в существующие ресурсы. Вместо этого он прогнозирует изменения в случае, если указанный Bicep-файл будет развернут.
Подобно команде "what-if", команда bicep snapshot выполняет локальное тестирование, создавая и сравнивая нормализованное JSON-представление вашей инфраструктуры для выявления непреднамеренных изменений логики, не требуя подключения к Azure. Сравнение см. в «Сравнение снимка и что если».
Операцию what-if можно использовать с операциями Visual Studio Code, Azure PowerShell, Azure CLI или REST API. Поддержка функции "Что произойдет, если" осуществляется для групп ресурсов, подписок, групп управления и развертываний на уровне арендатора.
Во время операций What-If оценка и расширение templateLink не поддерживаются. В результате все ресурсы, развернутые с помощью ссылок на шаблон во вложенных развертываниях, включая ссылки на спецификации шаблонов, не будут отображаться в результатах операции 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 встроенные роли.
Installation
Чтобы использовать what-if в Azure CLI, необходимо иметь Azure CLI 2.14.0 или более поздней версии. При необходимости установите последнюю версию Azure CLI.
Ограничения
Функция "What-if" разворачивает вложенные шаблоны, пока не будут достигнуты установленные ограничения.
- 500 вложенных шаблонов.
- 800 групп ресурсов в развертывании, охватывающем несколько групп ресурсов.
- Затрачено 5 минут на расширение вложенных шаблонов.
При достижении одного из ограничений для остальных ресурсов тип изменения устанавливается на "Игнорировать".
Короткое замыкание
Операция "что если" при развертывании Bicep может столкнуться с "логическим прерыванием" — ситуацией, в которой служба не может полностью проанализировать модуль или ресурс из-за структуры развертывания или зависимостей на внешнее состояние. Прерывание отдельного ресурса происходит, когда его идентификатор или версия API не может быть вычислен вне данного контекста развертывания, часто обусловлено неразрешенными выражениями или внешними зависимостями. Дополнительные сведения см. в разделе "Неоцененные выражения". Хотя это случается редко, короткое замыкание модулей или вложенных ресурсов развертывания также может происходить, в результате чего все ресурсы в модуле исключаются из результатов анализа "what-if". В таких случаях ответ API содержит диагностическое сообщение, указывающее проблему.
Выполнение операции "что если"
Использование новой версии модуля Az PowerShell (13.1.0 или более поздней) или Azure CLI (2.75.0 или более поздней) предоставит возможность диагностики, если не удается проанализировать часть процесса развертывания. Более ранние версии этих средств ведут себя так же, но они не отображают диагностику. Например, если вы используете CLI версии 2.74.0, проблема по-прежнему возникает, она просто происходит незаметно.
Команды "что если"
Чтобы просмотреть изменения перед развертыванием файла Bicep, используйте:
- Используйте команду az deployment group what-if для развертывания групп ресурсов.
- Для развертывания на уровне подписки: az deployment sub what-if
- Развертывание групп управления с помощью функции az deployment mg what-if
- Для развертывания тенантов: az deployment tenant what-if
Azure CLI версии 2.76.0 или более поздней вводит переключатель --validation-level, чтобы определить, как тщательно Azure Resource Manager проверяет шаблон Bicep в ходе данного процесса. Он принимает следующие значения:
- Поставщик (по умолчанию): выполняет полную проверку, включая синтаксис шаблона, определения ресурсов, зависимости и проверки разрешений, чтобы обеспечить достаточно разрешений для развертывания всех ресурсов в шаблоне.
- ProviderNoRbac: выполняет полную проверку шаблона и ресурсов, аналогичных поставщику, но проверяет только разрешения на чтение для каждого ресурса, а не полные разрешения на развертывание. Это полезно, если требуется проверить конфигурации ресурсов без полного доступа.
- Шаблон. Выполняет только статическую проверку, проверяет синтаксис шаблона и структуру при пропуске предварительных проверок (например, доступности ресурсов) и проверок разрешений. Это менее тщательный подход, который потенциально может упустить проблемы, способные вызвать сбои развертывания.
Можно использовать параметр-переключатель --confirm-with-what-if (или его короткую форму-c) для предварительного просмотра изменений и получения запроса на продолжение развертывания. Добавьте этот переключатель в:
- az deployment group create - команда для создания группы развертывания.
- az deployment sub create
- az deployment mg create
- az deployment tenant create - команда для создания арендатора в Azure.
Например, используйте 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 (Да).
Для REST API используйте:
- Для развертываний групп ресурсов: Анализ 'что если'
- Для развертывания подписок: Развертывания — "что если" в области подписок
- Для развертывания групп управления: Развертывания — "что если" в области групп управления
- Для развертываний арендаторов: Развертывания — "что если" в области арендатора
Операцию what-if можно использовать с помощью Azure SDKs.
- Для Python используйте what-if.
- Для Java используйте класс DeploymentWhatIf.
- Для .NET используйте класс DeploymentWhatIf.
Настройка среды
Чтобы узнать, как работает операция "что если", давайте выполним некоторые тесты. Сначала разверните файл Bicep, создающий виртуальную сеть. Сохраните следующий файл Bicep как what-if-before.bicep:
resource vnet 'Microsoft.Network/virtualNetworks@2025-01-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, используйте следующую команду:
az group create \
--name ExampleGroup \
--location "Central US"
az deployment group create \
--resource-group ExampleGroup \
--template-file "what-if-before.bicep"
Проверка изменений
После завершения развертывания вы можете протестировать операцию "что если". На этот раз вы развернете файл Bicep, который изменяет виртуальную сеть. По сравнению с предыдущим примером, следующий пример пропускает один из исходных тегов, подсеть была удалена, а префикс адреса изменен. Сохраните следующий файл Bicep как what-if-after.bicep:
resource vnet 'Microsoft.Network/virtualNetworks@2025-01-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'
}
}
]
}
}
Чтобы просмотреть изменения, используйте:
az deployment group what-if \
--resource-group ExampleGroup \
--template-file "what-if-after.bicep"
Результат операции "что если" выглядит примерно так:
Текстовые выходные данные:
Resource and property changes are indicated with these symbols:
- Delete
+ Create
~ Modify
- 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"
properties.defaultOutboundAccess: false
properties.privateEndpointNetworkPolicies: "Disabled"
properties.privateLinkServiceNetworkPolicies: "Enabled"
]
Resource changes: 1 to modify.
Обратите внимание, что в верхней части выходных данных определены цвета, указывающие на тип изменений.
В нижней части выходных данных видно, что владелец тега был удален. Префикс адреса изменился с 10.0.0.0/16 на 10.0.0.0/15. Подсеть с именем subnet001 удалена. Не забудьте, эти изменения так и не были развернуты. Вы увидите предварительный просмотр изменений, которые будут происходить при развертывании файла Bicep.
Некоторые свойства, перечисленные как удаленные, фактически не меняются. Свойства могут быть ошибочно отмечены как удалённые, когда они отсутствуют в файле Bicep, но автоматически устанавливаются во время развертывания в качестве значений по умолчанию. Этот результат считается "шумом" в гипотетическом ответе. Окончательный развернутый ресурс будет иметь значения, заданные для свойств. После завершения операции "что если" эти свойства отфильтруются из результата.
Подтверждение удаления
Чтобы предварительно просмотреть изменения перед развертыванием файла Bicep, используйте параметр -Confirm с командой развертывания. Если изменения соответствуют ожидаемым, ответьте, что вы хотите, чтобы развертывание было завершено.
az deployment group create \
--resource-group ExampleGroup \
--confirm-with-what-if \
--template-file "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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/ExampleGroup
~ Microsoft.Network/virtualNetworks/vnet-001 [2024-07-01]
- properties.privateEndpointVNetPolicies: "Disabled"
- 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"
properties.defaultOutboundAccess: false
properties.privateEndpointNetworkPolicies: "Disabled"
properties.privateLinkServiceNetworkPolicies: "Enabled"
]
Resource changes: 1 to modify.
Are you sure you want to execute the deployment? (y/n):
Вы увидите ожидаемые изменения и можете подтвердить, что вы хотите выполнить это развертывание.
Программное вычисление результатов "что если"
Теперь давайте программно оценим результаты "что если", присвоив команде значение переменной.
results=$(az deployment group what-if --resource-group ExampleGroup --template-file "what-if-after.bicep" --no-pretty-print)
Понимание результатов условного анализа
Показать результаты
При использовании функции "что если" в 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, если выражение шаблона рассчитывается до другого значения.
Типы изменений
Операция "что если" содержит семь различных типов изменений:
- 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.
Неоцененные выражения
Если неоцененное выражение отображается в выходных данных, это означает, что функция "что если" не может оценить его за пределами контекста развертывания. Выражение отображается в исходном виде, чтобы указать сведения, которые будут вставлены при выполнении развертывания.
param now string = utcNow()
resource sa 'Microsoft.Storage/storageAccounts@2025-06-01' = {
name: 'acct'
location: resourceGroup().location
sku: {
name: 'Standard_LRS'
}
kind: 'StorageV2'
tags: {
lastDeployedOn: now
lastDeployedBy: deployer().userPrincipalName
}
}
В предыдущем примере now параметр использует utcNow() функцию для получения текущей даты и времени. При запуске what-if эти выражения отображаются as-is, так как они не могут быть оценены вне контекста развертывания. Выходные данные what-if будут выглядеть примерно так:
Note: The result may contain false positive predictions (noise).
You can help us improve the accuracy of the result by opening an issue here: https://aka.ms/WhatIfIssues
Resource and property changes are indicated with this symbol:
~ Modify
The deployment will update the following scope:
Scope: /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/jgaotest
~ Microsoft.Storage/storageAccounts/acct0808 [2025-01-01]
~ tags.lastDeployedOn: "20250808T200145Z" => "[utcNow()]"
Resource changes: 1 to modify.
Следующие выражения не вычисляются в условиях "что если":
- Недетерминированные функции, такие как newGuid() и utcNow()
- Любая ссылка на значение безопасного параметра.
- Ссылки на ресурсы, которые не развернуты в одном шаблоне.
- Ссылки на свойства ресурсов, которые не определены в одном шаблоне.
- Любая функция ресурсов, например listKeys().
Очистка ресурсов
Если вам больше не нужны примеры ресурсов, используйте Azure CLI или Azure PowerShell для удаления группы ресурсов.
az group delete --name ExampleGroup
Следующие шаги
- Сведения об использовании операции "что если" в конвейере см. в статье Тестирование шаблонов ARM с операцией "что если" в конвейере.
- Если вы заметили неправильные результаты операции типа "что если", сообщите о проблемах по адресу https://aka.ms/whatifissues.