Prever o que uma implementação fará com what-if

Concluído

Qualquer pessoa que esteja implantando ou modificando recursos em um ambiente tem perguntas como estas em mente:

  • Vou causar alguma falha?
  • Vou apagar alguma coisa?
  • Como é que esta implementação afetará os recursos existentes?
  • Posso validar que o que eu espero que aconteça é realmente o que acontecerá na implantação, antes de pressionar o botão de implantação?

Implantar e esperar o melhor não é uma boa abordagem. Uma melhor abordagem é a operação what-if. Essa operação ajuda você a antecipar as consequências de uma nova implantação, se você tentar.

O Azure Resource Manager disponibiliza a operação what-if para realçar as alterações quando implementa um modelo. A operação what-if não faz alterações aos recursos existentes. Prevê as alterações que irão ocorrer se o modelo especificado for implementado num grupo de recursos e nível de subscrição.

Nota

A operação hipotética às vezes mostra que um recurso mudará quando, na verdade, nenhuma alteração acontecerá. Estamos a trabalhar para reduzir estes problemas, mas precisamos da sua ajuda. Por favor, relate esses problemas.

O uso da operação hipotética compara o modelo de estado atual com o modelo de estado desejado. A operação hipotética confirma se as alterações feitas pelo seu modelo correspondem às suas expectativas sem aplicar essas alterações aos recursos reais ou ao estado desses recursos.

Controlar o formato dos resultados hipotéticos

O New-AzResourceGroupDeployment cmdlet do Azure PowerShell cria uma nova implantação para um grupo de recursos. Quando você adiciona o parâmetro a esse comando, o -Whatif comando muda de realizar a implantação para meramente relatar uma visualização do que acontecerá se você executá-la.

O az deployment group what-if comando fornece uma visualização do que acontecerá se você executar uma implantação.

Você pode controlar a quantidade de saída de texto da operação hipotética usando um destes formatos de resultado:

  • FullResourcePayloads. Ao incluir este parâmetro, obtém um resultado verboso que consiste numa lista de recursos que irão mudar. O resultado também mostra detalhes sobre todas as propriedades que irão mudar de acordo com o modelo.
  • ResourceIdOnly. Este modo devolve uma lista dos recursos que irão mudar, mas não todos os detalhes.

Por exemplo, suponha que está a alterar o tipo de armazenamento num modelo que implementa uma conta de armazenamento num ambiente existente.

Você pode executar o seguinte código do PowerShell e solicitar que o Gerenciador de Recursos forneça todas as cargas úteis de recursos:

New-AzResourceGroupDeployment `
  -ResourceGroupName ToyStorage `
  -TemplateFile $templateFileName `
  -WhatIf `
  -WhatIfResultFormat FullResourcePayloads
az deployment group what-if \
  --resource-group ToyStorage \
  --template-file $templateFile \
  --result-format FullResourcePayloads

O comando anterior produz os seguintes resultados:

Resource and property changes are indicated with this symbol:
  ~ Modify

The deployment will update the following scope:

Scope: /subscriptions/f0750bbe-ea75-4ae5-b24d-a92ca601da2c/resourceGroups/ToyStorage

  ~ Microsoft.Storage/storageAccounts/bz64gjjpidbuvi [2019-06-01]
    ~ sku.name: "Standard_LRS" => "Standard_GRS"

Resource changes: 1 to modify.

Em seguida, você pode executar novamente o comando, mas apenas pedir as IDs do recurso:

New-AzResourceGroupDeployment `
  -ResourceGroupName ToyStorage `
  -TemplateFile $templateFileName `
  -WhatIf `
  -WhatIfResultFormat ResourceIdOnly
az deployment group what-if \
  --resource-group ToyStorage \
  --template-file $templateFile \
  --result-format ResourceIdOnly

O comando anterior produz os seguintes resultados:

Resource and property changes are indicated with this symbol:
  ! Deploy

The deployment will update the following scope:

Scope: /subscriptions/f0750bbe-ea75-4ae5-b24d-a92ca601da2c/resourceGroups/ToyStorage

  ! Microsoft.Storage/storageAccounts/bz64gjjpidbuvi

Resource changes: 1 to deploy.

Tipos de alterações que as hipóteses detetam

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

