通过使用参数和输出为 Azure 资源管理器模板增添灵活性

已完成

在上一单元中,你创建了一个 Azure 资源管理器 (ARM) 模板,并向其添加了一个 Azure 存储帐户。 你可能已注意到你的模板存在问题。 存储帐户名称是硬编码的。 每次只能使用此模板部署同一个存储帐户。 若要部署一个其他名称的存储帐户,则必须创建一个新模板,这不是自动完成部署的实用方法。 存储帐户 SKU 也是硬编码的,这意味着你不能根据不同的环境更改存储帐户的类型。 请回想一下,在我们的方案中,每个部署可能具有不同类型的存储帐户。 通过为存储帐户 SKU 添加参数,可以提高模板的可重用性。

在此单元中,你将了解模板的 parameters 和 outputs 部分

ARM 模板参数

借助 ARM 模板参数,可以提供针对特定环境定制的值,以便自定义部署。 例如,可以根据要部署到环境进行开发、测试、生产还是其他操作来传入不同的值。 例如,上一模板使用 Standard_LRS 存储帐户 SKU。 可以通过将存储帐户 SKU 的名称设为参数,将此模板重复用于其他创建存储帐户的部署。 然后,在部署模板时,传入想要用于此特定部署的 SKU 的名称。 可以在命令行处或通过使用参数文件执行此步骤。

在模板的 parameters 部分中,可以指定在部署资源时能够输入的值。 模板中的参数数量限制为 256 个。 参数定义可以使用大多数模板函数。

参数的可用属性为:

"parameters": {
  "<parameter-name>": {
    "type": "<type-of-parameter-value>",
    "defaultValue": "<default-value-of-parameter>",
    "allowedValues": [
      "<array-of-allowed-values>"
    ],
    "minValue": <minimum-value-for-int>,
    "maxValue": <maximum-value-for-int>,
    "minLength": <minimum-length-for-string-or-array>,
    "maxLength": <maximum-length-for-string-or-array-parameters>,
    "metadata": {
      "description": "<description-of-the-parameter>"
    }
  }
}

允许使用的参数类型为:

  • string
  • secureString
  • integers
  • boolean
  • object
  • secureObject
  • array

使用参数的建议

使用参数指定根据环境(例如 SKU、大小或容量)变化的设置。 还可以使用参数表示你想自行指定的资源名称,以便轻松标识或遵守内部命名约定。 为每个参数提供说明,并尽可能使用默认值。

出于安全原因,决不能为模板中的用户名和/或密码进行硬编码或提供默认值。 始终为用户名和密码(或机密)使用参数。 对所有密码和机密使用 secureString。 如果要将敏感数据传入 JSON 对象,请使用 secureObject 类型。 部署资源后,无法读取或搜集类型为 secureString 或 secureObject 的模板参数。

在 ARM 模板中使用参数

在 ARM 模板的 parameters 部分中,请指定可在部署资源时输入的参数。 一个模板中最多可以有 256 个参数。

下面是一个模板文件的示例,其中包含在模板的 parameters 部分中定义的存储帐户 SKU 的参数。 如果在执行时未指定任何值,则可以为要使用的参数提供默认值。

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

然后,使用资源定义中的参数。 语法为 [parameters('name of the parameter')]。 你将使用 parameters 函数。 你将在下一个模块中了解有关函数的详细信息。

"resources": [
  {
    "type": "Microsoft.Storage/storageAccounts",
    "apiVersion": "2019-04-01",
    "name": "learntemplatestorage123",
    "location": "[resourceGroup().location]",
    "sku": {
      "name": "[parameters('storageAccountType')]"
    },
    "kind": "StorageV2",
    "properties": {
      "supportsHttpsTrafficOnly": true
    }
  }
]

部署模板时,你可以为参数提供值。 请注意以下命令中的最后一行:

templateFile="azuredeploy.json"
az deployment group create \
  --name testdeployment1 \
  --template-file $templateFile \
  --parameters storageAccountType=Standard_LRS

ARM 模板输出

在 ARM 模板的 outputs 部分中,可以指定成功部署后将返回的值。 下面是组成输出部分的元素。

"outputs": {
  "<output-name>": {
    "condition": "<boolean-value-whether-to-output-value>",
    "type": "<type-of-output-value>",
    "value": "<output-value-expression>",
    "copy": {
      "count": <number-of-iterations>,
      "input": <values-for-the-variable>
    }
  }
}
元素 说明
output-name 必须是有效的 JavaScript 标识符。
条件 (可选)一个布尔值,指示是否返回此输出值。 如果为 true,此值则包含在部署的输出中。 如果为 false,则会为此部署跳过输出值。 如果未指定,默认值则为 true。
type 输出值的类型。
value (可选)要评估并作为输出值返回的一个模板语言表达式。
copy (可选)copy 用于针对一个输出返回多个值。

使用 ARM 模板中的输出

以下是输出存储帐户终结点的示例:

"outputs": {
  "storageEndpoint": {
    "type": "object",
    "value": "[reference('learntemplatestorage123').primaryEndpoints]"
  }
}

请注意此表达式的 reference 部分。 此函数可获取存储帐户的运行时状态。

再次部署 ARM 模板

请回想一下,ARM 模板是幂等的,这意味着你可以再次将模板部署到相同的环境中;如果模板中没有任何更改,那么环境中也不会发生任何更改。 如果对模板进行了更改(例如更改了参数值),则将仅部署该更改。 你的模板可以包含你的 Azure 解决方案所需的所有资源,你可以再次安全地执行模板。 只有在资源不存在的情况下才会创建资源,只有在发生更改时才会更新资源。