Развертывание связанных и вложенных шаблонов ARM

Завершено

По мере роста сложности развертывания может потребоваться перейти на модульный подход к развертыванию ресурсов с помощью Azure Resource Manager (ARM) связанных или вложенных шаблонов. Связанные и вложенные шаблоны — это способы разбиения развертывания на множество связанных шаблонов, а затем развертывать их вместе с помощью основного шаблона.

Связанный шаблон

связанный шаблон ссылается на действие подключения отдельных файлов шаблонов, на которые ссылается ссылка из основного шаблона. Связанные шаблоны позволяют создавать повторно используемые, составные и модульные развертывания, которые составляют множество отдельных шаблонов ARM.

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

Чтобы использовать связанные шаблоны, необходимо сначала разместить их на общедоступной конечной точке, например, GitHub или хранилище BLOB-объектов Azure. Используйте учетную запись хранения Azure, защищенную маркером подписанного общего доступа (SAS), чтобы защитить ваши шаблоны от общедоступного доступа.

Чтобы добавить связанный шаблон в шаблон ARM, добавьте ресурс Microsoft.Resources/deployments и свойство templateLink, настроенное с расположением шаблона.

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "name": {
            "type": "string",
            "defaultValue": "linkeddemo001"
        }
    },
    "variables": {
        "linked-template": "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-Module-sample/storage.json",
        "linked-template-two": "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-Module-sample/identity.json"
    },
    "resources": [
        {
            "name": "storage",
            "type": "Microsoft.Resources/deployments",
            "apiVersion": "2019-10-01",
            "properties": {
                "mode": "Incremental",
                "templateLink": {
                    "uri": "[variables('linked-template')]",
                    "contentVersion": "1.0.0.0"
                },
                "parameters": {
                    "name": { "value": "[parameters('name')]" },
                    "location": { "value": "[resourceGroup().location]" }
                }
            }
        },
        {
            "name": "identity",
            "type": "Microsoft.Resources/deployments",
            "apiVersion": "2019-10-01",
            "dependsOn": [
                "[resourceId('Microsoft.Resources/deployments','storage')]"
            ],
            "properties": {
                "mode": "Incremental",
                "templateLink": {
                    "uri": "[variables('linked-template-two')]",
                    "contentVersion": "1.0.0.0"
                },
                "parameters": {
                    "name": { "value": "[parameters('name')]" },
                    "location": { "value": "[resourceGroup().location]" }
                }
            }
        }
    ],
    "outputs": {
        "storageURI": {
            "type": "string",
            "value": "[reference('storage').outputs.storageEndpoint.value]"
        }
    }
}

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

{
  "name": "storage",
  "type": "Microsoft.Resources/deployments",
  "apiVersion": "2019-10-01",
  "properties": {
      "mode": "Incremental",
      "templateLink": {
          "uri": "[variables('linked-template')]",
          "contentVersion": "1.0.0.0"
      },
      "parameters": {
          "name": { "value": "[parameters('name')]" },
          "location": { "value": "[resourceGroup().location]" }
      }
  }
}

Для небольших и средних решений один шаблон проще понять и поддерживать. Все ресурсы и значения можно просмотреть в одном файле. В расширенных сценариях связанные шаблоны позволяют разбить решение на целевые компоненты. Эти шаблоны можно легко использовать для других сценариев.

Вложенный шаблон

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

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "storageAccountName": {
      "type": "string"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2019-10-01",
      "name": "nestedTemplate1",
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "resources": [
            {
              "type": "Microsoft.Storage/storageAccounts",
              "apiVersion": "2019-04-01",
              "name": "[parameters('storageAccountName')]",
              "location": "West US",
              "sku": {
                "name": "Standard_LRS"
              },
              "kind": "StorageV2"
            }
          ]
        }
      }
    }
  ],
  "outputs": {
  }
}

При использовании вложенного шаблона можно указать, вычисляются ли выражения шаблонов в пределах родительского шаблона или вложенного шаблона. Область определяет, как разрешаются такие параметры, переменные и функции, как resourceGroup и subscription.