Шаблоны ARM: использование функции resourceID и элемента dependOn

Если вы ИТ-специалист, специализирующийся на инфраструктуре, вы, вероятно, уже осознали важность и красоту шаблонов ARM, где у нас есть декларативный способ построения наших сред Azure. Если вы разработчик, это просто еще один файл JSON, который вы знаете наизнанку.
В конце концов, неважно, чем вы занимаетесь (разработкой или инфраструктурой), вы увидите преимущества использования шаблонов ARM. И если вы можете объединить это с Azure DevOps, небо не предел, потому что вы можете иметь конвейеры для нескольких ваших сред, которые могут быть распределены между разными подписками. У вас будет последовательное развертывание, несмотря ни на что.
В этой статье я хочу сосредоточиться на одной из самых важных функций, а именно на идентификаторе ресурса, и на том, как мы можем использовать его, чтобы навести порядок в процессе развертывания с помощью элемента . Мы собираемся использовать простой сценарий: во-первых, мы собираемся создать виртуальную сеть с использованием шаблонов ARM. Позже мы создадим группы безопасности сети и свяжем их с виртуальной сетью.
Использование функции resourceID
При ссылке на другие ресурсы в шаблонах ARM нам необходимо указать их уникальный идентификатор, чтобы найти ресурс. Используя функцию , мы можем предоставить несколько фрагментов информации и получить идентификатор ресурса любого данного ресурса.
Функция проста в использовании. В своей базовой форме нам нужно предоставить только две части информации: тип ресурса и имя ресурса, однако в некоторых ситуациях нам нужно больше деталей, чтобы найти ресурс, и мы можем добавить идентификатор подписки, имя группы ресурсов (в ситуациях где ресурс находится в другой группе ресурсов) и так далее.
Вам может быть интересно, где я могу найти ? Есть несколько способов сделать это. Первый способ — найти его на этой странице ресурсов Microsoft Azure здесь; второй вариант — при использовании ARM Templates просто посмотрите на строку типа ресурса и вы там его найдете; Третий и простой способ определить параметр — проверить объекта. Он предоставляет вам тип ресурса на нем. (Мы узнаем, как получить идентификатор в следующем разделе.)
Использование обозревателя ресурсов для определения идентификатора любого данного ресурса
Существует несколько способов узнать любого данного ресурса. Мне больше всего нравится использовать , где мы можем перемещаться по подписке и находить точный ресурс, а с правой стороны у нас будут все свойства в формате JSON. В приведенном ниже примере мы видим во второй строке.
Формат определяется некоторыми динамическими данными, такими как идентификатор подписки и имя виртуальной сети. Вот текст, извлеченный из первых строк виртуальной сети, которую мы создали для этой статьи.
{ "name": "VNET", "id": " /subscriptions/3c062fc8-2da3-4704-9dbb-8f91ffb43902/resourceGroups/Network-VNET/providers/Microsoft.Network/virtualNetworks/VNET ", "etag": "W /"2e119f6f-de11-4a5f-b08c-679136ca7fea"", "type": "Microsoft.Network/virtualNetworks", "location": "eastus", "tags": { "displayName": "VNET" },
При использовании шаблонов ARM мы можем использовать раздел шаблона ARM для отображения идентификатора ресурса. В нашем сценарии мы знали имя виртуальной сети, поэтому использовали функцию .
"outputs": { "VNET-ResourceID": { "type": "string", "value":"[resourceid('Microsoft.Network/virtualNetworks','vnet')]" } }
Связывание группы безопасности сети с подсетью
В нашем шаблоне ARM мы создали два ресурса: виртуальную сеть с двумя подсетями и назвали их и , а также группу безопасности сети, имя которой определяется переменной .
Я поделился всем шаблоном ARM в блоге здесь, в TechGenix, но наиболее важная часть кода выделена на изображении ниже.
Ниже приведен код, необходимый для добавления существующей в подсеть. Мы используем функцию resourceID, рассмотренную в предыдущем разделе. Мы передаем тип ресурса (Microsoft.Network/networkSecurityGroups) и имя NSG (определяемое параметрами ).
"networkSecurityGroup": { "id": "[resourceId('Microsoft.Network/networkSecurityGroups', параметры('nsgName'))]" }
В результате будет связана с подсетью серверов, как показано на рисунке ниже.
Это здорово, но когда я запускаю шаблон ARM в первый раз, происходит сбой!
Если вы используете шаблон ARM, который создает виртуальную сеть и группу безопасности сети, он обязательно потерпит неудачу в первый раз. Основная причина заключается в том, что виртуальная сеть будет создана и попытается использовать группу безопасности сети, которая также создается одновременно, поэтому будет отображаться ошибка. Когда мы запустим второй раз, тогда это сработает, и это происходит потому, что во втором раунде группа безопасности сети уже будет на месте.
По умолчанию Azure Resource Manager (ARM) создает ресурсы параллельно. Когда нам нужен какой-то порядок в процессе, нам нужно поиграть с элементом для ресурсов, предоставляемых в одном и том же шаблоне.
Чтобы решить эту проблему и сделать наш шаблон ARM пуленепробиваемым, нам нужно использовать на уровне ресурса виртуальной сети, где мы собираемся добавить в качестве требования, прежде чем создавать ресурс виртуальной сети.
Вот код, необходимый для принудительного создания группы безопасности сети, расположенной в шаблоне ARM перед созданием виртуальной сети. Обратите внимание, что мы снова используем функцию .
"dependsOn": [ "[resourceId('Microsoft.Network/networkSecurityGroups',parameters('nsgName'))]" ],
При выполнении шаблона ARM мы видим разницу, когда первым ресурсом, который необходимо подготовить, является (элемент 1), а после его завершения (элемент 2) начинается предоставление виртуальной сети.