使用 Azure CLI 导出 Azure Resource Manager 模板

使用 Resource Manager 可从订阅中的现有资源导出 Resource Manager 模板。 可以使用该生成的模板了解模板语法,或根据需要自动重新部署解决方案。

必须注意的是,可以使用两种不同的方式来导出模板:

  • 可以导出用于部署的实际模板。 导出的模板中包括的所有参数和变量与原始模板中显示的完全一样。 如果需要检索模板,此方法非常有用。
  • 可以导出已生成的表示资源组当前状态的模板。 导出的模板不基于任何已用于部署的模板。 它创建的模板是资源组的“快照”或“备份”。 导出的模板会有许多硬编码的值,其参数可能没有定义的那么多。 使用此选项可将资源重新部署到同一资源组。 若要将此模板用于其他资源组,可能需要对其进行大幅修改。

本文介绍了这两种方法。

部署解决方案

为了说明用于导出模板的这两种方法,让我们首先将解决方案部署到订阅。 如果订阅中已有要导出的资源组,则无需部署此解决方案。 但是,本文的剩余部分指的是此解决方案的模板。 该示例脚本可部署存储帐户。

az group create --name ExampleGroup --location "China North"
az group deployment create \
    --name NewStorage \
    --resource-group ExampleGroup \
    --template-uri "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/101-storage-account-create/azuredeploy.json" \

从部署历史记录保存模板

可以使用 az group deployment export 命令从部署历史记录中检索模板。 以下示例保存以前部署的模板:

az group deployment export --name NewStorage --resource-group ExampleGroup

它返回模板。 复制 JSON,并将其另存为文件。 请注意,它就是用于部署的模板。 参数和变量与 GitHub 中的模板匹配。 可以重新部署此模板。

将资源组导出为模板

可以使用 az group export 命令检索表示资源组当前状态的模板,而不是从部署历史记录中检索模板。 如果对资源组进行了许多更改,并且现有模板未表示所有更改,则可以使用此命令。 它用作资源组的快照,可用来重新部署到同一资源组。 若要将导出的模板用于其他解决方案,必须大幅修改它。

az group export --name ExampleGroup

它返回模板。 复制 JSON,并将其另存为文件。 请注意,它与 GitHub 中的模板不同。 此模板具有不同参数,并且没有变量。 存储 SKU 和位置均硬编码为值。 以下示例演示导出的模板,但你的模板可以使用略有不同的参数名称:

{
  "parameters": {
    "storageAccounts_mcyzaljiv7qncstandardsa_name": {
      "type": "String",
      "defaultValue": null
    }
  },
  "variables": {},
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "resources": [
    {
      "tags": {},
      "dependsOn": [],
      "apiVersion": "2016-01-01",
      "sku": {
        "name": "Standard_LRS",
        "tier": "Standard"
      },
      "kind": "Storage",
      "type": "Microsoft.Storage/storageAccounts",
      "location": "chinaeast",
      "name": "[parameters('storageAccounts_mcyzaljiv7qncstandardsa_name')]",
      "properties": {}
    }
  ],
  "contentVersion": "1.0.0.0"
}

可以重新部署此模板,但需要猜测存储帐户的唯一名称。 参数名称可以略有不同。

az group deployment create --name NewStorage --resource-group ExampleGroup \
  --template-file examplegroup.json \
  --parameters "{\"storageAccounts_mcyzaljiv7qncstandardsa_name\":{\"value\":\"tfstore0501\"}}"

自定义导出的模板

可以修改此模板,使其更易用且更灵活。 若要允许多个位置,请更改 location 属性以使用与资源组相同的位置:

"location": "[resourceGroup().location]",

若要避免必须猜测存储帐户的唯一名称,请删除存储帐户名称的参数。 为存储名称后缀及存储 SKU 添加参数:

"parameters": {
    "storageSuffix": {
      "type": "string",
      "defaultValue": "standardsa"
    },
    "storageAccountType": {
      "defaultValue": "Standard_LRS",
      "allowedValues": [
        "Standard_LRS",
        "Standard_GRS",
        "Standard_ZRS"
      ],
      "type": "string",
      "metadata": {
        "description": "Storage Account type"
      }
    }
},

使用 uniqueString 函数添加用于构造存储帐户名称的变量:

"variables": {
    "storageAccountName": "[concat(uniquestring(resourceGroup().id), 'standardsa')]"
  },

将存储帐户名称设置为变量:

"name": "[variables('storageAccountName')]",

将 SKU 设置为参数:

"sku": {
    "name": "[parameters('storageAccountType')]",
    "tier": "Standard"
},

模板现在如下所示:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "storageSuffix": {
      "type": "string",
      "defaultValue": "standardsa"
    },
    "storageAccountType": {
      "defaultValue": "Standard_LRS",
      "allowedValues": [
        "Standard_LRS",
        "Standard_GRS",
        "Standard_ZRS"
      ],
      "type": "string",
      "metadata": {
        "description": "Storage Account type"
      }
    }
  },
  "variables": {
    "storageAccountName": "[concat(uniquestring(resourceGroup().id), parameters('storageSuffix'))]"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "sku": {
        "name": "[parameters('storageAccountType')]",
        "tier": "Standard"
      },
      "kind": "Storage",
      "name": "[variables('storageAccountName')]",
      "apiVersion": "2016-01-01",
      "location": "[resourceGroup().location]",
      "tags": {},
      "properties": {},
      "dependsOn": []
    }
  ]
}

重新部署已修改的模板。

后续步骤