ARM 模板中的输出
本文介绍如何在 Azure 资源管理器模板(ARM 模板)中定义输出值。 需要从部署的资源返回值时,可以使用输出。
每个输出值的格式必须能够解析为这些数据类型中的一种。
一个模板中最多可以有 64 个输出。 有关详细信息,请参阅模板限制。
定义输出值
下面的示例展示了如何从已部署的资源返回属性。
向模板添加 outputs
节。 输出值获取公共 IP 地址的完全限定的域名。
"outputs": {
"hostname": {
"type": "string",
"value": "[reference(resourceId('Microsoft.Network/publicIPAddresses', variables('publicIPAddressName'))).dnsSettings.fqdn]"
},
}
如果你需要输出在名称中包含连字符的属性,请在该名称两侧使用方括号,而不要使用点表示法。 例如,请使用 ['property-name']
而不是 .property-name
。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"variables": {
"user": {
"user-name": "Test Person"
}
},
"resources": [
],
"outputs": {
"nameResult": {
"type": "string",
"value": "[variables('user')['user-name']]"
}
}
}
条件输出
可以使用 condition
元素有条件地返回值。 通常,如果你有条件地部署了某个资源,则可以使用条件输出。 以下示例展示了如何根据是否部署了新的公共 IP 地址,有条件地返回公共 IP 地址的资源 ID:
"outputs": {
"resourceID": {
"condition": "[equals(parameters('publicIpNewOrExisting'), 'new')]",
"type": "string",
"value": "[resourceId('Microsoft.Network/publicIPAddresses', parameters('publicIPAddresses_name'))]"
}
}
有关条件输出的简单示例,请参阅条件输出模板。
动态输出数量
在某些情况下,创建模板时你不知道需要返回的值的实例数量。 你可以使用迭代输出返回可变数量的值。 添加 copy
元素以循环访问输出。
"outputs": {
"storageEndpoints": {
"type": "array",
"copy": {
"count": "[parameters('storageCount')]",
"input": "[reference(concat(copyIndex(), variables('baseName'))).primaryEndpoints.blob]"
}
}
}
有关详细信息,请参阅 ARM 模板中的输出迭代。
链接模板
可以使用链接模板来部署相关模板。 若要从链接模板中检索输出值,请在父模板中使用 reference 函数。 父模板中的语法为:
"[reference('<deploymentName>').outputs.<propertyName>.value]"
以下示例演示如何通过从链接模板检索值,在负载均衡器上设置 IP 地址。
"publicIPAddress": {
"id": "[reference('linkedTemplate').outputs.resourceID.value]"
}
如果属性名称包含连字符,请在名称两侧使用方括号,而不要使用点表示法。
"publicIPAddress": {
"id": "[reference('linkedTemplate').outputs['resource-ID'].value]"
}
不能在嵌套模板的 outputs 节中使用 reference
函数。 若要返回嵌套模板中部署的资源的值,请将嵌套模板转换为链接模板。
公共 IP 地址模板创建一个公共 IP 地址并输出资源 ID。 负载均衡器模板链接到前面所述的模板。 创建负载平衡器时,它使用输出中的资源 ID。
示例模板
以下模板不部署任何资源。 它显示了返回不同类型的输出的一些方式。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [],
"outputs": {
"stringOutput": {
"type": "string",
"value": "[deployment().name]"
},
"integerOutput": {
"type": "int",
"value": "[length(environment().authentication.audiences)]"
},
"booleanOutput": {
"type": "bool",
"value": "[contains(deployment().name, 'demo')]"
},
"arrayOutput": {
"type": "array",
"value": "[environment().authentication.audiences]"
},
"objectOutput": {
"type": "object",
"value": "[subscription()]"
}
}
}
获取输出值
部署成功时,将在部署结果中自动返回输出值。
若要从部署历史记录中获取输出值,可以使用脚本。
(Get-AzResourceGroupDeployment `
-ResourceGroupName <resource-group-name> `
-Name <deployment-name>).Outputs.resourceID.value
输出中的对象排序
在 JSON 中,对象是零个或更多个键/值对的无序集合。 排序可能会根据实现而有所不同。 例如,Bicep items() 函数按字母顺序对对象进行排序。 在其他位置,可以保留原始排序。 由于这种非确定性,在编写代码时避免对对象键排序做出任何假设,因为这会与部署参数和输出交互。
后续步骤
- 若要了解输出的可用属性,请参阅了解 ARM 模板的结构和语法。