使用迴圈部署多個資源
您通常需要部署多個非常類似的資源。 藉由將迴圈新增至 Bicep 檔案,您就可以避免重複資源定義。 相反地,您可以動態設定想要部署的資源執行個體數。 您甚至可以自訂每個執行個體的屬性。
若是玩具公司,您需要部署後端基礎結構 (包括一些 Azure SQL 邏輯伺服器),以支援全新智慧型泰迪熊的推出。 您必須將專用的邏輯伺服器部署到將推出玩具的每個國家/地區,以便您遵循每個國家/地區的資料保護法。
除了其位置之外,所有邏輯伺服器的設定都會以相同的方式進行。 您想要使用 Bicep 程式碼來部署邏輯伺服器,且參數應可讓您指定應在其中部署邏輯伺服器的區域。
在此單元中,您將了解如何使用複製迴圈來部署多個資源執行個體。
注意
本單元中的命令僅用於示範概念。 請先不要執行命令。 您很快就會在此練習所學到的內容。
使用複製迴圈
當您在 Bicep 範本中定義資源或模組時,您可以使用 for
關鍵字來建立迴圈。 將 for
關鍵字放在資源宣告中,然後指定您希望 Bicep 如何識別迴圈中的每個項目。 一般來說,您會對物件陣列進行迴圈,以建立資源的多個執行個體。 下列範例會部署多個儲存體帳戶,並將其名稱指定為參數值:
param storageAccountNames array = [
'saauditus'
'saauditeurope'
'saauditapac'
]
resource storageAccountResources 'Microsoft.Storage/storageAccounts@2023-05-01' = [for storageAccountName in storageAccountNames: {
name: storageAccountName
location: resourceGroup().location
kind: 'StorageV2'
sku: {
name: 'Standard_LRS'
}
}]
在此範例中,迴圈會逐一查看 storageAccountNames
陣列中的每個項目。 每次 Bicep 通過迴圈時,會將目前的值放入名為 storageAccountName
的特殊變數,並將其當作 name
屬性的值使用。 請注意,Bicep 會要求您將左括弧 ([
) 字元放在 for
關鍵字前,並將右括弧 (]
) 字元放在資源定義之後。
如果部署了此 Bicep 檔案,您會看到三個已建立的儲存體帳戶,其名稱由 storageAccountNames
陣列中的對應項目所指定。
以計數為基礎的迴圈
有時您可能需要迴圈來建立特定數量的資源,而不是使用陣列作為來源。 Bicep 會提供 range()
函數,以建立數字的陣列。 例如,如果您需要透過 sa4
建立名爲 sa1
的四個儲存體帳戶,您可以使用如下的資源定義:
resource storageAccountResources 'Microsoft.Storage/storageAccounts@2023-05-01' = [for i in range(1,4): {
name: 'sa${i}'
location: resourceGroup().location
kind: 'StorageV2'
sku: {
name: 'Standard_LRS'
}
}]
使用 range()
函數時,您會指定其開始值和您想要建立的值數目。 例如,如果想要使用 sa0
、sa1
和 sa2
名稱來建立儲存體帳戶,您可以使用 range(0,3)
函數。
注意
使用 range()
函數時,您會提供兩個引數。 第一個會指定起始值,而第二個會告訴 Bicep 您所需的值數目。 例如,如果您使用 range(3,4)
,則 Bicep 傳回值 3
、4
、5
和 6
。 特別是當您使用的是 0 的起始值時,請確保要求正確的值數目。
存取反覆項目索引
您可以透過 Bicep 逐一查看陣列,並取出陣列中目前元素的索引。 例如,假設您想要在陣列所指定的每個位置中建立邏輯伺服器,而且想要將伺服器的名稱命名為 sqlserver-1
、sqlserver-2
等。 您可以使用下列 Bicep 程式碼來達成此目的:
param locations array = [
'westeurope'
'eastus2'
'eastasia'
]
resource sqlServers 'Microsoft.Sql/servers@2023-08-01-preview' = [for (location, i) in locations: {
name: 'sqlserver-${i+1}'
location: location
properties: {
administratorLogin: administratorLogin
administratorLoginPassword: administratorLoginPassword
}
}]
請注意,name
屬性包含運算式 i+1
。 i
索引變數的第一個值為零,因此,如果您想要讓伺服器名稱開頭為 1
,您必須將 +1
新增至其中。
提示
在此範例中,我們已將索引變數命名為 i
。 這是 Bicep 中的標準慣例。 然而,您可以使用任何想要的名稱。
使用迴圈篩選項目
在某些情況下,您可能會想要使用與條件結合的複製迴圈來部署資源。 您可以藉由結合 if
和 for
關鍵字來完成這項作業。
在下列範例中,程式碼會使用陣列參數來定義一組邏輯伺服器。 只有當迴圈物件的 environmentName
屬性等於 Production
時,才會搭配複製迴圈使用條件來部署伺服器:
param sqlServerDetails array = [
{
name: 'sqlserver-we'
location: 'westeurope'
environmentName: 'Production'
}
{
name: 'sqlserver-eus2'
location: 'eastus2'
environmentName: 'Development'
}
{
name: 'sqlserver-eas'
location: 'eastasia'
environmentName: 'Production'
}
]
resource sqlServers 'Microsoft.Sql/servers@2023-08-01-preview' = [for sqlServer in sqlServerDetails: if (sqlServer.environmentName == 'Production') {
name: sqlServer.name
location: sqlServer.location
properties: {
administratorLogin: administratorLogin
administratorLoginPassword: administratorLoginPassword
}
tags: {
environment: sqlServer.environmentName
}
}]
如果部署了上述範例,您會看到兩部邏輯伺服器,sqlserver-we
以及 sqlserver-eas
,而不是 sqlserver-eus2
,因為該物件的 environmentName
屬性與 Production
不相符。