通过使用参数和输出为 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": "2023-05-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 解决方案所需的所有资源,你可以再次安全地执行模板。 只有在资源不存在的情况下才会创建资源,只有在发生更改时才会更新资源。