部署链接和嵌套 ARM 模板

已完成

随着部署复杂性的增加,你可能希望改用模块化方法,通过使用 Azure 资源管理器 (ARM) 的链接或嵌套模板来部署资源。 链接模板和嵌套模板是将部署分解为许多相关模板,然后通过主模板将它们一起部署的方法。

链接的模板

链接模板是指连接单独的模板文件的操作,该操作由来自主模板的链接引用。 通过链接模板可以创建由多个单独 ARM 模板组成的可重用、可组合和模块化的部署。

引用链接模板时,必须提供可通过 HTTP 或 HTTPS 访问的 URI 值。 与上一单元不同,上一单元中可以使用本地文件作为模板。

若要使用链接模板,必须先将模板暂存到可公开访问的终结点,例如 GitHub 或 Azure Blob 存储。 使用由共享访问签名 (SAS) 令牌保护的 Azure 存储帐户来保护模板免受公共访问的影响。

若要将链接模板添加到 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 资源管理器范围或多个资源组。 与链接模板不同,在链接模板中,每个模板都存储在其自己的模板文件中,而使用嵌套模板可以将多个单独的模板存储在一个文件中。 有多种原因可能需要使用此模板结构,例如,需要将资源部署到多个资源组或部署范围时。

{
  "$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": {
  }
}

使用嵌套模板时,可以指定是在父模板还是嵌套模板的范围内计算模板表达式。 范围确定参数、变量和函数(如 resourceGroupsubscription)的解析方式。