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

Antes de implementar um modelo de Resource Manager Azure (modelo ARM), pode visualizar as alterações que irão ocorrer. O Azure Resource Manager fornece a operação "e se" para que possa ver como os recursos vão mudar 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 "e se" com Azure PowerShell, Azure CLI ou REST API. E se for suportado para implantações de grupo de recursos, subscrição, grupo de gestão e nível de inquilino.

Recursos de formação

Para saber mais sobre o que-se, e para orientação prática, consulte as alterações de implementação do Preview Azure utilizando o "e se".

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 implantar uma máquina virtual, é necessário Microsoft.Compute/virtualMachines/write e Microsoft.Resources/deployments/* permissões. A operação "e se" tem os mesmos requisitos de permissão.

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

Instalar Azure PowerShell módulo

Para utilizar o que se em PowerShell, tem de ter a versão 4.2 ou mais tarde do módulo Az.

Para instalar o módulo, utilize:

Install-Module -Name Az -Force

Para obter mais informações sobre a instalação de módulos, consulte Azure PowerShell instalar.

Instalar módulo CLI Azure

Para utilizar o "e se" em Azure CLI, tem de ter Azure CLI 2.14.0 ou mais tarde. Se for necessário, instale a versão mais recente da CLI do Azure.

Ver resultados

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

Resource Manager implantação do modelo e se operar a carga de pagamento e alterar tipos

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

O "e se" não consegue resolver a função de referência. Cada vez que define uma propriedade para uma expressão de modelo que inclui a função de referência, e se reportar que a propriedade mudará. Este comportamento acontece porque o que-se compara o valor atual da propriedade (como true ou false por um valor booleano) com a expressão do modelo não resolvido. Obviamente, estes valores não vão corresponder. Quando implementar o modelo, a propriedade só mudará quando a expressão do modelo se resolver a um valor diferente.

E se comandos

Azure PowerShell

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

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

Pode utilizar o parâmetro do -Confirm switch para visualizar as alterações e ser solicitado 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 de nível de subscrição

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

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

CLI do Azure

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

Pode utilizar o interruptor (ou a --confirm-with-what-if sua forma -ccurta) para visualizar as alterações e ser solicitado para continuar com a implementação. Adicione este interruptor a:

Por exemplo, utilização az deployment group create --confirm-with-what-if ou -c para implantações de grupos de recursos.

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

Se pretender devolver os resultados sem cores, abra o seu ficheiro de configuração Azure CLI . Desem no_color para sim.

API REST do Azure

Para REST API, utilize:

Tipos de alterações

A operação do "e se" enumera seis tipos diferentes de alterações:

  • Criar: O recurso não existe atualmente, mas está definido no modelo. O recurso será criado.

  • Excluir: Este tipo de alteração só se aplica quando se utiliza o modo completo de implantaçã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.

  • Ignore: O recurso existe, mas não está definido no modelo. O recurso não será implementado ou modificado.

  • 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 o ResultadoFormat está definido para FullResourcePayloads, que é o valor padrão.

  • 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 o ResultadoFormat está definido para FullResourcePayloads, que é o valor padrão.

  • 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ó se vê esta condição quando o ResultadoFormat está definido para ResourceIdOnly.

Formato dos resultados

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

  • FullResourcePayloads - devolve uma lista de recursos que mudarão e detalhes sobre as propriedades que vão mudar
  • ResourceIdOnly - devolve uma lista de recursos que vão mudar

O valor predefinido é FullResourcePayloads.

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

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

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

  • Cargas completas de recursos

    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 de recursos

    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 o que se operar

Configurar ambiente

Para ver como funciona, vamos fazer alguns testes. Primeiro, implemente um modelo que cria uma rede virtual. Você vai usar esta rede virtual para testar como as mudanças são reportadas pelo e-se.

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 do teste

Depois da colocação terminar, está pronto para testar a operação "e se". Desta vez implementa um modelo que altera a rede virtual. Falta-lhe uma das etiquetas originais, uma sub-rede foi removida, e o prefixo do endereço mudou.

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:

Resource Manager implantação do modelo e se a saída da operaçã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.

Note na parte superior da saída que as cores são definidas para indicar o tipo de alterações.

Na parte inferior da saída, mostra que a etiqueta Proprietário foi eliminada. O prefixo do endereço passou de 10.0.0.0/16 para 10.0.0.0/15. A sub-rede denominada subnet001 foi eliminada. Lembre-se que estas mudanças não foram implementadas. Você vê uma pré-visualização das alterações que irão acontecer se implementar o modelo.

Algumas das propriedades que estão listadas como eliminadas não vão realmente mudar. As propriedades podem ser incorretamente reportadas como eliminadas quando não estão no modelo, mas são automaticamente definidas durante a implementação como valores predefinidos. Este resultado é considerado "ruído" na resposta "e se". O recurso implantado final terá os valores definidos para as propriedades. À medida que o funcionamento do "e se" amadurecer, estas propriedades serão filtradas do resultado.

Avaliar programáticamente os resultados do que se

Agora, vamos avaliar programáticamente os resultados do "e se", definindo o comando para 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 mudança.

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

Confirmar eliminação

O e-se funcionamento suporta o modo de implantação. Quando definido para o modo completo, os recursos que não estão no modelo são eliminados. O exemplo a seguir implementa um modelo que não tem recursos definidos em 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 como esperava, responda que deseja que a implementação esteja 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"

Como nenhum dos recursos é definido no modelo e o modo de implementação está definido para ser concluído, a rede virtual será eliminada.

Resource Manager o modo de implementação do modelo completo

A saída do 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"):

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

SDKs

Pode utilizar a operação "e se" através dos Azure SDKs.

Passos seguintes