Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Před nasazením souboru Bicep můžete zobrazit náhled změn, ke kterým dojde. Azure Resource Manager (ARM) poskytuje operaci citlivostní analýza, která vám umožní zjistit, jak se prostředky změní, když nasadíte soubor Bicep. Operace „what-if“ neprovede žádné změny stávajících prostředků. Místo toho předpovídá změny, pokud je zadaný soubor Bicep nasazen.
Operaci citlivostní analýzy můžete použít s Visual Studio Code, Azure PowerShellem, Azure CLI nebo operacemi rozhraní REST API. Funkce "Co by se stalo, kdyby" je podporována pro nasazení na úrovni skupiny prostředků, předplatného, řídící skupiny a nájemce.
Během operací typu "co kdyby" není podpora pro hodnocení a rozšiřování templateLink. V důsledku toho se všechny prostředky nasazené pomocí odkazů na šablony v rámci vnořených nasazení, včetně referencí na specifikace šablon, nezobrazí ve výsledcích operace Co-kdyby.
Požadavky
Požadována oprávnění
Pokud chcete nasadit soubor Bicep nebo šablonu Azure Resource Manageru (ARM), potřebujete přístup k zápisu k prostředkům, které nasazujete, a přístup ke všem operacím s typem Microsoft.Resources/deployments prostředku. Pokud chcete například nasadit virtuální počítač, potřebujete Microsoft.Compute/virtualMachines/write a Microsoft.Resources/deployments/* oprávnění. Operace typu "co kdyby" má stejné požadavky na povolení.
Azure CLI verze 2.76.0 nebo novější a Azure PowerShell verze 13.4.0 nebo novější zavádí přepínač ValidationLevel a zjistěte, jak důkladně ARM během tohoto procesu ověřuje šablonu Bicep. Další informace najdete v tématu Příkazy citlivostní citlivosti.
Seznam rolí a oprávnění najdete v tématu Předdefinované role Azure.
Installation
Pokud chcete v Azure CLI použít příkaz "what-if", musíte mít Azure CLI verzi 2.14.0 nebo novější. V případě potřeby si nainstalujte nejnovější verzi Azure CLI.
Omezení
What-if rozbalí vnořené šablony, dokud nebudou dosaženy tyto limity:
- 500 vnořených šablon.
- 800 skupin prostředků v nasazení napříč skupinami prostředků.
- Rozšíření vnořených šablon trvalo 5 minut.
Po dosažení jednoho z limitů je typ změny zbývajících prostředků nastavený na Ignorovat.
Zkratování
Operace citlivostní analýzy v nasazeních Bicep se může setkat se scénářem "zkratování", kdy služba nemůže plně analyzovat modul nebo prostředek kvůli struktuře nasazení nebo závislostem na externím stavu. Zkratování jednotlivých prostředků nastane, když jeho ID prostředku nebo verze rozhraní API nelze vypočítat mimo kontext nasazení, často kvůli nevyřešeným výrazům nebo externím závislostem. Další informace naleznete v tématu Nehodnocené výrazy. I když může dojít i ke vzácnému zkratování modulů nebo vnořených prostředků nasazení, což vede k vyloučení všech prostředků v rámci modulu z výsledků analýzy citlivostní analýzy. V takových případech odpověď rozhraní API obsahuje diagnostickou zprávu označující problém.
Spuštění operace citlivostní operace
Použití nedávné verze modulu Az PowerShell (13.1.0 nebo novější) nebo Azure CLI (2.75.0 nebo novější) poskytne diagnostiku, když citlivostní analýza části nasazení nemůže analyzovat. Starší verze těchto nástrojů se chovají stejným způsobem, ale nezobrazují diagnostiku. Pokud například používáte verzi 2.74.0 rozhraní příkazového řádku (CLI), k problému stále dochází – jen se to děje nenápadně.
Příkazy 'co kdyby'
Pokud chcete zobrazit náhled změn před nasazením souboru Bicep, použijte:
- az deployment group what-if pro nasazení do skupiny prostředků
- az deployment sub what-if pro nasazení na úrovni předplatného
- az deployment mg what-if pro nasazení skupiny pro správu
- az deployment tenant what-if pro nasazení tenantů
Azure CLI verze 2.76.0 nebo novější zavádí --validation-level přepínač, který určuje, jak důkladně ARM během tohoto procesu ověří šablonu Bicep. Přijímá následující hodnoty:
- Zprostředkovatel (výchozí): Provádí úplné ověření, včetně syntaxe šablony, definic prostředků, závislostí a kontrol oprávnění, abyste měli dostatečná oprávnění k nasazení všech prostředků v šabloně.
- ProviderNoRbac: Provádí úplné ověření šablony a prostředků, podobně jako poskytovatel, ale kontroluje oprávnění ke čtení pro každý prostředek, nikoli úplná oprávnění k nasazení. To je užitečné, když chcete ověřit konfigurace prostředků bez nutnosti úplného přístupu.
- Šablona: Provádí pouze statické ověřování, kontroluje syntaxi a strukturu šablony při přeskočení předběžných kontrol (např. dostupnost prostředků) a kontroly oprávnění. To je méně důkladné, potenciálně chybějící problémy, které by mohly způsobit selhání nasazení.
Pomocí přepínače --confirm-with-what-if (nebo jeho krátké formy -c) můžete zobrazit náhled změn a zobrazí se výzva k pokračování v nasazení. Přidejte tento přepínač do:
- az deployment group create - vytvořit skupinu nasazení
- az deployment sub create - příkaz pro vytvoření nasazení.
- az deployment mg create
- az deployment tenant create
Můžete například použít az deployment group create --confirm-with-what-if nebo -c pro nasazení skupin prostředků.
Předchozí příkazy vrátí textový souhrn, který můžete ručně zkontrolovat. Pokud chcete získat objekt JSON, který můžete programově zkontrolovat změny, použijte --no-pretty-print přepínač. Můžete například použít az deployment group what-if --no-pretty-print pro nasazení skupin prostředků.
Pokud chcete vrátit výsledky bez barev, otevřete konfigurační soubor Azure CLI. Nastavte no_color na ano.
Pro rozhraní REST API použijte:
- Nasazení – Co když pro nasazení skupin prostředků
- Nasazení – Co když na úrovni předplatného pro nasazení na úrovni předplatného
- Nasazení – Co když v rozsahu skupiny pro správu pro nasazení ve skupině pro správu
- Nasazení – Co když na úrovni tenanta pro nasazení tenanta.
Operaci what-if můžete použít prostřednictvím sad SDK Azure.
- Pro Python použijte analýzu co kdyby.
- Pro Javu použijte třídu DeploymentWhatIf.
- Pro .NET použijte DeploymentWhatIf třídu.
Nastavení prostředí
Abychom viděli, jak fungují scénáře "co kdyby", spustíme několik testů. Nejprve nasaďte soubor Bicep, který vytvoří virtuální síť. Uložte následující soubor Bicep jako 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'
}
}
]
}
}
K nasazení souboru Bicep použijte:
az group create \
--name ExampleGroup \
--location "Central US"
az deployment group create \
--resource-group ExampleGroup \
--template-file "what-if-before.bicep"
Testovací úprava
Po dokončení nasazení jste připraveni otestovat hypotetickou operaci. Tentokrát nasadíte soubor Bicep, který změní virtuální síť. V porovnání s předchozím příkladem následující příklad vynechá jednu z původních značek, byla odebrána podsíť a předpona adresy se změnila. Uložte následující soubor Bicep jako 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'
}
}
]
}
}
Pokud chcete zobrazit změny, použijte:
az deployment group what-if \
--resource-group ExampleGroup \
--template-file "what-if-after.bicep"
Výstup scénářů "co kdyby" by mohl vypadat takto:
Textový výstup je:
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.
Všimněte si v horní části výstupu, že barvy jsou definované tak, aby označily typ změn.
Na konci výstupu je vidět, že značka Vlastník byla odstraněna. Předpona adresy se změnila z 10.0.0.0/16 na 10.0.0.0/15. Podsíť s názvem subnet001 byla odstraněna. Nezapomeňte, že tyto změny nebyly nasazeny. Zobrazí se náhled změn, ke kterým dojde, když nasadíte soubor Bicep.
Některé vlastnosti, které jsou uvedeny jako odstraněné, se ve skutečnosti nezmění. Vlastnosti mohou být nesprávně hlášeny jako odstraněné, pokud nejsou v souboru Bicep, ale automaticky se nastaví během nasazení jako výchozí hodnoty. Tento výsledek je v hypotetické odpovědi považován za šum. Poslední nasazený prostředek bude mít nastavené hodnoty pro vlastnosti. Jak operace citlivostní analýzy zraje, tyto vlastnosti budou z výsledku vyfiltrovány.
Potvrdit odstranění
Pokud chcete zobrazit náhled změn před nasazením souboru Bicep, použijte s příkazem nasazení parametr přepínače potvrzení. Pokud jsou změny podle očekávání, odpovězte, že chcete nasazení dokončit.
az deployment group create \
--resource-group ExampleGroup \
--confirm-with-what-if \
--template-file "what-if-after.bicep"
Textový výstup je:
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):
Zobrazí se očekávané změny a můžete potvrdit, že má být nasazení spuštěné.
Programově vyhodnocení výsledků analýzy "co-kdyby"
Teď programově vyhodnotíme výsledky analýzy citlivosti tím, že nastavíme příkaz do proměnné.
results=$(az deployment group what-if --resource-group ExampleGroup --template-file "what-if-after.bicep" --no-pretty-print)
Vysvětlení výsledků citlivostní citlivosti
Zobrazení výsledků
Když použijete příkaz what-if v PowerShellu nebo Azure CLI, výstup obsahuje barevně kódované výsledky, které vám pomohou vidět různé typy změn.
Textový výstup je:
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.
Poznámka:
Operace co-kdyby nemůže vyřešit referenční funkci. Pokaždé, když nastavíte vlastnost na výraz šablony, který obsahuje referenční funkci, co-kdyby sestava oznámí, že se vlastnost změní. K tomuto chování dochází, protože co-kdyby porovnává aktuální hodnotu vlastnosti (například true nebo false pro logickou hodnotu) s nevyřešeným výrazem šablony. Tyto hodnoty se samozřejmě nebudou shodovat. Když nasadíte soubor Bicep, vlastnost se změní pouze v případě, že se výraz šablony přeloží na jinou hodnotu.
Typy změn
Co když operace uvádí sedm různých typů změn:
- Vytvoření: Prostředek aktuálně neexistuje, ale je definován v souboru Bicep. Prostředek se vytvoří.
- Odstranit: Tento typ změny platí jenom v případě, že pro nasazení šablony JSON použijete úplný režim . Prostředek existuje, ale není definován v souboru Bicep. V úplném režimu se zdroj odstraní. V tomto typu změny jsou zahrnuté jenom prostředky, které podporují odstranění v úplném režimu.
- Ignorovat: Prostředek existuje, ale není definován v souboru Bicep. Prostředek se nebude nasazovat ani upravovat. Když dosáhnete limitů pro rozšíření vnořených šablon, setkáte se s tímto typem změn. Podívejte se na podmíněné limity.
-
NoChange: Prostředek existuje a je definován v souboru Bicep. Prostředek se znovu nasadí, ale vlastnosti prostředku se nezmění. Tento typ změny se vrátí, když je ResultFormat nastavena na
FullResourcePayloads, což je výchozí hodnota. -
NoEffect: Vlastnost je pouze pro čtení a bude ignorována službou. Například je vlastnost
sku.tiervždy nastavena tak, aby odpovídalasku.namev oboru názvůMicrosoft.ServiceBus. -
Úprava: Prostředek existuje a je definován v souboru Bicep. Prostředek se znovu nasadí a vlastnosti prostředku se změní. Tento typ změny se vrátí, když je ResultFormat nastavena na
FullResourcePayloads, což je výchozí hodnota. -
Nasazení: Prostředek existuje a je definován v souboru Bicep. Prostředek se znovu nasadí. Vlastnosti prostředku se mohou nebo nemusí změnit. Operace vrátí tento typ změny, pokud nemá dostatek informací k určení, jestli se některé vlastnosti změní. Tato podmínka se zobrazí pouze v případě, že je ResultFormat nastaven na
ResourceIdOnly.
Formát výsledku
Můžete nastavit úroveň podrobností, která se vrátí k předpovídaným změnám. K dispozici jsou dvě možnosti:
- FullResourcePayloads – vrátí seznam prostředků, které se změní, a podrobnosti o vlastnostech, které se změní.
- ResourceIdOnly – vrátí seznam prostředků, které se změní.
Výchozí hodnota je FullResourcePayloads.
Pro příkazy nasazení PowerShellu -WhatIfResultFormat použijte parametr. V programových příkazech objektu ResultFormat použijte parametr.
Pro Azure CLI použijte --result-format parametr.
Následující výsledky ukazují dva různé formáty výstupu:
Úplné výstupy zdrojů
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.Pouze ID prostředku
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.
Nehodnocené výrazy
Pokud se ve výstupu zobrazí nehodnocený výraz, znamená to, co když ho nemůže vyhodnotit mimo kontext nasazení. Výraz se zobrazí as-is označující informace, které budou vyplněny při spuštění nasazení.
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
}
}
V předchozím příkladu now používá utcNow() parametr funkci k získání aktuálního data a času. Když spustíte what-if, zobrazí se tyto výrazy as-is, protože je nelze vyhodnotit mimo kontext nasazení. Výstup citlivostní analýza bude vypadat nějak takto:
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.
Následující výrazy se během citlivostní analýza nevyhodnocují:
- Ne deterministické funkce, jako jsou newGuid() a utcNow()
- Všechny odkazy na hodnotu zabezpečeného parametru.
- Odkazy na prostředky, které nejsou nasazeny ve stejné šabloně.
- Odkazy na vlastnosti prostředku, které nejsou definovány ve stejné šabloně.
- Libovolná funkce prostředku, například listKeys().
Vyčištění prostředků
Pokud už ukázkové prostředky nepotřebujete, odstraňte skupinu prostředků pomocí Azure CLI nebo Azure PowerShellu.
az group delete --name ExampleGroup
Další kroky
- Pokud chcete použít operaci what-if v pipeline, přečtěte si téma Testování šablon ARM s what-if v pipeline.
- Pokud si všimnete nesprávných výsledků co kdyby operace, nahlaste problémy na adrese https://aka.ms/whatifissues.