Actualización de un recurso en una plantilla de Azure Resource Manager

Puede haber ocasiones en las que necesite actualizar un recurso durante una implementación, como cuando no se pueden especificar todas las propiedades de un recurso hasta que se creen otros recursos dependientes. Por ejemplo, si crea un grupo de back-end para un equilibrador de carga, puede actualizar los adaptadores de red en sus máquinas virtuales (VM) para incluirlos en el grupo de back-end. Resource Manager admite la actualización de recursos durante la implementación, pero debe diseñar su plantilla correctamente para evitar errores y garantizar que la implementación se trate como una actualización.

Cuando cree un recurso y lo actualice más adelante, hará referencia a él dos veces. Primero hará referencia a ella en la plantilla que la crea. Más adelante, cuando actualice el recurso, hará referencia a él con el mismo nombre. Sin embargo, si dos recursos tienen el mismo nombre en una plantilla, Resource Manager genera una excepción. Para evitar este error, especifique el recurso actualizado en una segunda plantilla que haya vinculado o incluido como una subplantilla que usa el tipo de recurso Microsoft.Resources/deployments.

En la segunda plantilla, debe especificar el nombre de la propiedad existente para cambiar o proporcionar un nombre nuevo para una propiedad que se va a agregar. También debe especificar los nombres y los valores originales de las propiedades que no cambian. Si no especifica una o más de las propiedades originales, Resource Manager asume que desea crear un nuevo recurso y elimina el original.

Plantilla de ejemplo

Echemos un vistazo a una plantilla de ejemplo que muestra la técnica. La plantilla implementa una red virtual llamada firstVNet, que tiene una subred llamada firstSubnet. A continuación, implementa un adaptador de red (NIC) denominado nic1 y lo asocia a la subred. Un recurso de implementación llamado updateVNet incluye una plantilla anidada que actualiza firstVNet mediante la adición de una segunda subred llamada secondSubnet.

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {},
    "resources": [
        {
            "apiVersion": "2020-05-01",
            "name": "firstVNet",
            "location": "[resourceGroup().location]",
            "type": "Microsoft.Network/virtualNetworks",
            "properties": {
                "addressSpace": {
                    "addressPrefixes": [
                        "10.0.0.0/22"
                    ]
                },
                "subnets": [
                    {
                        "name": "firstSubnet",
                        "properties": {
                            "addressPrefix": "10.0.0.0/24"
                        }
                    }
                ]
            }
        },
        {
            "apiVersion": "2020-05-01",
            "type": "Microsoft.Network/networkInterfaces",
            "name": "nic1",
            "location": "[resourceGroup().location]",
            "dependsOn": [
                "firstVNet"
            ],
            "properties": {
                "ipConfigurations": [
                    {
                        "name": "ipconfig1",
                        "properties": {
                            "privateIPAllocationMethod": "Dynamic",
                            "subnet": {
                                "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', 'firstVNet', 'firstSubnet')]"
                            }
                        }
                    }
                ]
            }
        },
        {
            "apiVersion": "2020-06-01",
            "type": "Microsoft.Resources/deployments",
            "name": "updateVNet",
            "dependsOn": [
                "nic1"
            ],
            "properties": {
                "mode": "Incremental",
                "parameters": {},
                "template": {
                    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
                    "contentVersion": "1.0.0.1",
                    "parameters": {},
                    "variables": {},
                    "resources": [
                        {
                            "apiVersion": "2020-05-01",
                            "name": "firstVNet",
                            "location": "[resourceGroup().location]",
                            "type": "Microsoft.Network/virtualNetworks",
                            "properties": {
                                "addressSpace": "[reference('firstVNet').addressSpace]",
                                "subnets": [
                                    {
                                        "name": "[reference('firstVNet').subnets[0].name]",
                                        "properties": {
                                            "addressPrefix": "[reference('firstVNet').subnets[0].properties.addressPrefix]"
                                        }
                                    },
                                    {
                                        "name": "secondSubnet",
                                        "properties": {
                                            "addressPrefix": "10.0.1.0/24"
                                        }
                                    }
                                ]
                            }
                        }
                    ],
                    "outputs": {}
                }
            }
        }
    ],
    "outputs": {}
}

Considere el objeto de recurso para nuestro recurso firstVNet. Observe que volvemos a especificar la configuración de nuestro recurso firstVNet en una plantilla anidada. Esto es porque Resource Manager no permite el mismo nombre de implementación en la misma plantilla, y las plantillas anidadas se consideran plantillas diferentes. Al volver a especificar los valores de nuestro recurso firstSubnet, indicamos a Resource Manager que actualice el recurso existente en lugar de eliminarlo y volver a implementarlo. Por último, se recoge la nueva configuración de secondSubnet durante esta actualización.

Prueba de la plantilla

GitHub tiene una plantilla de ejemplo a su disposición. Para implementar la plantilla, ejecute los siguientes comandos de la CLI de Azure:

az group create --location <location> --name <resource-group-name>
az deployment group create -g <resource-group-name> \
    --template-uri https://raw.githubusercontent.com/mspnp/template-examples/master/example1-update/deploy.json

Cuando haya finalizado la implementación, abra el grupo de recursos especificado en el portal. Verá una red virtual llamada firstVNet y una NIC llamada nic1. Haga clic en firstVNet y luego en subnets. Verá el firstSubnet que se creó originalmente, y verá el secondSubnet que se agregó en el recurso updateVNet.

Subred original y subred actualizada

A continuación, vuelva al grupo de recursos y haga clic en nic1; después, haga clic en IP configurations. En la sección IP configurations, subnet se configura en firstSubnet (10.0.0.0/24).

Parámetros de configuración de IP del adaptador de red 1

El firstVNet original se actualizó en lugar de crearse de nuevo. Si firstVNet se hubiera creado de nuevo, nic1 no se asociaría con firstVNet.

Pasos siguientes