Bicep 中的输出

本文介绍如何在 Bicep 文件中定义输出值。 需要从部署的资源返回值时,可以使用输出。 一个 Bicep 文件中最多可以有 64 个输出。 有关详细信息,请参阅模板限制

定义输出值

定义输出值的语法为:

output <name> <data-type or type-expression> = <value>

输出可以与参数、变量、模块或资源同名。 每个输出值必须解析为其中一种数据类型用户定义的数据类型表达式

下面的示例展示了如何从已部署的资源返回属性。 在示例中,publicIP 是在 Bicep 文件中部署的公共 IP 地址的符号名称。 输出值获取公共 IP 地址的完全限定的域名。

output hostname string = publicIP.properties.dnsSettings.fqdn

下一个示例演示如何返回不同类型的输出。

output stringOutput string = deployment().name
output integerOutput int = length(environment().authentication.audiences)
output booleanOutput bool = contains(deployment().name, 'demo')
output arrayOutput array = environment().authentication.audiences
output objectOutput object = subscription()

如果你需要输出在名称中包含连字符的属性,请在该名称两侧使用方括号,而不要使用点表示法。 例如,请使用 ['property-name'] 而不是 .property-name

var user = {
  'user-name': 'Test Person'
}

output stringOutput string = user['user-name']

以下示例演示如何使用类型表达式:

param foo 'a' | 'b' = 'a'

output out 'a' | 'b' = foo

有关详细信息,请参阅 用户定义的数据类型

条件输出

当要返回的值取决于部署中的条件时,请使用 ? 运算符。

output <name> <data-type> = <condition> ? <true-value> : <false-value>

通常,如果你有条件地部署了某个资源,则可以使用条件输出。 下面的示例显示如何根据是否部署了新的资源 ID 有条件地返回公共 IP 地址的资源 ID。

若要在 Bicep 中指定条件输出,请使用 ? 运算符。 下面的示例根据条件返回终结点 URL 或空字符串。

param deployStorage bool = true
param storageName string
param location string = resourceGroup().location

resource myStorageAccount 'Microsoft.Storage/storageAccounts@2019-06-01' = if (deployStorage) {
  name: storageName
  location: location
  kind: 'StorageV2'
  sku:{
    name:'Standard_LRS'
    tier: 'Standard'
  }
  properties: {
    accessTier: 'Hot'
  }
}

output endpoint string = deployStorage ? myStorageAccount.properties.primaryEndpoints.blob : ''

动态输出数量

在某些情况下,创建模板时你不知道需要返回的值的实例数量。 可以使用 for 表达式返回数量不定的值。

output <name> <data-type> = [for <item> in <collection>: {
  ...
}]

下面的示例对数组进行循环访问。

param nsgLocation string = resourceGroup().location
param orgNames array = [
  'Contoso'
  'Fabrikam'
  'Coho'
]

resource nsg 'Microsoft.Network/networkSecurityGroups@2020-06-01' = [for name in orgNames: {
  name: 'nsg-${name}'
  location: nsgLocation
}]

output deployedNSGs array = [for (name, i) in orgNames: {
  orgName: name
  nsgName: nsg[i].name
  resourceId: nsg[i].id
}]

有关循环的详细信息,请参阅 Bicep 中的迭代循环

模块的输出

要从模块获取输出值,请使用以下语法:

<module-name>.outputs.<property-name>

以下示例展示了如何通过从某个模块检索值,在负载均衡器上设置 IP 地址。

publicIPAddress: {
  id: publicIP.outputs.resourceID
}

获取输出值

部署成功时,将在部署结果中自动返回输出值。

若要从部署历史记录中获取输出值,可以使用 Azure CLI 或 Azure PowerShell 脚本。

(Get-AzResourceGroupDeployment `
  -ResourceGroupName <resource-group-name> `
  -Name <deployment-name>).Outputs.resourceID.value

输出中的对象排序

在 JSON 中,对象是零个或更多个键/值对的无序集合。 排序可能会根据实现而有所不同。 例如,Bicep items() 函数按字母顺序对对象进行排序。 在其他位置,可以保留原始排序。 由于这种非确定性,在编写代码时避免对对象键排序做出任何假设,因为这会与部署参数和输出交互。

后续步骤