Определение порядка развертывания ресурсов в шаблонах Azure Resource ManagerDefine the order for deploying resources in Azure Resource Manager Templates

У заданного ресурса могут быть другие ресурсы, которые должны существовать до его развертывания.For a given resource, there can be other resources that must exist before the resource is deployed. Например, сервер SQL Server должен существовать до развертывания базы данных SQL.For example, a SQL server must exist before attempting to deploy a SQL database. Эта связь определяется путем пометки одного ресурса как зависимого от другого.You define this relationship by marking one resource as dependent on the other resource. Для определения зависимостей можно использовать элемент dependsOn или функцию reference.You define a dependency with the dependsOn element, or by using the reference function.

Диспетчер ресурсов оценивает зависимости между ресурсами и развертывает эти ресурсы согласно установленным зависимостям.Resource Manager evaluates the dependencies between resources, and deploys them in their dependent order. Если ресурсы не зависят друг от друга, диспетчер ресурсов развертывает их параллельно.When resources aren't dependent on each other, Resource Manager deploys them in parallel. Необходимо только определить зависимости для ресурсов, которые развертываются в том же шаблоне.You only need to define dependencies for resources that are deployed in the same template.

См. Руководство. Создание шаблонов Azure Resource Manager с зависимыми ресурсами.For a tutorial, see Tutorial: create Azure Resource Manager templates with dependent resources.

Свойство dependsOndependsOn

В шаблоне элемент dependsOn позволяет определить один ресурс как зависимый от одного или нескольких ресурсов.Within your template, the dependsOn element enables you to define one resource as a dependent on one or more resources. В качестве значения свойства может выступать список имен ресурсов с разделителями-запятыми.Its value can be a comma-separated list of resource names.

В следующем примере показан масштабируемый набор виртуальных машин, который зависит от балансировщика нагрузки, виртуальная сеть и цикл, который создает несколько учетных записей хранения.The following example shows a virtual machine scale set that depends on a load balancer, virtual network, and a loop that creates multiple storage accounts. Остальные ресурсы не показаны в этом примере, но они должны существовать в другом месте шаблона.These other resources aren't shown in the following example, but they would need to exist elsewhere in the template.

{
  "type": "Microsoft.Compute/virtualMachineScaleSets",
  "name": "[variables('namingInfix')]",
  "location": "[variables('location')]",
  "apiVersion": "2016-03-30",
  "tags": {
    "displayName": "VMScaleSet"
  },
  "dependsOn": [
    "[variables('loadBalancerName')]",
    "[variables('virtualNetworkName')]",
    "storageLoop",
  ],
  ...
}

В приведенном выше примере добавляется зависимость от ресурсов, которые создаются с помощью цикла копирования storageLoop.In the preceding example, a dependency is included on the resources that are created through a copy loop named storageLoop. Пример см. в статье Создание нескольких экземпляров ресурсов в Azure Resource Manager.For an example, see Create multiple instances of resources in Azure Resource Manager.

При определении зависимостей можно указать пространство имен поставщика ресурсов и тип ресурса, чтобы избежать неоднозначности.When defining dependencies, you can include the resource provider namespace and resource type to avoid ambiguity. Например, чтобы уточнить сведения о подсистеме балансировки нагрузки и виртуальной сети, имена которых, возможно, совпадают с именами других ресурсов, используйте следующий формат.For example, to clarify a load balancer and virtual network that may have the same names as other resources, use the following format:

"dependsOn": [
  "[resourceId('Microsoft.Network/loadBalancers', variables('loadBalancerName'))]",
  "[resourceId('Microsoft.Network/virtualNetworks', variables('virtualNetworkName'))]"
]

Если вы склонны использовать свойство dependsOn для сопоставления связей между ресурсами, то вам важно понимать, зачем вы это делаете.While you may be inclined to use dependsOn to map relationships between your resources, it's important to understand why you're doing it. Например, для документирования связей между ресурсами использование свойства dependsOn будет неправильным решением.For example, to document how resources are interconnected, dependsOn isn't the right approach. После развертывания невозможно запросить, какие ресурсы были определены в элементе dependsOn.You can't query which resources were defined in the dependsOn element after deployment. Использование свойства dependsOn потенциально влияет на время развертывания, так как диспетчер ресурсов не может выполнять развертывание двух зависимых ресурсов параллельно.By using dependsOn, you potentially impact deployment time because Resource Manager doesn't deploy in parallel two resources that have a dependency.

Дочерние ресурсыChild resources

Свойство resources позволяет указать дочерние ресурсы, связанные с определяемым ресурсом.The resources property allows you to specify child resources that are related to the resource being defined. Дочерние ресурсы можно определять максимум на пяти нижестоящих уровнях.Child resources can only be defined five levels deep. Важно отметить, что зависимость неявное развертывания не создается между дочерним и родительским ресурсом.It's important to note that an implicit deployment dependency isn't created between a child resource and the parent resource. Если вам нужно, чтобы дочерний ресурс был развернут после родительского ресурса, эту зависимость необходимо явно указать в свойстве dependsOn.If you need the child resource to be deployed after the parent resource, you must explicitly state that dependency with the dependsOn property.

Каждый родительский ресурс принимает в качестве дочерних ресурсов только определенные типы ресурсов.Each parent resource accepts only certain resource types as child resources. Принимаемые типы ресурсов указаны в схеме шаблона родительского ресурса.The accepted resource types are specified in the template schema of the parent resource. Имя типа дочернего ресурса содержит имя типа родительского ресурса, например: Microsoft.Web/sites/config и Microsoft.Web/sites/extensions являются дочерними ресурсами по отношению к Microsoft.Web/sites.The name of child resource type includes the name of the parent resource type, such as Microsoft.Web/sites/config and Microsoft.Web/sites/extensions are both child resources of the Microsoft.Web/sites.

