Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om mappen te wijzigen.
Voordat u een Bicep-bestand implementeert, kunt u een voorbeeld bekijken van de wijzigingen die zich voordoen. Azure Resource Manager (ARM) biedt de wat-als-functie waarmee u kunt zien hoe resources zullen veranderen als u het Bicep-bestand implementeert. Met de 'wat-als'-bewerking worden er geen wijzigingen doorgevoerd voor bestaande resources. In plaats daarvan worden de wijzigingen voorspeld als het opgegeven Bicep-bestand wordt geïmplementeerd.
U kunt de wat-als-bewerking gebruiken met Visual Studio Code, Azure PowerShell-, Azure CLI- of REST API-bewerkingen. Wat-als wordt ondersteund voor implementaties van resourcegroepen, voor abonnementen, voor beheergroepen en voor het tenantniveau.
Tijdens Wat-als-bewerkingen worden de evaluatie en de uitbreiding ervan van templateLink niet ondersteund. Als gevolg hiervan zijn alle resources die zijn geïmplementeerd met behulp van sjabloonkoppelingen binnen geneste implementaties, inclusief sjabloonspecificatieverwijzingen, niet zichtbaar in de what-if-bewerkingsresultaten.
Vereiste voorwaarden
Vereiste machtigingen
Als u een Bicep-bestand of Arm-sjabloon (Azure Resource Manager) wilt implementeren, hebt u schrijftoegang nodig voor de resources die u implementeert en toegang tot alle bewerkingen op het Microsoft.Resources/deployments resourcetype. Als u bijvoorbeeld een virtuele machine wilt implementeren, hebt u Microsoft.Compute/virtualMachines/write en Microsoft.Resources/deployments/* machtigingen nodig. De wat-alsbewerking heeft dezelfde machtigingsvereisten.
Azure CLI versie 2.76.0 of hoger en Azure PowerShell versie 13.4.0 of hoger introduceren de switch ValidationLevel om te bepalen hoe grondig ARM de Bicep-sjabloon tijdens dit proces valideert. Zie Wat-als-opdrachten voor meer informatie.
Zie Ingebouwde Azure-rollen voor een lijst met rollen en machtigingen.
Installation
Als u what-if wilt gebruiken in Azure CLI, moet u beschikken over Azure CLI 2.14.0 of hoger. Installeer indien nodig de meest recente versie van Azure CLI.
Beperkingen
Wat-als breidt geneste sjablonen uit totdat deze limieten zijn bereikt:
- 500 geneste sjablonen.
- 800 resourcegroepen in een cross-resourcegroepimplementatie.
- De uitbreiding van de geneste sjablonen duurde vijf minuten.
Wanneer een van de limieten is bereikt, wordt het wijzigingstype van de resterende resources ingesteld op Negeren.
Kortsluiting
De wat-als-bewerking in Bicep-implementaties kan 'kortsluiting' tegenkomen, waarbij de service een module of resource niet volledig kan analyseren vanwege de structuur van de implementatie of afhankelijkheden van de externe status. Kortsluiting van een afzonderlijke resource treedt op wanneer de resource-id of API-versie niet kan worden berekend buiten de implementatiecontext, vaak vanwege onopgeloste expressies of externe afhankelijkheden. Zie Niet-geëvalueerde expressies voor meer informatie. Hoewel zeldzame, kortsluiting van modules of geneste implementatiebronnen ook kan gebeuren, waardoor alle resources in de module worden uitgesloten van de wat-als-analyseresultaten. In dergelijke gevallen bevat het API-antwoord een diagnostisch bericht om het probleem aan te geven.
De wat-als-bewerking uitvoeren
Als u een recente versie van de Az PowerShell-module (13.1.0 of hoger) of de Azure CLI (2.75.0 of hoger) gebruikt, worden diagnostische gegevens verstrekt wanneer een what-if-deel van de implementatie niet kan worden geanalyseerd. Eerdere versies van deze hulpprogramma's gedragen zich op dezelfde manier, maar ze geven de diagnostische gegevens niet weer. Als u bijvoorbeeld CLI-versie 2.74.0 gebruikt, treedt het probleem nog steeds op. Het probleem treedt gewoon op de achtergrond op.
Hypothetische opdrachten
Als u een voorbeeld van wijzigingen wilt bekijken voordat u een Bicep-bestand implementeert, gebruikt u:
- az deployment group what-if voor resource group-implementaties
- az deployment sub what-if voor abonnementsniveau-implementaties
- az deployment mg what-if voor beheer van groepsimplementaties
- az deployment tenant what-if voor huurderimplementaties
Azure CLI versie 2.76.0 of hoger introduceert de --validation-level switch om te bepalen hoe grondig ARM de Bicep-sjabloon valideert tijdens dit proces. De volgende waarden worden geaccepteerd:
- Provider (standaard): Voert volledige validatie uit, inclusief sjabloonsyntaxis, resourcedefinities, afhankelijkheden en machtigingscontroles om ervoor te zorgen dat u over voldoende machtigingen beschikt om alle resources in de sjabloon te implementeren.
- ProviderNoRbac: voert volledige validatie van de sjabloon en resources uit, vergelijkbaar met Provider, maar controleert alleen op leesmachtigingen voor elke resource in plaats van volledige implementatiemachtigingen. Dit is handig als u resourceconfiguraties wilt valideren zonder volledige toegang.
- Sjabloon: voert alleen statische validatie uit, controleert de syntaxis en structuur van de sjabloon tijdens het overslaan van voorbereidende controles (bijvoorbeeld beschikbaarheid van resources) en machtigingscontroles. Dit is minder grondig en kan mogelijk problemen over het hoofd zien die tot implementatiefouten kunnen leiden.
U kunt de --confirm-with-what-if switch (of de korte vorm -c) gebruiken om een voorbeeld van de wijzigingen te bekijken en u wordt gevraagd om door te gaan met de implementatie. Voeg deze functie toe aan:
- az deployment group create (Maak een implementatiegroep aan)
- az deployment sub create (commando voor het creëren van een Azure deployment sub)
- az deployment mg create
- az deployment tenant maken
Gebruik bijvoorbeeld az deployment group create --confirm-with-what-if of -c voor resourcegroepimplementaties.
De voorgaande opdrachten retourneren een tekstoverzicht dat u handmatig kunt inspecteren. Als u een JSON-object wilt ophalen dat u programmatisch op wijzigingen kunt controleren, gebruikt u de --no-pretty-print schakeloptie. Gebruik bijvoorbeeld az deployment group what-if --no-pretty-print voor resourcegroepimplementaties.
Als u de resultaten zonder kleuren wilt retourneren, opent u uw Azure CLI-configuratiebestand . Stel no_color in op Ja.
Voor REST API gebruikt u:
- Implementaties - What If voor implementaties van resourcegroepen
- Implementaties - What If At Subscription Scope voor abonnementsimplementaties
- Implementaties - What If At Management Group Scope voor beheergroepimplementaties
- Implementaties: What If At Tenant Scope voor tenantimplementaties.
U kunt de wat-als-bewerking gebruiken via de Azure SDK's.
- Gebruik wat-als voor Python.
- Gebruik DeploymentWhatIf Class voor Java.
- Gebruik DeploymentWhatIf Class voor .NET.
Omgeving instellen
Laten we een aantal tests uitvoeren om te zien hoe wat-als werkt. Implementeer eerst een Bicep-bestand dat een virtueel netwerk maakt. Sla het volgende Bicep-bestand op als what-if-before.bicep:
resource vnet 'Microsoft.Network/virtualNetworks@2024-07-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'
}
}
]
}
}
Als u het Bicep-bestand wilt implementeren, gebruikt u:
az group create \
--name ExampleGroup \
--location "Central US"
az deployment group create \
--resource-group ExampleGroup \
--template-file "what-if-before.bicep"
Testwijziging
Nadat de implementatie is voltooid, kunt u de wat-als-bewerking testen. Deze keer implementeert u een Bicep-bestand dat het virtuele netwerk wijzigt. Vergeleken met het voorgaande voorbeeld mist het volgende voorbeeld een van de oorspronkelijke tags, is een subnet verwijderd en is het adresvoorvoegsel gewijzigd. Sla het volgende Bicep-bestand op als what-if-after.bicep:
resource vnet 'Microsoft.Network/virtualNetworks@2024-07-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'
}
}
]
}
}
Als u de wijzigingen wilt weergeven, gebruikt u:
az deployment group what-if \
--resource-group ExampleGroup \
--template-file "what-if-after.bicep"
Het what-if resultaat ziet er ongeveer zo uit:
De tekstuitvoer is:
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.
U ziet boven aan de uitvoer dat kleuren zijn gedefinieerd om het type wijzigingen aan te geven.
Onderaan de uitvoer ziet u dat de eigenaar van de tag is verwijderd. Het adresvoorvoegsel is gewijzigd van 10.0.0.0/16 in 10.0.0.0/15. Het subnet met de naam subnet001 is verwijderd. Houd er rekening mee dat deze wijzigingen niet zijn geïmplementeerd. U ziet een voorbeeld van de wijzigingen die plaatsvinden als u het Bicep-bestand implementeert.
Sommige eigenschappen die worden vermeld als verwijderd, worden niet daadwerkelijk gewijzigd. Eigenschappen kunnen onjuist worden gerapporteerd als verwijderd wanneer ze zich niet in het Bicep-bestand bevinden, maar worden automatisch ingesteld tijdens de implementatie als standaardwaarden. Dit resultaat wordt beschouwd als 'ruis' in het what-if-antwoord. De uiteindelijke geïmplementeerde resource bevat de waarden die zijn ingesteld voor de eigenschappen. Naarmate de wat-als-bewerking volwassen wordt, worden deze eigenschappen uit het resultaat gefilterd.
Bevestig verwijdering
Als u een voorbeeld van wijzigingen wilt bekijken voordat u een Bicep-bestand implementeert, gebruikt u de parameter confirm switch met de implementatieopdracht. Als de wijzigingen zijn zoals verwacht, geeft u aan dat u wilt dat de implementatie wordt voltooid.
az deployment group create \
--resource-group ExampleGroup \
--confirm-with-what-if \
--template-file "what-if-after.bicep"
De tekstuitvoer is:
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):
U ziet de verwachte wijzigingen en u kunt bevestigen dat de implementatie moet worden uitgevoerd.
Programmatig what-if scenario resultaten evalueren
Nu gaan we programmatisch de wat-als-resultaten evalueren door de opdracht in te stellen op een variabele.
results=$(az deployment group what-if --resource-group ExampleGroup --template-file "what-if-after.bicep" --no-pretty-print)
Inzicht in wat-als-resultaten
Resultaten weergeven
Wanneer u wat-als gebruikt in PowerShell of Azure CLI, bevat de uitvoer kleurgecodeerde resultaten waarmee u de verschillende typen wijzigingen kunt zien.
De tekstuitvoer is:
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.
Notitie
De wat-als-bewerking kan de verwijzingsfunctie niet oplossen. Telkens wanneer u een eigenschap instelt op een sjabloonexpressie met de verwijzingsfunctie, geven wat-als-rapporten aan dat de eigenschap zal worden gewijzigd. Dit gedrag treedt op omdat wat-als de huidige waarde van de eigenschap (zoals true of false voor een Booleaanse waarde) vergelijkt met de niet-opgeloste sjabloonexpressie. Deze waarden komen uiteraard niet overeen. Wanneer u het Bicep-bestand implementeert, wordt de eigenschap alleen gewijzigd wanneer de sjabloonexpressie wordt omgezet in een andere waarde.
Wijzigingstypen
De wat-als-bewerking bevat zeven verschillende typen wijzigingen:
- Maken: De resource bestaat momenteel niet, maar is gedefinieerd in het Bicep-bestand. De resource wordt gemaakt.
- Verwijderen: dit wijzigingstype is alleen van toepassing wanneer u de volledige modus gebruikt voor de implementatie van JSON-sjablonen. De resource bestaat, maar is niet gedefinieerd in het Bicep-bestand. Met de volledige modus wordt de resource verwijderd. Alleen resources die ondersteuning bieden voor verwijdering in de volledige modus zijn opgenomen in dit wijzigingstype.
- Negeren: de resource bestaat, maar is niet gedefinieerd in het Bicep-bestand. De resource wordt niet geïmplementeerd of gewijzigd. Wanneer u de limieten voor het uitbreiden van geneste sjablonen bereikt, treft u dit wijzigingstype aan. Zie Wat-als-limieten.
-
NoChange: de resource bestaat en is gedefinieerd in het Bicep-bestand. De resource wordt opnieuw geïmplementeerd, maar de eigenschappen van de resource worden niet gewijzigd. Dit wijzigingstype wordt geretourneerd wanneer ResultFormat is ingesteld op
FullResourcePayloads, wat de standaardwaarde is. -
NoEffect: De eigenschap is alleen gereed en wordt genegeerd door de service. De
sku.tiereigenschap is bijvoorbeeld altijd ingesteld om overeen te komen metsku.namein deMicrosoft.ServiceBusnaamruimte. -
Wijzigen: De resource bestaat en is gedefinieerd in het Bicep-bestand. De resource wordt opnieuw geïmplementeerd en de eigenschappen van de resource worden gewijzigd. Dit wijzigingstype wordt geretourneerd wanneer ResultFormat is ingesteld op
FullResourcePayloads, wat de standaardwaarde is. -
Implementeren: De resource bestaat en is gedefinieerd in het Bicep-bestand. De hulpbron wordt opnieuw ingezet. De eigenschappen van de resource worden mogelijk wel of niet gewijzigd. De bewerking retourneert dit wijzigingstype wanneer er niet genoeg informatie is om te bepalen of eigenschappen worden gewijzigd. U ziet deze voorwaarde alleen wanneer ResultFormat is ingesteld op
ResourceIdOnly.
Resultaatopmaak
U bepaalt het detailniveau dat wordt teruggegeven over de voorspelde wijzigingen. U hebt twee opties:
- FullResourcePayloads : retourneert een lijst met resources die worden gewijzigd en details over de eigenschappen die worden gewijzigd
- ResourceIdOnly : retourneert een lijst met resources die worden gewijzigd
De standaardwaarde is FullResourcePayloads.
Gebruik de -WhatIfResultFormat parameter voor PowerShell-implementatieopdrachten. Gebruik de ResultFormat parameter in de programmatische objectopdrachten.
Gebruik de --result-format parameter voor Azure CLI.
In de volgende resultaten worden de twee verschillende uitvoerindelingen weergegeven:
Volledige resource-inhoud
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.Alleen resource-ID
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.
Niet-geëvalueerde expressies
Als een niet-geëvalueerde expressie wordt weergegeven in de uitvoer, betekent dit wat-als deze niet kan worden geëvalueerd buiten de context van een implementatie. De expressie wordt weergegeven as-is om de informatie aan te geven die wordt ingevuld wanneer de implementatie wordt uitgevoerd.
param now string = utcNow()
resource sa 'Microsoft.Storage/storageAccounts@2025-01-01' = {
name: 'acct'
location: resourceGroup().location
sku: {
name: 'Standard_LRS'
}
kind: 'StorageV2'
tags: {
lastDeployedOn: now
lastDeployedBy: deployer().userPrincipalName
}
}
In het voorgaande voorbeeld gebruikt de now parameter de utcNow() functie om de huidige datum en tijd op te halen. Wanneer u wat-als uitvoert, worden deze expressies weergegeven as-is omdat ze niet buiten de context van een implementatie kunnen worden geëvalueerd. De wat-als-uitvoer ziet er ongeveer als volgt uit:
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.
De volgende expressies worden niet geëvalueerd tijdens wat-als:
- Niet-deterministische functies, zoals newGuid() en utcNow()
- Een verwijzing naar een veilige parameterwaarde.
- Verwijzingen naar resources die niet in dezelfde sjabloon zijn geïmplementeerd.
- Verwijzingen naar resource-eigenschappen die niet in dezelfde sjabloon zijn gedefinieerd.
- Elke resourcefunctie, zoals listKeys().
Middelen opschonen
Wanneer u de voorbeeldresources niet meer nodig hebt, gebruikt u Azure CLI of Azure PowerShell om de resourcegroep te verwijderen.
az group delete --name ExampleGroup
Volgende stappen
- Als u de What-If-bewerking in een pijplijn wilt gebruiken, raadpleegt u ARM-sjablonen testen met What-If in een pijplijn.
- Als u onjuiste resultaten ziet bij de wat-als-bewerking, meld de problemen dan op https://aka.ms/whatifissues.
- Voor een Learn-module die het gebruik van what-if demonstreert, ziet u Preview-wijzigingen en valideer Azure-resources met behulp van what-if en de test-toolkit voor ARM-sjablonen.