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>

一般來說,當您有條件地部署資源時,會使用條件式輸出。 下列範例示範如何根據是否部署新的 IP 位址,有條件地傳回公用 IP 位址的資源識別碼。

若要在 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 位址。

module publicIP 'modules/public-ip-address.bicep' = {
  name: 'public-ip-address-module'
}

resource loadBalancer 'Microsoft.Network/loadBalancers@2020-11-01' = {
  name: loadBalancerName
  location: location
  properties: {
    frontendIPConfigurations: [
      {
        name: 'name'
        properties: {
          publicIPAddress: {
            id: publicIP.outputs.resourceId
          }
        }
      }
    ]
    // ...
  }
}

取得輸出值

當部署成功時,系統會自動在部署的結果中傳回輸出值。

若要從部署歷程記錄取得輸出值,可以使用 Azure CLI 或 Azure PowerShell 指令碼。

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

輸出中的物件排序

在 JSON 中,物件是零或多個索引鍵/值組的未排序集合。 根據實作而定,排序可能會不同。 例如,Bicep items() 函式會依字母順序排序物件。 在其他位置,可以保留原始排序。 由於這種非確定性,因此請避免在撰寫與部署參數和輸出互動的程式碼時,對物件索引鍵的排序進行任何假設。

下一步