Aktualisieren einer Ressource in einer Azure Resource Manager-Vorlage

Es kann vorkommen, dass Sie eine Ressource während einer Bereitstellung aktualisieren müssen. Dies ist z. B. der Fall, wenn Sie alle Eigenschaften für eine Ressource erst angeben können, nachdem andere, abhängige Ressourcen erstellt wurden. Wenn Sie z.B einen Back-End-Adresspool für einen Load Balancer erstellen, könnten Sie vielleicht die Netzwerkschnittstellen (NICs) auf Ihren virtuellen Computern (VMs) aktualisieren, um sie in den Back-End-Pool einzubeziehen. Resource Manager unterstützt das Aktualisieren von Ressourcen während der Bereitstellung, aber Sie müssen die Vorlage ordnungsgemäß entwerfen, um Fehler zu vermeiden und sicherzustellen, dass die Bereitstellung als Update behandelt wird.

Wenn Sie eine Ressource erstellen und später aktualisieren, wird zweimal darauf verwiesen. Sie verweisen darauf zuerst in der Vorlage, mit der sie erstellt wird. Wenn Sie die Ressource später aktualisieren, verweisen Sie mit demselben Namen darauf. Wenn jedoch zwei Ressourcen in einer Vorlage den gleichen Namen besitzen, löst der Resource Manager eine Ausnahme aus. Um diesen Fehler zu vermeiden, geben Sie die aktualisierte Ressource mit dem Ressourcentyp Microsoft.Resources/deployments in einer zweiten Vorlage an, die entweder verknüpft oder als Untervorlage enthalten ist.

In der zweiten Vorlage müssen Sie entweder den Namen der zu ändernden Eigenschaft oder einen neuen Namen für eine hinzuzufügende Eigenschaft angeben. Sie müssen auch die Namen und ursprünglichen Werte der Eigenschaften angeben, die sich nicht ändern. Wenn Sie eine der ursprünglichen Eigenschaften nicht angeben, geht Resource Manager davon aus, dass Sie eine neue Ressource erstellen möchten, und die ursprüngliche Ressource wird gelöscht.

Beispielvorlage

Sehen wir uns eine Beispielvorlage an, die diese Technik veranschaulicht. Die Vorlage stellt das virtuelle Netzwerk firstVNet bereit, das ein Subnetz mit dem Namen firstSubnet enthält. Anschließend stellt sie eine virtuelle Netzwerkschnittstelle (NIC) mit dem Namen nic1 bereit und ordnet sie dem Subnetz zu. Eine Bereitstellungsressource namens updateVNet enthält eine geschachtelte Vorlage, die firstVNet durch Hinzufügen eines zweiten Subnetzes namens secondSubnet aktualisiert.

{
    "$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": {}
}

Betrachten Sie das Ressourcenobjekt für unsere firstVNet- Ressource. Beachten Sie, dass neue Einstellungen für firstVNet in einer geschachtelten Vorlage angegeben werden, da Resource Manager keine gleichnamige Bereitstellung innerhalb einer Vorlage erlaubt und geschachtelte Vorlagen als eine andere Vorlage gelten. Durch die neuen Angaben für die Werte unserer firstSubnet-Ressource weisen wir Resource Manager an, die vorhandene Ressource zu aktualisieren, anstatt sie zu löschen und erneut bereitzustellen. Abschließend werden unsere neuen Einstellungen für secondSubnet während des Updates übernommen.

Testen der Vorlage

Eine Beispielvorlage finden Sie auf GitHub. Führen Sie zum Bereitstellen der Vorlage die folgenden Befehle der Azure-Befehlszeilenschnittstelle aus:

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

Öffnen Sie nach der Bereitstellung die Ressourcengruppe, die Sie im Portal angegeben haben. Sie sehen ein virtuelles Netzwerk mit dem Namen firstVNet und eine NIC mit dem Namen nic1. Klicken Sie auf firstVNet und dann auf subnets. Sie sehen das ursprünglich erstellte firstSubnet und das secondSubnet, das in der updateVNet-Ressource hinzugefügt wurde.

Ursprüngliches Subnetz und aktualisiertes Subnetz

Gehen Sie dann zurück zur Ressourcengruppe, und klicken Sie auf nic1 und dann auf IP configurations. Im IP configurations-Abschnitt ist subnet auf firstSubnet (10.0.0.0/24) festgelegt.

IP-Konfigurationseinstellungen für nic1

Das ursprüngliche firstVNet wurde nicht neu erstellt, sondern aktualisiert. Wäre firstVNet neu erstellt worden, wäre nic1 nicht firstVNet zugeordnet.

Nächste Schritte