使用變數和輸出迴圈

已完成

您已了解如何使用複製迴圈來部署多個資源執行個體,以及如何使用迴圈來設定資源的屬性。 在 Bicep 中,您也可以搭配變數和輸出使用迴圈。

對於您的玩具公司,您需要在多個 Azure 區域中部署具有相同子網路設定的虛擬網路。 您預期未來需要將其他子網路新增至虛擬網路,因此希望具備在 Bicep 範本中修改子網路設定的彈性。

由於您也會在 Azure 環境中部署多個儲存體帳戶,因此您必須提供每個儲存體帳戶的端點作為輸出,讓部署管道可以使用此資訊。

在本單元中,您將了解如何搭配變數和輸出使用迴圈。

注意

本單元中的命令僅用於示範概念。 請先不要執行命令。 您很快就會在此練習所學到的內容。

變數迴圈

使用變數迴圈,就可以建立之後可透過 Bicep 檔案使用的陣列。 就像使用其他迴圈一樣,您可以使用 for 關鍵字來建立變數迴圈:

var items = [for i in range(1, 5): 'item${i}']

上述範例會建立陣列,其中包含值 item1item2item3item4item5

您通常會使用變數迴圈來建立更複雜的物件,您之後可以在資源宣告中使用這些物件。 以下說明如何使用變數迴圈來建立 subnets 屬性:

param addressPrefix string = '10.10.0.0/16'
param subnets array = [
  {
    name: 'frontend'
    ipAddressRange: '10.10.0.0/24'
  }
  {
    name: 'backend'
    ipAddressRange: '10.10.1.0/24'
  }
]

var subnetsProperty = [for subnet in subnets: {
  name: subnet.name
  properties: {
    addressPrefix: subnet.ipAddressRange
  }
}]

resource virtualNetwork 'Microsoft.Network/virtualNetworks@2024-01-01' = {
  name: 'teddybear'
  location: resourceGroup().location
  properties:{
    addressSpace:{
      addressPrefixes:[
        addressPrefix
      ]
    }
    subnets: subnetsProperty
  }
}

本範例說明變數迴圈的有效用法:將具有簡單、易懂的值的參數轉換成對應於 Azure 資源必要定義的更複雜物件。 您可以使用變數迴圈來啟用參數,以僅指定清單中每個項目將變更的關鍵資訊。 然後,您可以使用 Bicep 運算式或預設值來設定資源的其他必要屬性。

輸出迴圈

您可以使用 Bicep 輸出,將部署中的資訊提供回給啟動部署的使用者或工具。 輸出迴圈可在輸出中提供迴圈的彈性和功能。

就像處理其他迴圈一樣,您可以使用 for 關鍵字來指定輸出迴圈:

var items = [
  'item1'
  'item2'
  'item3'
  'item4'
  'item5'
]

output outputItems array = [for i in range(0, length(items)): items[i]]

您通常會將輸出迴圈與範本內的其他迴圈一起使用。 例如,假設有一個 Bicep 檔案會將一組儲存體帳戶部署至 locations 參數所指定的 Azure 區域:

param locations array = [
  'westeurope'
  'eastus2'
  'eastasia'
]

resource storageAccounts 'Microsoft.Storage/storageAccounts@2023-05-01' = [for location in locations: {
  name: 'toy${uniqueString(resourceGroup().id, location)}'
  location: location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
  }
}]

您可能需要傳回所建立每個儲存體帳戶的相關資訊,例如其名稱和可用來存取該帳戶的端點。 使用輸出迴圈,就可以在 Bicep 檔案內擷取此資訊。

注意

目前,Bicep 不支援直接參考在輸出迴圈內從迴圈中建立的資源。 這表示您必須使用陣列索引子來存取資源,如以下範例所示。

output storageEndpoints array = [for i in range(0, length(locations)): {
  name: storageAccounts[i].name
  location: storageAccounts[i].location
  blobEndpoint: storageAccounts[i].properties.primaryEndpoints.blob
  fileEndpoint: storageAccounts[i].properties.primaryEndpoints.file
}]

警告

請勿使用輸出來傳回秘密,例如存取金鑰或密碼。 輸出會留下記錄,且設計上不是用於處理安全資料。