ARM 模板中的输出

本文介绍如何在 Azure 资源管理器模板(ARM 模板)中定义输出值。 需要从部署的资源返回值时,可以使用输出。

每个输出值的格式必须能够解析为这些数据类型中的一种。

提示

我们建议使用 Bicep,因为它提供与 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() 函数按字母顺序对对象进行排序。 在其他位置,可以保留原始排序。 由于这种非确定性,在编写代码时避免对对象键排序做出任何假设,因为这会与部署参数和输出交互。

后续步骤