使用變數和輸出迴圈
您已了解如何使用複製迴圈來部署多個資源執行個體,以及如何使用迴圈來設定資源的屬性。 在 Bicep 中,您也可以搭配變數和輸出使用迴圈。
對於您的玩具公司,您需要在多個 Azure 區域中部署具有相同子網路設定的虛擬網路。 您預期未來需要將其他子網路新增至虛擬網路,因此希望具備在 Bicep 範本中修改子網路設定的彈性。
由於您也會在 Azure 環境中部署多個儲存體帳戶,因此您必須提供每個儲存體帳戶的端點作為輸出,讓部署管道可以使用此資訊。
在本單元中,您將了解如何搭配變數和輸出使用迴圈。
注意
本單元中的命令僅用於示範概念。 請先不要執行命令。 您很快就會在此練習所學到的內容。
變數迴圈
使用變數迴圈,就可以建立之後可透過 Bicep 檔案使用的陣列。 就像使用其他迴圈一樣,您可以使用 for
關鍵字來建立變數迴圈:
var items = [for i in range(1, 5): 'item${i}']
上述範例會建立陣列,其中包含值 item1
、item2
、item3
、item4
和 item5
。
您通常會使用變數迴圈來建立更複雜的物件,您之後可以在資源宣告中使用這些物件。 以下說明如何使用變數迴圈來建立 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
}]
警告
請勿使用輸出來傳回秘密,例如存取金鑰或密碼。 輸出會留下記錄,且設計上不是用於處理安全資料。