Operación what-if de implementación de Bicep

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

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.

Durante las operaciones hipotéticas, no se admite la evaluación y expansión de templateLink. Como resultado, los recursos implementados mediante vínculos de plantilla dentro de implementaciones anidadas, incluidas las referencias a especificaciones de plantilla, no serán visibles en los resultados de la operación hipotética.

Recursos de aprendizaje

Para más información sobre la operación hipotética y una guía paso a paso, consulte 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.

Operación what-if de implementación de Bicep al administrador de recursos fullresourcepayload 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 el archivo Bicep, 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 un archivo Bicep, 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:

  • Create: el recurso no existe actualmente, pero se define en el archivo Bicep. Se creará el recurso.
  • Delete: este tipo de cambio solo se aplica cuando se usa el modo completo para la implementación de plantillas JSON. El recurso existe, pero no se define en el archivo Bicep. 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.
  • Ignore: el recurso existe, pero no está definido en el archivo Bicep. 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.
  • NoChang: : el recurso existe y se define en el archivo Bicep. 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.
  • Modify: el recurso existe y se define en el archivo Bicep. 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.
  • Deploy: el recurso existe y se define en el archivo Bicep. 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 un archivo Bicep que cree una red virtual. Usará esta red virtual para probar cómo se registran los cambios con what-if. Descargue una copia del archivo Bicep.

resource vnet 'Microsoft.Network/virtualNetworks@2021-02-01' = {
  name: 'vnet-001'
  location: resourceGroup().location
  tags: {
    CostCenter: '12345'
    Owner: 'Team A'
  }
  properties: {
    addressSpace: {
      addressPrefixes: [
        '10.0.0.0/16'
      ]
    }
    enableVmProtection: false
    enableDdosProtection: false
    subnets: [
      {
        name: 'subnet001'
        properties: {
          addressPrefix: '10.0.0.0/24'
        }
      }
      {
        name: 'subnet002'
        properties: {
          addressPrefix: '10.0.1.0/24'
        }
      }
    ]
  }
}

Para implementar el archivo de Bicep, use lo siguiente:

New-AzResourceGroup `
  -Name ExampleGroup `
  -Location centralus
New-AzResourceGroupDeployment `
  -ResourceGroupName ExampleGroup `
  -TemplateFile "what-if-before.bicep"

Modificación de prueba

Una vez finalizada la implementación, está listo para probar la operación hipotética. Esta vez se implementa un archivo Bicep que cambia la red virtual. Falta una de las etiquetas originales, se ha quitado una subred y el prefijo de dirección ha cambiado. Descargue una copia del archivo Bicep.

resource vnet 'Microsoft.Network/virtualNetworks@2021-02-01' = {
  name: 'vnet-001'
  location: resourceGroup().location
  tags: {
    CostCenter: '12345'
  }
  properties: {
    addressSpace: {
      addressPrefixes: [
        '10.0.0.0/15'
      ]
    }
    enableVmProtection: false
    enableDdosProtection: false
    subnets: [
      {
        name: 'subnet002'
        properties: {
          addressPrefix: '10.0.1.0/24'
        }
      }
    ]
  }
}

Para ver los cambios, use lo siguiente:

New-AzResourceGroupDeployment `
  -Whatif `
  -ResourceGroupName ExampleGroup `
  -TemplateFile "what-if-after.bicep"

La salida de what-if es similar a esta:

Salida de la operación what-if de implementación de Bicep

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.enableVmProtection: false
    ~ 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 el archivo Bicep, 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 `
  --template-file "what-if-after.bicep"

Puede ver un resumen de cada cambio.

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

Confirmar eliminación

Para obtener una vista previa de los cambios antes de implementar un archivo Bicep, 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 `
  -Confirm `
  -TemplateFile "what-if-after.bicep"

Implementación de Bicep: modo de implementación de salida de operación what-if completado

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.enableVmProtection: false
    ~ 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.

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.

Limpieza de recursos

Cuando ya no necesite los recursos de ejemplo, use la CLI de Azure o Azure PowerShell para eliminar el grupo de recursos.

az group delete --name ExampleGroup

SDK

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

Pasos siguientes