Aggiornare una risorsa in un modello di Azure Resource Manager

Quando è necessario aggiornare una risorsa durante una distribuzione, ad esempio quando non è possibile specificare tutte le proprietà per una risorsa fino a quando non vengono create altre risorse dipendenti. Ad esempio, se si crea un pool di back-end per un bilanciamento del carico, si potrebbero aggiornare le interfacce di rete (NIC) nelle macchine virtuali (VM) per includerle nel pool di back-end. Resource Manager supporta l'aggiornamento delle risorse durante la distribuzione, ma è necessario progettare correttamente il modello per evitare errori e assicurarsi che la distribuzione venga gestita come aggiornamento.

Quando si crea una risorsa e la si aggiorna in un secondo momento, si fa riferimento due volte. Si fa riferimento prima al modello che lo crea. In seguito, quando si aggiorna la risorsa, si fa riferimento allo stesso nome. Tuttavia, se due risorse hanno lo stesso nome in un modello, Resource Manager genera un'eccezione. Per evitare questo errore, specificare la risorsa aggiornata in un secondo modello collegato o incluso come sottotemplate che usa il Microsoft.Resources/deployments tipo di risorsa.

Nel secondo modello è necessario specificare il nome della proprietà da modificare o un nuovo nome per aggiungere una proprietà. È anche necessario specificare i nomi e i valori originali delle proprietà che non cambiano. Se non è possibile specificare una o più delle proprietà originali, Resource Manager presuppone che si voglia creare una nuova risorsa ed eliminare quella originale.

Modello di esempio

Esaminiamo un modello di esempio che illustra la tecnica. Il modello distribuisce una rete virtuale denominata con una subnet denominata firstVNetfirstSubnet. Distribuisce quindi un'interfaccia di rete virtuale denominata nic1 e associa la scheda di interfaccia di rete alla subnet. Una risorsa di distribuzione denominata updateVNet include un modello annidato che viene aggiornato firstVNet aggiungendo una seconda subnet denominata 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": {}
}

Considerare l'oggetto risorsa per la firstVNet risorsa. Si noti che si specificano di nuovo le impostazioni per il firstVNet modello in un modello annidato, ovvero perché Resource Manager non consente lo stesso nome di distribuzione nello stesso modello e i modelli annidati vengono considerati un modello diverso. Specificando di nuovo i valori per firstSubnet la risorsa, viene indicato Resource Manager di aggiornare la risorsa esistente anziché eliminarla e ridistribuirla. Infine, le nuove impostazioni per secondSubnet vengono prelevate durante l'aggiornamento.

Provare il modello

Un modello di esempio è disponibile in GitHub. Per distribuire il modello, eseguire questi comandi dell'interfaccia della riga di comando di 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

Al termine della distribuzione, aprire il gruppo di risorse specificato nel portale. Viene visualizzata una rete virtuale denominata firstVNet e una scheda di interfaccia di rete denominata nic1. Fare clic su firstVNet, quindi fare clic su subnets. Viene visualizzato il firstSubnet che è stato originariamente creato e viene visualizzato il secondSubnet che è stato aggiunto nella risorsa updateVNet.

Subnet originale e subnet aggiornata

Tornare quindi al gruppo di risorse e fare clic su nic1e quindi su IP configurations. Nella sezione IP configurations il subnet è impostato su firstSubnet (10.0.0.0/24).

impostazioni di configurazioni IP NIC1

L'originale firstVNet è stato aggiornato anziché ricreato. Se firstVNet fosse stato ricreato, nic1 non sarebbe associato a firstVNet.

Passaggi successivi