部署連結與巢狀的 ARM 範本

已完成

隨著部署複雜度的增加,您可能會想要使用以 Azure Resource Manager (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 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": {
  }
}

使用巢狀範本時,您可指定要在父範本或巢狀範本的範圍內評估範本運算式。 範圍決定參數、變數以及 resourceGroupsubscription 等函式的解析方式。