Управление порядком развертывания путем указания зависимостей

Завершено

Предположим, вы хотите развернуть набор ресурсов в Azure, но только в том случае, если уже развернут другой ресурс. На этом этапе необходимо передать в шаблон, что один ресурс зависит от другого ресурса.

Ниже перечислено несколько аспектов, которые следует учитывать.

  • Что-то уже должно существовать, прежде чем можно будет развернуть что-то другое.

    Например, предположим, что для получения секретов, необходимых для загрузки в виртуальную машину, требуется хранилище ключей в Azure Key Vault. При развертывании хранилища ключей можно одновременно развернуть секрет в том же шаблоне. Однако хранилище ключей необходимо развернуть раньше секрета. Таким образом, секрет зависит от наличия хранилища ключей. Из-за зависимости хранилище ключей и секрет будут развернуты один за другим, начиная с хранилища.

  • Можно ли полагаться на то, как работает Azure Resource Manager?

    Первое, о чем нужно подумать при проверке существования другого ресурса, можно ли использовать Azure PowerShell или Azure CLI для проверки существования ресурса. Более автоматизированное решение использует встроенную идемпотентность Resource Manager. Если Resource Manager содержит ресурс, определенный в шаблоне, который уже существует в облаке, он не развернется повторно. Чтобы это работало, необходимо понять, как Resource Manager выполняет проверку.

    Примечание.

    Если существующие удостоверения ресурсов соответствуют чему-то, что определено в шаблоне, то Azure Resource Manager сравнит их свойства. Ресурс остается неизменным при совпадении свойств. Если это не так, подсистема внесет изменения, возможно выполнив повторное развертывание ресурса.

  • Ресурсы можно вкладывать в другой ресурс.

    В шаблонах ARM ресурсы можно вкладывать в другой ресурс. При вложении ресурсов определяется связь между вложенными ресурсами и родительским ресурсом.

Как определить зависимости между ресурсами Azure?

Допустим, вы хотите убедиться, что ресурс (например, учетная запись хранения) был развернут раньше ресурса, которому он нужен. Как проверить, существует ли зависимая учетная запись хранения?

Вы можете начать с проверки текущего состояния развертывания, выполнив команду Azure PowerShell или Azure CLI, чтобы проверить наличие учетной записи хранения. Вы также можете выяснить, есть ли конструкция Resource Manager, позволяющая выполнить такую же проверку.

Такая конструкция в шаблонах Resource Manager называется dependsOn. Использование этой конструкции вынуждает ресурсы ожидать завершения развертывания на указанном ресурсе.

Что такое конструкция dependsOn?

Это пара "ключ-значение", которая позволяет определить порядок развертывания для нескольких ресурсов. Иногда необходимо убедиться, что должно что-то существовать, прежде чем выполнить что-либо. Например, база данных, которая должна существовать до создания приложения, или ресурс секрета — до хранилища ключей.

Поместите конструкцию dependsOn в ресурс, зависящий от других ресурсов, которые должны быть развернуты первыми. Ресурс может зависеть от более чем одного ресурса, поэтому в конструкции в качестве значения нужно будет получить список зависимых ресурсов.

Ниже приведен пример того, как можно выразить такую зависимость в JSON в шаблоне ARM:

"resources": [
  {
    "name": "<name of resource that needs to exist first>"
  },
  {
    "name": "someResource",
    "dependsOn": [
      "<name of resource that needs to exist first>"
    ]
  }
]

В этом примере, чтобы указать на ресурс, от которого есть зависимость, используется имя ресурса. Однако многие ресурсы могут иметь одно и то же имя. Чтобы обеспечить такое сравнение, вместо этого можно использовать конструкцию resourceId(), чтобы получить уникальный идентификатор ресурса, например так:

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

Приведенный выше код JSON создает уникальный идентификатор, объединяя пространство имен, тип и имя переменной. Таким образом вы убедитесь, что указан правильный зависимый ресурс.

Что такое дочерние ресурсы?

Дочерний ресурс — это ресурс, который существует только в контексте другого ресурса. Примером этого является расширение виртуальной машины, которое не может существовать без самой виртуальной машины.

Типичный код для связи типа "родитель — потомок" в шаблоне выглядит следующим образом:

"resources": [
  {
    "name": "parent-resource",
    "resources": [{
      "name": "child-resource"
    }]
  }
]

Эта зависимость типа "родитель — потомок" не создает автоматически зависимость, в которой развертывается родительский элемент раньше дочернего. Зависимость необходимо сделать явной.

Поэтому при выражении такой связи обязательно добавьте конструкцию dependsOn , как показано ниже:

"resources": [
  {
    "name": "parent-resource",
    "resources": [{
      "dependsOn": ["parent-resource"],
      "name": "child resource"
    }]
  }
]