Uppdatera en resurs i en Azure Resource Manager-mall

Det kan finnas tillfällen när du behöver uppdatera en resurs under en distribution, till exempel när du inte kan ange alla egenskaper för en resurs förrän andra beroende resurser har skapats. Om du till exempel skapar en serverdelspool för en lastbalanserare kan du uppdatera nätverksgränssnitten (NIC) på dina virtuella datorer så att de inkluderas i serverdelspoolen. Resource Manager stöder uppdatering av resurser under distributionen, men du måste utforma mallen korrekt för att undvika fel och för att säkerställa att distributionen hanteras som en uppdatering.

När du skapar en resurs och uppdaterar den senare refererar du till den två gånger. Du refererar först till den i mallen som skapar den. Senare, när du uppdaterar resursen, refererar du till den med samma namn. Men om två resurser har samma namn i en mall utlöser Resource Manager ett undantag. Undvik det här felet genom att ange den uppdaterade resursen i en andra mall som antingen är länkad eller ingår som ett undermall som använder Microsoft.Resources/deployments resurstypen.

I den andra mallen måste du antingen ange namnet på egenskapen som ska ändras eller ett nytt namn för en egenskap som ska läggas till. Du måste också ange namn och ursprungliga värden för de egenskaper som inte ändras. Om du inte kan ange en eller flera av de ursprungliga egenskaperna förutsätter Resource Manager att du vill skapa en ny resurs och tar bort den ursprungliga.

Exempelmall

Nu ska vi titta på en exempelmall som demonstrerar tekniken. Mallen distribuerar ett virtuellt nätverk med namnet firstVNet som har ett undernät med namnet firstSubnet. Därefter distribueras ett virtuellt nätverksgränssnitt (NIC) med namnet nic1 och nätverkskortet associeras med undernätet. En distributionsresurs med namnet updateVNet innehåller en kapslad mall som uppdateras firstVNet genom att lägga till ett andra undernät med namnet 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": {}
}

Överväg resursobjektet för vår firstVNet resurs. Observera att vi återigen anger inställningarna för vår firstVNet i en kapslad mall – det beror på att Resource Manager inte tillåter samma distributionsnamn i samma mall, och kapslade mallar anses vara en annan mall. Genom att ange våra värden för resursen firstSubnet igen uppmanar vi Resource Manager att uppdatera den befintliga resursen i stället för att ta bort den och distribuera om den. Slutligen hämtas våra nya inställningar för secondSubnet under den här uppdateringen.

Prova mallen

Det finns en exempelmall på GitHub. Distribuera mallen genom att köra följande Azure CLI-kommandon :

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

När distributionen är klar öppnar du den resursgrupp som du angav i portalen. Du ser ett virtuellt nätverk med namnet firstVNet och ett nätverkskort med namnet nic1. Klicka på firstVNetoch klicka sedan på subnets. Du ser firstSubnet som ursprungligen skapades och du ser secondSubnet som lades till i resursen updateVNet .

Ursprungligt undernät och uppdaterat undernät

Gå sedan tillbaka till resursgruppen och klicka på nic1och klicka sedan på IP configurations. I avsnittet IP configurations är inställt firstSubnet (10.0.0.0/24)subnet .

Ip-konfigurationsinställningar för nic1

Originalet firstVNet uppdaterades i stället för att återskapas. Om firstVNet hade återskapats skulle nic1 inte associeras med firstVNet.

Nästa steg