Operação what-if da implementação de modelos do Resource Manager

Antes de implementar um modelo de Resource Manager do Azure (modelo arm), pode pré-visualizar as alterações que irão ocorrer. O Azure Resource Manager fornece a operação what-if para lhe permitir ver como os recursos serão alterados se implementar o modelo. A operação what-if não faz alterações aos recursos existentes. Em vez disso, prevê as alterações se o modelo especificado for implementado.

Pode utilizar a operação de hipóteses com operações Azure PowerShell, CLI do Azure ou API REST. O what-if é suportado para o grupo de recursos, subscrição, grupo de gestão e implementações ao nível do inquilino.

Recursos de preparação

Para saber mais sobre o what-if e para obter orientações práticas, veja Pré-visualizar as alterações de implementação do Azure com o what-if.

Permissões obrigatórias

Para implementar um ficheiro Bicep ou modelo do ARM, precisa de acesso de escrita nos recursos que está a implementar e acesso a todas as operações no tipo de recurso Microsoft.Resources/deployments. Por exemplo, para implementar uma máquina virtual, precisa Microsoft.Compute/virtualMachines/write e Microsoft.Resources/deployments/* permissões. A operação what-if tem os mesmos requisitos de permissão.

Para obter uma lista de funções e permissões, veja Funções incorporadas do Azure.

Limites de hipóteses

O what-if expande os modelos aninhados até que estes limites sejam atingidos:

  • 500 modelos aninhados.
  • 800 grupos de recursos numa implementação entre grupos de recursos.
  • 5 minutos necessários para expandir os modelos aninhados.

Quando um dos limites é atingido, o tipo de alteração dos recursos restantes é definido como Ignorar.

Instalar o módulo Azure PowerShell

Para utilizar o what-if no PowerShell, tem de ter a versão 4.2 ou posterior do módulo Az.

Para instalar o módulo, utilize:

Install-Module -Name Az -Force

Para obter mais informações sobre como instalar módulos, veja Instalar Azure PowerShell.

Instalar o módulo da CLI do Azure

Para utilizar o what-if na CLI do Azure, tem de ter a CLI do Azure 2.14.0 ou posterior. Se for necessário, instale a versão mais recente da CLI do Azure.

Ver resultados

Quando utiliza o what-if no PowerShell ou na CLI do Azure, a saída inclui resultados codificados por cores que o ajudam a ver os diferentes tipos de alterações.

Captura de ecrã a mostrar Resource Manager operação de hipóteses de implementação de modelos com payload completo de recursos e tipos de alteração.

A saída do texto é:

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.

Nota

A operação what-if não consegue resolver a função de referência. Sempre que definir uma propriedade para uma expressão de modelo que inclua a função de referência, o what-if comunica que a propriedade será alterada. Este comportamento acontece porque compara o valor atual da propriedade (por true exemplo, ou false para um valor booleano) com a expressão de modelo não resolvida. Obviamente, estes valores não corresponderão. Quando implementa o modelo, a propriedade só será alterada quando a expressão do modelo for resolvida para um valor diferente.

Comandos de hipótese

Azure PowerShell

Para pré-visualizar as alterações antes de implementar um modelo, utilize New-AzResourceGroupDeployment ou New-AzSubscriptionDeployment. Adicione o -Whatif parâmetro switch ao comando de implementação.

  • New-AzResourceGroupDeployment -Whatif para implementações de grupos de recursos

  • New-AzSubscriptionDeployment -Whatif e New-AzDeployment -Whatif para implementações ao nível da subscrição

Pode utilizar o -Confirm parâmetro switch para pré-visualizar as alterações e ser-lhe pedido para continuar com a implementação.

  • New-AzResourceGroupDeployment -Confirm para implementações de grupos de recursos
  • New-AzSubscriptionDeployment -Confirm e New-AzDeployment -Confirm para implementações ao nível da subscrição

Os comandos anteriores devolvem um resumo de texto que pode inspecionar manualmente. Para obter um objeto que pode inspecionar programaticamente para obter alterações, utilize Get-AzResourceGroupDeploymentWhatIfResult ou Get-AzSubscriptionDeploymentWhatIfResult.

  • $results = Get-AzResourceGroupDeploymentWhatIfResult para implementações de grupos de recursos
  • $results = Get-AzSubscriptionDeploymentWhatIfResult ou $results = Get-AzDeploymentWhatIfResult para implementações ao nível da subscrição

CLI do Azure

Para pré-visualizar as alterações antes de implementar um modelo, utilize:

Pode utilizar o comutador (ou o --confirm-with-what-if respetivo formulário -ccurto) para pré-visualizar as alterações e ser-lhe pedido para continuar com a implementação. Adicione este comutador a:

Por exemplo, utilize az deployment group create --confirm-with-what-if ou -c para implementações de grupos de recursos.

Os comandos anteriores devolvem um resumo de texto que pode inspecionar manualmente. Para obter um objeto JSON que pode inspecionar programaticamente para ver se existem alterações, utilize o --no-pretty-print comutador. Por exemplo, utilize az deployment group what-if --no-pretty-print para implementações de grupos de recursos.

Se quiser devolver os resultados sem cores, abra o ficheiro de configuração da CLI do Azure . Defina no_color como sim.

API REST do Azure

Para a API REST, utilize:

Tipos de alterações

A operação what-if lista sete tipos diferentes de alterações:

  • Criar: o recurso não existe atualmente, mas está definido no modelo. O recurso será criado.
  • Eliminar: este tipo de alteração só se aplica ao utilizar o modo completo para implementação. O recurso existe, mas não está definido no modelo. Com o modo completo, o recurso será eliminado. Apenas os recursos que suportam a eliminação completa do modo estão incluídos neste tipo de alteração.
  • Ignorar: o recurso existe, mas não está definido no modelo. O recurso não será implementado ou modificado. Quando atingir os limites para expandir modelos aninhados, encontrará este tipo de alteração. Veja Limites de hipóteses.
  • NoChange: o recurso existe e é definido no modelo. O recurso será novamente implementado, mas as propriedades do recurso não mudam. Este tipo de alteração é devolvido quando ResultFormat está definido como FullResourcePayloads, que é o valor predefinido.
  • NoEffect: a propriedade está pronta apenas e será ignorada pelo serviço. Por exemplo, a sku.tier propriedade está sempre definida para corresponder sku.name no Microsoft.ServiceBus espaço de nomes.
  • Modificar: o recurso existe e é definido no modelo. O recurso será novamente implementado e as propriedades do recurso mudam. Este tipo de alteração é devolvido quando ResultFormat está definido como FullResourcePayloads, que é o valor predefinido.
  • Implementar: o recurso existe e é definido no modelo. O recurso será novamente implementado. As propriedades do recurso podem ou não ser alteradas. A operação devolve este tipo de alteração quando não tiver informações suficientes para determinar se há propriedades que vão mudar. Só verá esta condição quando ResultFormat estiver definido como ResourceIdOnly.

Formato dos resultados

Controla o nível de detalhe devolvido sobre as alterações previstas. Tem duas opções:

  • FullResourcePayloads – devolve uma lista de recursos que serão alterados e detalhes sobre as propriedades que serão alteradas
  • ResourceIdOnly - devolve uma lista de recursos que serão alterados

O valor predefinido é FullResourcePayloads.

Para comandos de implementação do PowerShell, utilize o -WhatIfResultFormat parâmetro . Nos comandos de objeto programático, utilize o ResultFormat parâmetro .

Para a CLI do Azure, utilize o --result-format parâmetro .

Os seguintes resultados mostram os dois formatos de saída diferentes:

  • Payloads de recursos completos

    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.
    
  • Apenas ID do Recurso

    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.
    

Executar a operação what-if

Configurar o ambiente

Para ver como funciona o what-if, vamos executar alguns testes. Em primeiro lugar, implemente um modelo que cria uma rede virtual. Irá utilizar esta rede virtual para testar a forma como as alterações são comunicadas pelo 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"

Modificação de teste

Após a conclusão da implementação, está pronto para testar a operação what-if. Desta vez, vai implementar um modelo que altera a rede virtual. Falta uma das etiquetas originais, uma sub-rede foi removida e o prefixo de endereço foi alterado.

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"

O resultado de what-if é semelhante a:

Captura de ecrã a mostrar Resource Manager resultado da operação what-if da implementação do modelo a mostrar as alterações.

A saída de texto é:

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.

Repare na parte superior do resultado que as cores estão definidas para indicar o tipo de alterações.

Na parte inferior do resultado, mostra que a etiqueta Proprietário foi eliminada. O prefixo de endereço foi alterado de 10.0.0.0/16 para 10.0.0.0/15. A sub-rede denominada sub-rede001 foi eliminada. Lembre-se de que estas alterações não foram implementadas. Verá uma pré-visualização das alterações que ocorrerão se implementar o modelo.

Algumas das propriedades listadas como eliminadas não serão realmente alteradas. As propriedades podem ser comunicadas incorretamente como eliminadas quando não estão no modelo, mas são definidas automaticamente durante a implementação como valores predefinidos. Este resultado é considerado "ruído" na resposta what-if. O recurso implementado final terá os valores definidos para as propriedades. À medida que a operação what-if amadurece, estas propriedades serão filtradas do resultado.

Avaliar programaticamente os resultados de hipóteses

Agora, vamos avaliar programaticamente os resultados de hipótese ao definir o comando como uma variável.

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

Pode ver um resumo de cada alteração.

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

Confirmar eliminação

A operação what-if suporta a utilização do modo de implementação. Quando definido para o modo de conclusão, os recursos que não estão no modelo são eliminados. O exemplo seguinte implementa um modelo que não tem recursos definidos no modo completo.

Para pré-visualizar as alterações antes de implementar um modelo, utilize o parâmetro confirm switch com o comando de implementação. Se as alterações forem as esperadas, responda que pretende que a implementação seja concluída.

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"

Uma vez que não são definidos recursos no modelo e o modo de implementação está definido para ser concluído, a rede virtual será eliminada.

Captura de ecrã a mostrar Resource Manager saída da operação what-if da implementação de modelos no modo de implementação concluída.

A saída de texto é:

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

Verá as alterações esperadas e pode confirmar que pretende que a implementação seja executada.

SDKs

Pode utilizar a operação what-if através dos SDKs do Azure.

Passos seguintes