Predecir con what-if lo que hará una implementación

Completado

Cualquier persona que implemente o modifique recursos en un entorno se plantea cuestiones como las siguientes:

  • ¿Dejará de funcionar algo?
  • ¿Se eliminará algo?
  • ¿Cómo afectará esta implementación a los recursos existentes?
  • ¿Puedo garantizar que lo que espero que ocurra es lo que ocurrirá en realidad en la implementación antes de pulsar el botón Implementar?

Implementar y esperar el mejor resultado NO es un enfoque correcto. Un enfoque más acertado consiste en usar la operación what-if. Esta operación le ayuda a anticipar las consecuencias de una nueva implementación, si la intenta.

Azure Resource Manager proporciona la operación what-if para resaltar los cambios al implementar una plantilla. La operación hipotética no realiza ningún cambio en los recursos existentes. En su lugar, predice los cambios si la plantilla especificada se implementa en un nivel de suscripción y un grupo de recursos.

Nota:

La operación hipotética a veces muestra que un recurso cambiará cuando realmente no se va a producir ningún cambio. Trabajamos para reducir estos problemas, pero necesitamos su ayuda. Notifique estos problemas.

Al usar la operación hipotética se compara el modelo de estado actual como el modelo de estado deseado. La operación what-if confirma si los cambios realizados por la plantilla coinciden con las expectativas sin aplicar esos cambios a recursos reales ni al estado de esos recursos.

Control del formato de los resultados de la hipótesis

El cmdlet New-AzResourceGroupDeployment de Azure PowerShell crea una implementación en un grupo de recursos. Al agregar el parámetro -Whatif a este comando, el comando cambia de llevar a cabo la implementación a simplemente notificar una vista previa de lo que ocurrirá si se lleva a cabo.

El comando az deployment group what-if proporciona una vista previa de lo que ocurrirá si realiza una implementación.

Puede controlar la cantidad de salida de texto de la operación hipotética si usa uno de estos formatos de resultado:

  • FullResourcePayloads. Al incluir este parámetro, obtiene un resultado detallado que consta de una lista de recursos que cambiarán. El resultado también muestra detalles sobre todas las propiedades que cambiarán de acuerdo con la plantilla.
  • ResourceIdOnly. Este modo devuelve una lista de recursos que cambiarán, pero no todos los detalles.

Por ejemplo, suponga que cambia el tipo de almacenamiento en una plantilla que implementa una sola cuenta de almacenamiento en un entorno existente.

Podría ejecutar el código de PowerShell siguiente y solicitar a Resource Manager que proporcione las cargas de recursos completas:

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

El comando anterior genera los resultados siguientes:

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

The deployment will update the following scope:

Scope: /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/ToyStorage

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

Resource changes: 1 to modify.

Después, podría volver a ejecutar el comando, pero simplemente solicitar los identificadores de recurso:

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

El comando anterior genera los resultados siguientes:

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

The deployment will update the following scope:

Scope: /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/ToyStorage

  ! Microsoft.Storage/storageAccounts/bz64gjjpidbuvi

Resource changes: 1 to deploy.

Tipos de cambios que detecta la hipótesis

Cuando se usa la operación what-if, se enumeran seis tipos de cambios:

Tipo Explicación Efecto
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. Si realiza la implementación mediante el modo incremental, el recurso no se elimina. Si realiza la implementación mediante el modo completo, el recurso se elimina. Este tipo de cambio solo se devuelve para los recursos que admiten la eliminación por medio del modo completo.
Ignorar El recurso existe, pero no se define en la plantilla. Cuando se usa el modo incremental, que es el modo de implementación predeterminado, el recurso no se implementa ni modifica. Si realiza la implementación mediante el modo completo, el recurso se eliminará.
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 el formato del resultado se establece en FullResourcePayloads, que es el predeterminado.
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 el formato del resultado se establece en FullResourcePayloads, que es el predeterminado.
Implementar El recurso existe y se define en la plantilla. El recurso será reimplementado. Las propiedades del recurso podrían cambiar o no. La operación devuelve este tipo de cambio cuando no tiene información suficiente para determinar si cualquier propiedad cambiará. Esta condición solo se ve cuando el formato del resultado se establece en ResourceIdOnly.

Si no necesita conocer todos los tipos de cambio, puede usar el argumento -WhatIfExcludeChangeType para omitir los que no le interesen.

Si no necesita conocer todos los tipos de cambio, puede usar el argumento --what-if-exclude-change-types para omitir los que no le interesen.

Uso de resultados hipotéticos en un script

Es posible que quiera usar la salida de la operación hipotética dentro de un script o como parte de un proceso de implementación automatizado.

Puede obtener los resultados mediante el cmdlet Get-AzResourceGroupDeploymentWhatIfResult. Después, el script puede analizar los resultados y realizar cualquier lógica personalizada que necesite.

Puede obtener los resultados JSON sin formato si anexa el argumento --no-pretty-print al comando de la CLI. Después, el script puede analizar los resultados y realizar cualquier lógica personalizada que necesite.

Modos de implementación y eliminación de recursos

En ocasiones querrá confirmar la eliminación de los recursos a medida que implementa la plantilla. Para ello, la operación hipotética tiene en cuenta el modo de implementación que se usa. Si usa el modo de implementación completo, Resource Manager notifica los recursos que eliminará porque no están definidos en la implementación.

Ahora se verá un ejemplo de una plantilla que actualiza un recurso existente y se implementa en modo completo:

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

Esta es una explicación de lo que sucede en este ejemplo:

  • La plantilla actualiza una cuenta de almacenamiento denominada storage-1, que ya está implementada. La SKU cambia de LRS a GRS y la etiqueta owner cambia de valor a Equipo A. La salida hipotética muestra un tipo de cambio Modificar para este recurso.
  • La plantilla crea una cuenta de Azure Cosmos DB denominada cosmos-db-1, que todavía no existe en el grupo de recursos. La salida hipotética muestra un tipo de cambio Crear para este recurso.
  • La plantilla no incluye el servidor lógico de Azure SQL que ya existe en el grupo de recursos. Como en la implementación se usa el modo completo, la salida hipotética muestra un tipo de cambio Eliminar para este recurso. Si en la implementación se usara el modo incremental en lugar del modo completo, el tipo de cambio sería Ignore (Omitir).

Confirmación de las implementaciones

Para obtener una vista previa de los cambios antes de implementar una plantilla, use el parámetro -Confirm con el comando de implementación. Si los cambios son los esperados, confirme que desea que finalice la implementación.

Sugerencia

Es recomendable ejecutar los comandos de implementación con el modificador -Confirm, en especial si va a realizar la implementación en modo completo. Si usa el modificador -Confirm, tendrá la oportunidad de detener la operación si no le gustan los cambios propuestos.

Para obtener una vista previa de los cambios antes de implementar una plantilla, use el argumento --confirm-with-what-if con el comando de implementación. Si los cambios son los esperados, confirme que desea que finalice la implementación.

Sugerencia

Es recomendable ejecutar los comandos de implementación con el argumento --confirm-with-what-if, en especial si va a realizar la implementación en modo completo. Si usa el modificador --confirm-with-what-if, tendrá la oportunidad de detener la operación si no le gustan los cambios propuestos.