Type Explicação Efeito
Criar O recurso não existe atualmente, mas está definido no modelo. O recurso será criado.
Eliminar Este tipo de alteração aplica-se apenas ao utilizar o modo completo para implementação. O recurso existe, mas não está definido no modelo. Se você implantar usando o modo incremental, o recurso não será excluído. Se você implantar usando o modo completo, o recurso será excluído. Esse tipo de alteração é retornado somente para recursos que oferecem suporte à exclusão através do modo completo.
Ignorar O recurso existe, mas não está definido no modelo. Quando você usa o modo incremental, que é o modo de implantação padrão, o recurso não é implantado ou modificado. Se você implantar usando o modo completo, o recurso será excluído.
NãoAlteração O recurso existe e está definido no modelo. O recurso será novamente implementado, mas as propriedades do recurso não mudam. Esse tipo de alteração é retornado quando o formato de resultado é definido como FullResourcePayloads, que é o formato de resultado padrão.
Modificar O recurso existe e está definido no modelo. O recurso será novamente implementado e as propriedades do recurso mudam. Esse tipo de alteração é retornado quando o formato de resultado é definido como FullResourcePayloads, que é o formato de resultado padrão.
Implementar O recurso existe e está definido no modelo. O recurso será novamente implementado. As propriedades do recurso podem ou não mudar. 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. Essa condição é exibida somente quando o formato do resultado é definido como ResourceIdOnly.

Se você não precisa saber todos os tipos de alteração, pode usar o -WhatIfExcludeChangeType argumento para omitir os tipos nos quais não está interessado.

Se você não precisa saber todos os tipos de alteração, pode usar o --what-if-exclude-change-types argumento para omitir os tipos nos quais não está interessado.

Usar resultados hipotéticos em um script

Talvez você queira usar a saída da operação hipotética em um script ou como parte de um processo de implantação automatizado.

Você pode obter os resultados usando o Get-AzResourceGroupDeploymentWhatIfResult cmdlet. Em seguida, o script pode analisar os resultados e executar qualquer lógica personalizada que você possa precisar.

Você pode obter os resultados JSON brutos anexando o --no-pretty-print argumento ao comando da CLI. Em seguida, o script pode analisar os resultados e executar qualquer lógica personalizada que você possa precisar.

Modos de implantação e exclusão de recursos

Há momentos em que você deseja confirmar a exclusão de recursos à medida que implanta o modelo. Para esse fim, a operação hipotética é responsável pelo modo de implantação que você usa. Se você usar o modo de implantação completo, o Gerenciador de Recursos informará os recursos que excluirá porque eles não estão definidos em sua implantação.

Vejamos um exemplo de um modelo que atualiza um recurso existente e é implantado no modo completo:

Diagram showing change types for three resources, some of which already exist.

Aqui está uma explicação do que está acontecendo neste exemplo:

  • O modelo está atualizando uma conta de armazenamento chamada storage-1, que já está implantada. O SKU está mudando de LRS para GRS, e a tag está mudando de owner valor para Equipe A. A saída hipotética mostra um tipo de alteração Modificar para este recurso.
  • O modelo está criando uma nova conta do Azure Cosmos DB chamada cosmos-db-1, que ainda não existe no grupo de recursos. A saída hipotética mostra um tipo de alteração Criar para este recurso.
  • O modelo não inclui o servidor lógico SQL do Azure que já existe no grupo de recursos. Como a implantação usa o modo completo, a saída hipotética mostra um tipo de alteração Excluir para este recurso. Se a implantação usasse o modo incremental em vez do modo completo, o tipo de alteração seria Ignorar .

Confirme suas implantações

Para visualizar as alterações antes de implantar um modelo, use o parâmetro com o -Confirm comando deployment. Se as alterações forem as esperadas, confirme que pretende concluir a implementação.

Gorjeta

É uma boa ideia executar os comandos de implantação com o -Confirm switch, especialmente se você estiver implantando no modo completo. Se você usar o -Confirm interruptor, você tem a chance de parar a operação se você não gosta das alterações propostas.

Para visualizar as alterações antes de implantar um modelo, use o argumento com o --confirm-with-what-if comando deployment. Se as alterações forem as esperadas, confirme que pretende concluir a implementação.

Gorjeta

É uma boa ideia executar seus comandos de implantação com o --confirm-with-what-if argumento, especialmente se você estiver implantando no modo completo. Se você usar o --confirm-with-what-if interruptor, você tem a chance de parar a operação se você não gosta das alterações propostas.