Operación what-if de la implementación de plantilla de Resource Manager

Antes de implementar una plantilla de Azure Resource Manager (plantilla de ARM), puede obtener una vista previa de los cambios que se producirán. Azure Resource Manager proporciona la operación hipotética que le permite ver cómo cambiarán los recursos si implementa la plantilla. La operación hipotética no realiza ningún cambio en los recursos existentes. En su lugar, predice los cambios si se implementa la plantilla especificada.

Puede usar la operación what-if con Azure PowerShell, la CLI de Azure o las operaciones de la API REST. La operación what-if se admite en las implementaciones de grupos de recursos, nivel de suscripción, grupos de administración e inquilinos.

Recursos de aprendizaje

Para más información sobre las operaciones hipotéticas y una guía práctica, consulte el módulo Vista previa de los cambios de implementación de Azure mediante el uso de hipótesis.

Permisos necesarios

Para implementar un archivo de Bicep o una plantilla de ARM, se necesita acceso de escritura en los recursos que implementa y acceso a todas las operaciones del tipo de recurso Microsoft.Resources/deployments. Por ejemplo, para implementar una máquina virtual, necesita los permisos Microsoft.Compute/virtualMachines/write y Microsoft.Resources/deployments/*. La operación what-if tiene los mismos requisitos de permisos.

Para obtener una lista de roles y permisos, consulte Roles integrados de Azure.

Límites de hipótesis

Una hipótesis expande plantillas anidadas hasta que se alcancen estos límites:

  • 500 plantillas anidadas.
  • 800 grupos de recursos en una implementación entre grupos de recursos.
  • 5 minutos para expandir las plantillas anidadas.

Cuando se alcanza uno de los límites, el tipo de cambio de los recursos restantes se establece en Omitir.

Instalación del módulo de Azure PowerShell

Para usar operaciones what-if en PowerShell, debe tener la versión 4.2 o posterior del módulo Az.

Para instalar el módulo, use:

Install-Module -Name Az -Force

Para más información sobre cómo instalar los módulos, consulte Instalación de Azure PowerShell.

Instalación del módulo de la CLI de Azure

Para usar what-if en la CLI de Azure, debe tener la CLI de Azure versión 2.14.0 o posterior. Si es necesario, instale la versión más reciente de la CLI de Azure.

Ver los resultados

Cuando se usa what-if en PowerShell o la CLI de Azure, la salida incluye resultados codificados por colores que le ayudarán a apreciar los distintos tipos de cambios.

Captura de pantalla de operación hipotética de implementación de plantilla de Resource Manager de cargas de recursos completas y tipos de cambio.

La salida de texto es:

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

La operación what-if no puede resolver la función de referencia. Cada vez que se establece una propiedad en una expresión de plantilla que incluye la función de referencia, la operación what-if informa que la propiedad cambiará. Este comportamiento se produce porque la operacióno what-if compara el valor actual de la propiedad (como true o false para un valor booleano) con la expresión de plantilla sin resolver. Obviamente, estos valores no coinciden. Cuando se implementa la plantilla, la propiedad solo cambia cuando la expresión de plantilla se resuelve en un valor diferente.

Comandos what-if

Azure PowerShell

Para obtener una vista previa de los cambios antes de implementar una plantilla, use New-AzResourceGroupDeployment o New-AzSubscriptionDeployment. Agregue el parámetro de modificador -Whatif al comando de implementación.

  • New-AzResourceGroupDeployment -Whatif para implementaciones de grupos de recursos

  • New-AzSubscriptionDeployment -Whatif y New-AzDeployment -Whatif para implementaciones de nivel de suscripción

Puede usar el parámetro de modificador -Confirm para obtener una vista previa de los cambios y recibir un aviso para continuar con la implementación.

  • New-AzResourceGroupDeployment -Confirm para implementaciones de grupos de recursos
  • New-AzSubscriptionDeployment -Confirm y New-AzDeployment -Confirm para implementaciones de nivel de suscripción

Los comandos anteriores devuelven un resumen de texto que puede inspeccionar manualmente. Para obtener un objeto que se pueda inspeccionar mediante programación en busca de cambios, use Get-AzResourceGroupDeploymentWhatIfResult o Get-AzSubscriptionDeploymentWhatIfResult.

  • $results = Get-AzResourceGroupDeploymentWhatIfResult para implementaciones de grupos de recursos
  • $results = Get-AzSubscriptionDeploymentWhatIfResult o $results = Get-AzDeploymentWhatIfResult para implementaciones de nivel de suscripción

Azure CLI

Para obtener una vista previa de los cambios antes de implementar una plantilla, use:

Puede usar el modificador --confirm-with-what-if (o su forma abreviada -c) para obtener una vista previa de los cambios y recibir un aviso para continuar con la implementación. Agregue este modificador a:

Por ejemplo, use az deployment group create --confirm-with-what-if o -c para implementaciones de grupos de recursos.

Los comandos anteriores devuelven un resumen de texto que puede inspeccionar manualmente. Para obtener un objeto JSON en el que pueda inspeccionar los cambios mediante programación, use el modificador --no-pretty-print. Por ejemplo, use az deployment group what-if --no-pretty-print para implementaciones de grupos de recursos.

Si quiere devolver los resultados sin colores, abra el archivo de configuración de la CLI de Azure. Establezca no_color en yes.

API REST de Azure

Para la API REST, use:

Tipos de cambio

La operación hipotética muestra siete tipos diferentes de cambios:

  • Crear: El recurso no existe actualmente, pero se define en la plantilla. Se creará el recurso.
  • Eliminar: Este tipo de cambio solo se aplica cuando se usa Modo completo para la implementación. El recurso existe, pero no se define en la plantilla. Con el modo completo, se eliminará el recurso. Solo los recursos que admiten la eliminación de modo completo se incluyen en este tipo de cambio.
  • Ignorar: El recurso existe, pero no se define en la plantilla. No se implementará ni modificará el recurso. Cuando alcance los límites para expandir plantillas anidadas, encontrará este tipo de cambio. Consulte Límites de hipótesis.
  • NoChange: El recurso existe y se define en la plantilla. El recurso se volverá a implementar, pero las propiedades del recurso no cambiarán. Este tipo de cambio se devuelve cuando ResultFormat se establece en FullResourcePayloads, que es el valor predeterminado.
  • NoEffect: la propiedad es de solo lectura y el servicio la omitirá. Por ejemplo, la propiedad sku.tier siempre se establece para que coincida con sku.name en el espacio de nombres Microsoft.ServiceBus.
  • Modificar: El recurso existe y se define en la plantilla. El recurso se volverá a implementar y las propiedades del recurso cambiarán. Este tipo de cambio se devuelve cuando ResultFormat se establece en FullResourcePayloads, que es el valor predeterminado.
  • Implementación: El recurso existe y se define en la plantilla. El recurso será reimplementado. Es posible que las propiedades del recurso cambien o no. La operación devuelve este tipo de cambio cuando no tiene información suficiente para determinar si cualquier propiedad cambiará. Solo verá esta condición cuando ResultFormat se establece en ResourceIdOnly.

Formato de resultado

Puede controlar el nivel de detalle que se devuelve sobre la predicción de cambios. Tiene dos opciones:

  • FullResourcePayloads: devuelve una lista de los recursos que van a cambiar y detalles sobre las propiedades que cambiarán.
  • ResourceIdOnly: devuelve una lista de los recursos que cambiarán.

El valor predeterminado es FullResourcePayloads.

Para los comandos de implementación de PowerShell, use el parámetro -WhatIfResultFormat. En los comandos de objeto de programación, use el parámetro ResultFormat.

Para la CLI de Azure, use el parámetro --result-format.

Los resultados siguientes muestran los dos formatos de salida diferentes:

  • Cargas de recursos completas

    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.
    
  • Solo identificador de 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.
    

Ejecutar la operación hipotética

Configuración de entorno

Para ver cómo funciona, vamos a ejecutar algunas pruebas. En primer lugar, implemente una plantilla que cree una red virtual. Usará esta red virtual para probar cómo se registran los cambios con 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"

Modificación de prueba

Una vez finalizada la implementación, está listo para probar la operación hipotética. En esta ocasión, va a implementar una plantilla que cambia la red virtual. Falta una de las etiquetas originales, se ha quitado una subred y el prefijo de dirección ha cambiado.

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"

La salida de what-if es similar a esta:

Captura de pantalla de la implementación de plantilla de Resource Manager modo de implementación de salida con cambios.

La salida de texto es:

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.

Observe en la parte superior de la salida que los colores están definidos para indicar el tipo de cambios.

En la parte inferior de la salida, se muestra que se eliminó el propietario de la etiqueta. El prefijo de dirección cambió de 10.0.0.0/16 a 10.0.0.0/15. Se eliminó la subred denominada subnet001. Recuerde que estos cambios no se implementaron. Obtendrá una vista previa de los cambios que se producirán si implementa la plantilla.

Algunas de las propiedades que se enumeran como eliminadas no cambiarán realmente. Las propiedades se pueden notificar incorrectamente como eliminadas cuando no están en la plantilla, pero se establecen de forma automática durante la implementación como valores predeterminados. Este resultado se considera "ruido" en la respuesta what-if. El recurso implementado final tendrá los valores establecidos para las propiedades. A medida que la operación what-if evolucione, estas propiedades se excluirán del resultado.

Evaluación de los resultados de what-if mediante programación

Ahora, vamos a establecer el comando en una variable para evaluar mediante programación los resultados de what-if.

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

Puede ver un resumen de cada cambio.

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

Confirmar eliminación

La operación hipotética admite el uso del modo de implementación. Cuando se establece en el modo completo, se eliminan los recursos que no están en la plantilla. En el ejemplo siguiente se implementa una plantilla que no tiene recursos definidos en el modo completo.

Para obtener una vista previa de los cambios antes de implementar una plantilla, use el parámetro de modificador confirm con el comando de implementación. Si los cambios son los esperados, responda que desea que se complete la implementación.

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"

Dado que no hay recursos definidos en la plantilla y el modo de implementación está establecido en completo, se eliminará la red virtual.

Captura de pantalla de la implementación de plantilla de Resource Manager en el modo de implementación de salida de operación hipotética completa.

La salida de texto es:

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á los cambios esperados y puede confirmar que desea que se ejecute la implementación.

SDK

Puede usar la operación "what-if" a través de los SDK de Azure.

Pasos siguientes