分享方式:


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

如需詳細資訊,請參閱使用者定義的資料類型 (部分機器翻譯)。

使用裝飾專案

裝飾專案會以 格式 @expression 撰寫,並置於輸出宣告上方。 下表顯示輸出的可用裝飾專案。

裝飾項目 套用到 Argument 描述
description 全部 字串 提供輸出的描述。
discriminator object 字串 使用此裝飾專案來確保識別並管理正確的子類別。 如需詳細資訊,請參閱 自定義標記聯集數據類型
maxLength 陣列、字串 int 字串和數位輸出的最大長度。 此值為內含。
maxValue int int 整數輸出的最大值。 此值為內含。
中繼資料 全部 object 要套用至輸出的自訂屬性。 可以包含相當於描述裝飾項目的描述屬性。
minLength 陣列、字串 int 字串和數位輸出的最小長度。 此值為內含。
minValue int int 整數輸出的最小值。 此值為內含。
sealed object none 當 use-define 數據類型的屬性名稱可能是錯字時,將 BCP089 從警告提升為錯誤。 如需詳細資訊,請參閱 提高錯誤層級

裝飾項目在 sys 命名空間中。 如果您需要區別裝飾項目與具有相同名稱的另一個項目,請在裝飾項目前面加上 sys。 例如,如果您的 Bicep 檔案包含名稱為 description 的參數,則在使用描述裝飾項目時,您必須加入 sys 命名空間。

@sys.description('The name of the instance.')
param name string
@sys.description('The description of the instance to display.')
param description string

描述

若要新增說明,請將描述新增至輸出宣告。 例如:

@description('Conditionally output the endpoint.')
output endpoint string = deployStorage ? myStorageAccount.properties.primaryEndpoints.blob : ''

Markdown 格式的文字可用於描述文字。

鑒別器

請參閱 自定義標記聯集數據類型

整數限制式

您可以設定整數輸出的最小值和最大值。 您可以設定一或兩個限制式。

var thisMonth = 3

@minValue(1)
@maxValue(12)
output month int = thisMonth

長度限制

您可以指定字串和陣列輸出的最小和最大長度。 您可以設定一或兩個限制式。 若為字串,長度代表字元數。 若為陣列,長度代表陣列中的項目數。

下列範例會宣告兩個輸出。 其中一個輸出適用於必須有 3-24 個字元的記憶體帳戶名稱。 另一個輸出是必須有1-5個項目的陣列。

var accountName = uniqueString(resourceGroup().id)
var appNames = [
  'SyncSphere'
  'DataWhiz'
  'FlowMatrix'
]

@minLength(3)
@maxLength(24)
output storageAccountName string = accountName

@minLength(1)
@maxLength(5)
output applicationNames array = appNames

中繼資料

如果您有想要套用至輸出的自訂屬性,請新增元數據裝飾專案。 在中繼資料內,使用自訂名稱和值定義物件。 您為中繼資料定義的物件可以包含任何名稱和類型的屬性。

您可以使用此裝飾項目來追蹤不合理新增至描述輸出的相關信息。

var obj = {}
@description('Configuration values that are applied when the application starts.')
@metadata({
  source: 'database'
  contact: 'Web team'
})
output settings object = obj

若您提供的 @metadata() 裝飾項目含有的屬性與另一個裝飾項目衝突,該裝飾項目一律優先於 @metadata() 裝飾項目中任何元素, 因此 @metadata() 值中的衝突屬性會變成多餘的,並受到取代。 如需詳細資訊,請參閱沒有衝突的中繼資料 (機器翻譯)。

密封的

請參閱 提高錯誤層級

條件式輸出

如果要傳回的值取決於部署中的條件,請使用 ? 運算子。

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@2023-04-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@2023-11-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@2023-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() 函式會依字母順序排序物件。 在其他位置,可以保留原始排序。 由於這種非確定性,請避免在編寫與部署參數和輸出互動的程式碼時,對物件索引鍵的排序進行任何假設。

下一步