В следующем примере показаны SQL Server и база данных SQL.The following example shows a SQL server and SQL database. Обратите внимание, что несмотря на то, что база данных является дочерним ресурсом по отношению к серверу, между базой данных SQL и сервером SQL Server определена явная зависимость.Notice that an explicit dependency is defined between the SQL database and SQL server, even though the database is a child of the server.

"resources": [
  {
    "name": "[variables('sqlserverName')]",
    "type": "Microsoft.Sql/servers",
    "location": "[resourceGroup().location]",
    "tags": {
      "displayName": "SqlServer"
    },
    "apiVersion": "2014-04-01-preview",
    "properties": {
      "administratorLogin": "[parameters('administratorLogin')]",
      "administratorLoginPassword": "[parameters('administratorLoginPassword')]"
    },
    "resources": [
      {
        "name": "[parameters('databaseName')]",
        "type": "databases",
        "location": "[resourceGroup().location]",
        "tags": {
          "displayName": "Database"
        },
        "apiVersion": "2014-04-01-preview",
        "dependsOn": [
          "[variables('sqlserverName')]"
        ],
        "properties": {
          "edition": "[parameters('edition')]",
          "collation": "[parameters('collation')]",
          "maxSizeBytes": "[parameters('maxSizeBytes')]",
          "requestedServiceObjectiveName": "[parameters('requestedServiceObjectiveName')]"
        }
      }
    ]
  }
]

Функции list и referencereference and list functions

Функция reference позволяет выражению получать его значение из других пар "имя JSON — значение" или ресурсов среды выполнения.The reference function enables an expression to derive its value from other JSON name and value pairs or runtime resources. Функции list* возвращают значение ресурса из списка операций.The list* functions return values for a resource from a list operation. Выражения и списки со ссылками неявно объявляют, что один ресурс зависит от другого, когда выходные ресурсы развернуты в одном шаблоне и обращаются друг к другу по именам (а не по идентификатору ресурса).Reference and list expressions implicitly declare that one resource depends on another, when the referenced resource is deployed in the same template and referred to by its name (not resource ID). При передаче идентификатора ресурса функциям list или reference неявные ссылки созданы не будут.If you pass the resource ID into the reference or list functions, an implicit reference isn't created.

Общий формат функции reference выглядит следующим образом.The general format of the reference function is:

reference('resourceName').propertyPath

Общий формат функции listKeys выглядит следующим образом.The general format of the listKeys function is:

listKeys('resourceName', 'yyyy-mm-dd')

В следующем примере конечная точка CDN явно зависит от профиля CDN и неявно зависит от веб-приложения.In the following example, a CDN endpoint explicitly depends on the CDN profile, and implicitly depends on a web app.

{
    "name": "[variables('endpointName')]",
    "type": "endpoints",
    "location": "[resourceGroup().location]",
    "apiVersion": "2016-04-02",
    "dependsOn": [
            "[variables('profileName')]"
    ],
    "properties": {
        "originHostHeader": "[reference(variables('webAppName')).hostNames[0]]",
        ...
    }

Зависимости можно указать как с помощью этой функции, так и с помощью свойства dependsOn, но использовать оба варианта для одного зависимого ресурса не нужно.You can use either this element or the dependsOn element to specify dependencies, but you don't need to use both for the same dependent resource. По возможности используйте неявные ссылки, чтобы избежать добавления ненужных зависимостей.Whenever possible, use an implicit reference to avoid adding an unnecessary dependency.

Дополнительные сведения см. в разделе о функции reference.To learn more, see reference function.

Циклические зависимостиCircular dependencies

Resource Manager выявляет циклические зависимости во время проверки шаблона.Resource Manager identifies circular dependencies during template validation. Если возникает ошибка и появляется сообщение о том, что существует циклическая зависимость, оцените шаблон на предмет лишних зависимостей, которые можно удалить.If you receive an error stating that a circular dependency exists, evaluate your template to see if any dependencies aren't needed and can be removed. Если удаление зависимостей не помогает, можно избежать появления циклических зависимостей, переместив некоторые операции развертывания в дочерние ресурсы, которые развертываются после ресурсов с циклической зависимостью.If removing dependencies doesn't work, you can avoid circular dependencies by moving some deployment operations into child resources that are deployed after the resources that have the circular dependency. Предположим, что вы развертываете две виртуальные машины, но на каждой из них необходимо задать свойства, которые ссылаются на другую виртуальную машину.For example, suppose you're deploying two virtual machines but you must set properties on each one that refer to the other. Их можно развернуть в следующем порядке.You can deploy them in the following order:

  1. vm1.vm1
  2. vm2.vm2
  3. Расширение на vm1 зависит от vm1 и vm2.Extension on vm1 depends on vm1 and vm2. Расширение задает на vm1 значения, получаемые от vm2.The extension sets values on vm1 that it gets from vm2.
  4. Расширение на vm2 зависит от vm1 и vm2.Extension on vm2 depends on vm1 and vm2. Расширение задает на vm2 значения, получаемые от vm1.The extension sets values on vm2 that it gets from vm1.

Сведения об оценке порядка развертывания и устранении ошибок зависимостей см. в статье Устранение распространенных ошибок развертывания в Azure с помощью Azure Resource Manager.For information about assessing the deployment order and resolving dependency errors, see Troubleshoot common Azure deployment errors with Azure Resource Manager.

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