Dela via


ARM-mallarnas distribution med what-if-åtgärd

Innan du distribuerar en Azure Resource Manager-mall (ARM-mall) kan du förhandsgranska de ändringar som kommer att ske. Azure Resource Manager tillhandahåller vad-if operationen för att låta dig se hur resurserna kommer att förändras om du distribuerar mallen. Tänk om-operationen gör inga ändringar på befintliga resurser. I stället får du se vilka ändringar som görs om du distribuerar den angivna mallen.

Du kan använda tänk-om-operationen med Azure PowerShell, Azure CLI eller REST API. What-if stöds för distributioner på resursgrupp, prenumeration, hanteringsgrupp och klientorganisationsnivå.

Utbildningsresurser

För att lära dig mer om beräkningar av hypotetiska scenarier och få praktisk vägledning, se Förhandsgranska ändringar i Azure-distribution med hjälp av "vad-händer om" analyser.

Förutsättningar

Behörigheter som krävs

För att distribuera en Bicep-fil eller EN ARM-mall (Azure Resource Manager) behöver du skrivåtkomst till de resurser som du distribuerar och åtkomst till alla åtgärder i Microsoft.Resources/deployments resurstypen. Till exempel, för att installera en virtuell dator behöver du Microsoft.Compute/virtualMachines/write och Microsoft.Resources/deployments/* behörigheter. What-if-operationen har samma behörighetskrav.

Azure CLI version 2.76.0 eller senare och Azure PowerShell version 13.4.0 eller senare introducerar ValidationLevel-växeln för att fastställa hur noggrant ARM validerar Bicep-mallen under den här processen. Mer information finns i What-if-kommandon

Det finns en lista med roller och behörigheter i Inbyggda roller i Azure.

Vad händer om-gränser

What-if expanderar kapslade mallar tills dessa gränser har nåtts:

  • 500 kapslade mallar.
  • 800 resursgrupper i en distribution över resursgrupper.
  • 5 minuter för att expandera de kapslade mallarna.

När en av gränserna har nåtts är de återstående resursernas ändringstyp inställd på Ignorera.

Installera Azure PowerShell-modul

Om du vill använda konsekvens i PowerShell måste du ha version 4.2 eller senare av Az-modulen.

Om du vill installera modulen använder du:

Install-Module -Name Az -Force

Mer information om hur du installerar moduler finns i Installera Azure PowerShell.

Installera Azure CLI-modulen

Om du vill använda konsekvens i Azure CLI måste du ha Azure CLI 2.14.0 eller senare. Installera den senaste versionen av Azure CLI om det behövs.

Se resultat

När du använder what-if i PowerShell eller Azure CLI innehåller utdata färgkodade resultat som hjälper dig att se de olika typerna av ändringar.

Skärmbild av distribution av Resource Manager-mall med hypotetisk operation med fullständig resursdetalj och ändringstyper.

Textutdata är:

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.

Anmärkning

Simuleringsoperationen kan inte lösa referensfunktionen. Varje gång du anger en egenskap till ett malluttryck som innehåller referensfunktionen ändras konsekvensrapporter för egenskapen. Det här beteendet inträffar eftersom what-if jämför det nuvarande värdet av egenskapen (till exempel true eller false för ett booleskt värde) med det olösta malluttrycket. Det är uppenbart att dessa värden inte matchar. När du distribuerar mallen förändras egenskapen bara när uttrycket i mallen utvärderas till ett annat värde.

Hypotetiska kommandon

Azure PowerShell

Om du vill förhandsgranska ändringar innan du distribuerar en mall använder du New-AzResourceGroupDeployment eller New-AzSubscriptionDeployment. -Whatif Lägg till växelparametern i distributionskommandot.

  • New-AzResourceGroupDeployment -Whatif för resursgruppsdistributioner

  • New-AzSubscriptionDeployment -Whatif och New-AzDeployment -Whatif för distributioner på prenumerationsnivå

Du kan använda switchparametern -Confirm för att förhandsgranska ändringarna och uppmanas att fortsätta med distributionen.

  • New-AzResourceGroupDeployment -Confirm för resursgruppsdistributioner
  • New-AzSubscriptionDeployment -Confirm och New-AzDeployment -Confirm för distributioner på prenumerationsnivå

Föregående kommandon returnerar en textsammanfattning som du kan granska manuellt. Om du vill hämta ett objekt som du kan inspektera programmatiskt efter ändringar, använder du Get-AzResourceGroupDeploymentWhatIfResult eller Get-AzSubscriptionDeploymentWhatIfResult.

  • $results = Get-AzResourceGroupDeploymentWhatIfResult för resursgruppsdistributioner
  • $results = Get-AzSubscriptionDeploymentWhatIfResult eller $results = Get-AzDeploymentWhatIfResult för distributioner på prenumerationsnivå

Azure CLI (kommandoradsgränssnittet för Azure)

Om du vill förhandsgranska ändringar innan du distribuerar en mall använder du:

Du kan använda växeln --confirm-with-what-if (eller dess korta formulär -c) för att förhandsgranska ändringarna och uppmanas att fortsätta med distributionen. Lägg till den här växeln till:

Du kan till exempel använda az deployment group create --confirm-with-what-if eller -c för resursgruppsdistributioner.

Föregående kommandon returnerar en textsammanfattning som du kan granska manuellt. Om du vill hämta ett JSON-objekt som du programmatiskt kan kontrollera efter ändringar använder du växeln --no-pretty-print . Du kan till exempel använda az deployment group what-if --no-pretty-print för resursgruppsdistributioner.

Om du vill returnera resultatet utan färger öppnar du Azure CLI-konfigurationsfilen . Ställ in no_colorJa.

REST-API för Azure

För REST API använder du:

Ändringstyper

Tänk om-operationen listar sju olika typer av förändringar.

  • Skapa: Resursen finns för närvarande inte men definieras i mallen. Resursen skapas.
  • Ta bort: Den här ändringstypen gäller endast när du använder fullständigt läge för distribution. Resursen finns, men definieras inte i mallen. I fullständigt läge tas resursen bort. Det är bara resurser med stöd för fullständigt borttagningsläge som ingår i den här ändringstypen.
  • Ignorera: Resursen finns men definieras inte i mallen. Resursen kommer inte att distribueras eller ändras. När du når gränserna för att expandera kapslade mallar visas den här ändringstypen. Se Vad händer om-gränser.
  • NoChange: Resursen finns och definieras i mallen. Resursen distribueras om, men resursens egenskaper ändras inte. Den här ändringstypen returneras när ResultFormat är inställt på FullResourcePayloads, vilket är standardvärdet.
  • NoEffect: Egenskapen är endast klar och ignoreras av tjänsten. Till exempel är egenskapen sku.tier alltid inställd på att matcha sku.name i Microsoft.ServiceBus namnrymden.
  • Ändra: Resursen finns och definieras i mallen. Resursen distribueras på nytt och resursens egenskaper ändras. Den här ändringstypen returneras när ResultFormat är inställt på FullResourcePayloads, vilket är standardvärdet.
  • Distribuera: Resursen finns och definieras i mallen. Resursen distribueras på nytt. Egenskaperna för resursen kan förändras eller inte. Åtgärden returnerar den här ändringstypen när den inte har tillräckligt med information för att avgöra om några egenskaper kommer att ändras. Du ser bara det här villkoret när ResultFormat är inställt på ResourceIdOnly.

Resultatformat

Du styr detaljnivån som returneras om de förutsagda ändringarna. Du har två alternativ:

  • FullResourcePayloads – returnerar en lista över resurser som kommer att ändras och information om de egenskaper som kommer att ändras
  • ResourceIdOnly – returnerar en lista över resurser som kommer att ändras

Standardvärdet är FullResourcePayloads.

Använd parametern för PowerShell-distributionskommandon -WhatIfResultFormat . Använd parametern i de programmatiska objektkommandona ResultFormat .

Använd --result-format-parametern för Azure CLI.

Följande resultat visar de två olika utdataformaten:

  • Fullständiga resursnyttolaster

    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.
    
  • Endast resurs-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.
    

Kör hypotetisk operation

Konfigurera miljö

Om du vill se hur "what-if"-scenarier fungerar, låt oss köra några tester. Distribuera först en mall som skapar ett virtuellt nätverk. Du använder det här virtuella nätverket för att testa hur ändringar rapporteras av what-if.

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"

Teständring

När distributionen är klar är du redo att testa "vad händer om"-operationen. Den här gången distribuerar du en mall som ändrar det virtuella nätverket. Den saknar en av de ursprungliga taggarna, ett undernät har tagits bort och adressprefixet har ändrats.

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"

Utdata för hypotetiska scenarier ser ut ungefär så här:

Skärmbild av distribueringsresultat för hypotetisk åtgärdsoperation av Resource Manager-mall som visar ändringar.

Textutdata är:

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.

Observera överst i utdata att färger har definierats för att ange typ av ändringar.

Längst ned i utdata visas taggen Ägare har tagits bort. Adressprefixet ändrades från 10.0.0.0/16 till 10.0.0.0/15. Undernätet med namnet subnet001 togs bort. Kom ihåg att dessa ändringar inte har distribuerats. Du ser en förhandsgranskning av de ändringar som sker om du distribuerar mallen.

Vissa av de egenskaper som visas som borttagna ändras inte. Egenskaper kan rapporteras felaktigt som borttagna när de inte finns i mallen, men anges automatiskt under distributionen som standardvärden. Det här resultatet anses vara "brus" i konsekvenssvaret. Den sista distribuerade resursen har värdena inställda för egenskaperna. När vad-om-operationen mognar filtreras dessa egenskaper bort från resultatet.

Utvärdera hypotetiska resultat programmatiskt

Nu ska vi programmatiskt utvärdera vad-om-resultaten genom att tilldela kommandot till en variabel.

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

Du kan se en sammanfattning av varje ändring.

foreach ($change in $results.Changes)
{
  $change.Delta
}

Bekräfta borttagning

Tänk om-operationen stöder användning av distributionsläge. När det är inställt på slutfört läge tas resurser som inte finns i mallen bort. I följande exempel distribueras en mall som inte har några resurser definierade i fullständigt läge.

Om du vill förhandsgranska ändringar innan du distribuerar en mall använder du parametern confirm switch med distributionskommandot. Om ändringarna är som förväntat svarar du att du vill att distributionen ska slutföras.

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"

Eftersom inga resurser definieras i mallen och distributionsläget är inställt på att slutföras tas det virtuella nätverket bort.

Skärmbild av Resource Manager-mallens resultat av hypotetisk åtgärd i distributionsläge slutfört.

Textutdata är:

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"):

Du ser de förväntade ändringarna och kan bekräfta att du vill att distributionen ska köras.

SDK:er

Du kan använda konsekvensåtgärden via Azure SDK:er.

Nästa steg