部署链接和嵌套 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": {
}
}
使用嵌套模板时,可以指定是在父模板还是嵌套模板的范围内计算模板表达式。 范围确定参数、变量和函数(如 resourceGroup
和 subscription
)的解析方式。