Обновление ресурсов в шаблоне Azure Resource ManagerUpdate a resource in an Azure Resource Manager template

Существует несколько сценариев, в которых во время развертывания необходимо обновить ресурс.There are some scenarios in which you need to update a resource during a deployment. Например, у вас нет возможности указать все свойства ресурса, пока не созданы другие (зависимые) ресурсы.You might encounter this scenario when you cannot specify all the properties for a resource until other, dependent resources are created. Например, при создании внутреннего пула для подсистемы балансировки нагрузки на виртуальных машинах можно обновить сетевые интерфейсы (NIC), чтобы включить их во внутренний пул.For example, if you create a backend pool for a load balancer, you might update the network interfaces (NICs) on your virtual machines (VMs) to include them in the backend pool. Resource Manager поддерживает обновление ресурсов во время развертывания. Но для этого нужно правильно разработать шаблон, чтобы избежать ошибок и гарантировать, что развертывание будет обработано как обновление.And while Resource Manager supports updating resources during deployment, you must design your template correctly to avoid errors and to ensure the deployment is handled as an update.

Сначала необходимо добавить ссылку на ресурс в шаблоне, чтобы создать его, а затем еще раз добавить ссылку на этот ресурс, используя то же самое имя, чтобы его обновить.First, you must reference the resource once in the template to create it and then reference the resource by the same name to update it later. Необходимо учитывать, что если в шаблоне два ресурса имеют одинаковые имена, то Resource Manager порождает исключение.However, if two resources have the same name in a template, Resource Manager throws an exception. Во избежание этой ошибки укажите обновленный ресурс во втором шаблоне, который связан с первым или включен как вложенный шаблон с помощью типа ресурса Microsoft.Resources/deployments.To avoid this error, specify the updated resource in a second template that's either linked or included as a subtemplate using the Microsoft.Resources/deployments resource type.

Затем во вложенном шаблоне необходимо указать имя существующего свойства для изменения или новое имя для добавления свойства.Second, you must either specify the name of the existing property to change or a new name for a property to add in the nested template. Также нужно указать исходные свойства и их исходные значения.You must also specify the original properties and their original values. Если вы не укажете исходные свойства и значения, в Resource Manager определяется, что будет создан новый ресурс, и удаляется исходный ресурс.If you fail to provide the original properties and values, Resource Manager assumes you want to create a new resource and deletes the original resource.

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

Рассмотрим этот вариант на конкретном примере шаблона.Let's look at an example template that demonstrates this. Этот шаблон развертывает виртуальную сеть с именем firstVNet, которая содержит одну подсеть с именем firstSubnet.Our template deploys a virtual network named firstVNet that has one subnet named firstSubnet. Затем развертывается виртуальный сетевой интерфейс (NIC) с именем nic1, который связывается с подсетью.It then deploys a virtual network interface (NIC) named nic1 and associates it with our subnet. В ресурс развертывания с именем updateVNet помещается вложенный шаблон, при помощи которого в ресурс firstVNet добавляется вторая подсеть с именем secondSubnet.Then, a deployment resource named updateVNet includes a nested template that updates our firstVNet resource by adding a second subnet named secondSubnet.

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {},
  "resources": [
      {
      "apiVersion": "2016-03-30",
      "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": "2015-06-15",
        "type":"Microsoft.Network/networkInterfaces",
        "name":"nic1",
        "location":"[resourceGroup().location]",
        "dependsOn": [
            "firstVNet"
        ],
        "properties": {
            "ipConfigurations":[
                {
                    "name":"ipconfig1",
                    "properties": {
                        "privateIPAllocationMethod":"Dynamic",
                        "subnet": {
                            "id": "[concat(resourceId('Microsoft.Network/virtualNetworks','firstVNet'),'/subnets/firstSubnet')]"
                        }
                    }
                }
            ]
        }
    },
    {
      "apiVersion": "2015-01-01",
      "type": "Microsoft.Resources/deployments",
      "name": "updateVNet",
      "dependsOn": [
          "nic1"
      ],
      "properties": {
        "mode": "Incremental",
        "parameters": {},
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "parameters": {},
          "variables": {},
          "resources": [
              {
                  "apiVersion": "2016-03-30",
                  "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.Let's take a look at the resource object for our firstVNet resource first. Обратите внимание, что во вложенном шаблоне повторно перечислены параметры firstVNet. Это связано с тем, что Resource Manager не допускает наличия одинаковых имен развертывания в одном шаблоне, а вложенный шаблон считается уже другим шаблоном.Notice that we respecify the settings for our firstVNet in a nested template—this is because Resource Manager doesn't allow the same deployment name within the same template and nested templates are considered to be a different template. Повторно перечисляя значения, указанные для ресурса firstSubnet, мы указываем Resource Manager, что нужно обновить существующий ресурс, а не удалять его и развертывать новый.By respecifying our values for our firstSubnet resource, we are telling Resource Manager to update the existing resource instead of deleting it and redeploying it. И, наконец, в этом развертывании устанавливаются новые параметры для secondSubnet.Finally, our new settings for secondSubnet are picked up during this update.

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

Пример шаблона доступен на сайте GitHub.An example template is available on GitHub. Чтобы развернуть этот шаблон, выполните следующие команды Azure CLI:To deploy the template, run the following Azure CLI commands:

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

По завершении развертывания откройте группу ресурсов, которую вы указали на портале.Once deployment has finished, open the resource group you specified in the portal. Отобразится виртуальная сеть с именем firstVNet и сетевой адаптер с именем nic1.You see a virtual network named firstVNet and a NIC named nic1. Щелкните firstVNet, а затем — subnets.Click firstVNet, then click subnets. Отобразится подсеть firstSubnet, созданная изначально, а также подсеть secondSubnet, добавленная в ресурсе updateVNet.You see the firstSubnet that was originally created, and you see the secondSubnet that was added in the updateVNet resource.

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

Затем вернитесь в группу ресурсов и щелкните nic1, а затем — IP configurations.Then, go back to the resource group and click nic1 then click IP configurations. В разделе IP configurations для subnet задано значение firstSubnet (10.0.0.0/24).In the IP configurations section, the subnet is set to firstSubnet (10.0.0.0/24).

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

Исходный firstVNet был обновлен вместо повторного создания.The original firstVNet has been updated instead of re-created. Если firstVNet была повторно создана, nic1 не может быть связан с firstVNet.If firstVNet had been re-created, nic1 would not be associated with firstVNet.

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