Поделиться через


Обновление ресурсов в шаблоне Azure Resource Manager

Иногда во время развертывания требуется обновить ресурс, например невозможно указать все свойства ресурса до тех пор, пока не будут созданы другие зависимые ресурсы. Например, при создании внутреннего пула для подсистемы балансировки нагрузки на виртуальных машинах можно обновить сетевые интерфейсы (NIC), чтобы включить их во внутренний пул. Resource Manager поддерживает обновление ресурсов во время развертывания, но необходимо правильно разработать шаблон, чтобы избежать ошибок и обеспечить обработку развертывания как обновления.

Когда вы создаете ресурс и обновляете его позже, вы ссылаетесь на него дважды. Сначала вы ссылаетесь на него в шаблоне, который его создает. Позже при обновлении ресурса вы ссылаетесь на него с тем же именем. Необходимо учитывать, что если в шаблоне два ресурса имеют одинаковые имена, то Resource Manager порождает исключение. Чтобы избежать этой ошибки, укажите обновленный ресурс во втором шаблоне, который либо связан, либо включен в качестве подтемы, использующего Microsoft.Resources/deployments тип ресурса.

Во втором шаблоне необходимо указать имя свойства, которое необходимо изменить, или новое имя добавляемого свойства. Кроме того, необходимо указать имена и исходные значения свойств, которые не изменяются. Если не указать одно или несколько исходных свойств, Resource Manager предполагает, что вы хотите создать новый ресурс, и удаляет исходное.

Пример шаблона

Рассмотрим пример шаблона, демонстрирующий этот метод. Шаблон развертывает виртуальную сеть с именем firstVNet , которая содержит одну подсеть с именем firstSubnet. Затем он развертывает виртуальный сетевой интерфейс (NIC) с именем nic1 и связывает сетевую карту с подсетью. Ресурс развертывания с именем updateVNet включает вложенный шаблон, который обновляется firstVNet путем добавления второй подсети с именем 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": {}
}

Рассмотрим объект ресурса для нашего firstVNet ресурса. Обратите внимание, что мы снова указываем параметры для нашего firstVNet во вложенном шаблоне. Это связано с тем, что Resource Manager не допускает одно и то же имя развертывания в одном шаблоне, а вложенные шаблоны считаются другим шаблоном. Указывая значения для ресурсаfirstSubnet, мы сообщаем Resource Manager обновить существующий ресурс, а не удалять его и повторно развертывать. И, наконец, в этом развертывании устанавливаются новые параметры для secondSubnet.

Пробное использование шаблона

Пример шаблона доступен на сайте GitHub. Чтобы развернуть этот шаблон, выполните следующие команды Azure CLI:

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

После завершения развертывания откройте группу ресурсов, указанную на портале. Отобразится виртуальная сеть с именем firstVNet и сетевой адаптер с именем nic1. Щелкните firstVNet, а затем — subnets. Отобразится подсеть firstSubnet, созданная изначально, а также подсеть secondSubnet, добавленная в ресурсе updateVNet.

Исходная подсеть и обновленная подсеть

Затем вернитесь в группу ресурсов и щелкните nic1, а затем щелкните IP configurations. В разделе IP configurations для subnet задано значение firstSubnet (10.0.0.0/24).

Конфигурации IP виртуального сетевого интерфейса nic1

Исходный firstVNet код был обновлен вместо повторного создания. Если firstVNet бы он был создан повторно, nic1 не был бы связан с firstVNet.

Дальнейшие действия