使用迴圈部署多個資源

已完成

您通常需要部署多個非常類似的資源。 藉由將迴圈新增至 Bicep 檔案,您就可以避免重複資源定義。 相反地,您可以動態設定想要部署的資源執行個體數。 您甚至可以自訂每個執行個體的屬性。

若是玩具公司,您需要部署後端基礎結構 (包括一些 Azure SQL 邏輯伺服器),以支援全新智慧型泰迪熊的推出。 您必須將專用的邏輯伺服器部署到將推出玩具的每個國家/地區,以便您遵循每個國家/地區的資料保護法。

除了其位置之外,所有邏輯伺服器的設定都會以相同的方式進行。 您想要使用 Bicep 程式碼來部署邏輯伺服器,且參數應可讓您指定應在其中部署邏輯伺服器的區域。

在此單元中,您將了解如何使用複製迴圈來部署多個資源執行個體。

注意

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

使用複製迴圈

當您在 Bicep 範本中定義資源或模組時,您可以使用 for 關鍵字來建立迴圈。 將 for 關鍵字放在資源宣告中,然後指定您希望 Bicep 如何識別迴圈中的每個項目。 一般來說,您會對物件陣列進行迴圈,以建立資源的多個執行個體。 下列範例會部署多個儲存體帳戶,並將其名稱指定為參數值:

param storageAccountNames array = [
  'saauditus'
  'saauditeurope'
  'saauditapac'
]

resource storageAccountResources 'Microsoft.Storage/storageAccounts@2021-09-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@2021-09-01' = [for i in range(1,4): {
  name: 'sa${i}'
  location: resourceGroup().location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
  }
}]

使用 range() 函數時,您會指定其開始值和您想要建立的值數目。 例如,如果想要使用 sa0sa1sa2 名稱來建立儲存體帳戶,您可以使用 range(0,3) 函數。

注意

使用 range() 函數時,您會提供兩個引數。 第一個會指定起始值,而第二個會告訴 Bicep 您所需的值數目。 例如,如果您使用 range(3,4),則 Bicep 傳回值 3456。 特別是當您使用的是 0 的起始值時,請確保要求正確的值數目。

存取反覆項目索引

您可以透過 Bicep 逐一查看陣列,並取出陣列中目前元素的索引。 例如,假設您想要在陣列所指定的每個位置中建立邏輯伺服器,而且想要將伺服器的名稱命名為 sqlserver-1sqlserver-2 等。 您可以使用下列 Bicep 程式碼來達成此目的:

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

resource sqlServers 'Microsoft.Sql/servers@2021-11-01-preview' = [for (location, i) in locations: {
  name: 'sqlserver-${i+1}'
  location: location
  properties: {
    administratorLogin: administratorLogin
    administratorLoginPassword: administratorLoginPassword
  }
}]

請注意,name 屬性包含運算式 i+1i 索引變數的第一個值為零,因此,如果您想要讓伺服器名稱開頭為 1,您必須將 +1 新增至其中。

提示

在此範例中,我們已將索引變數命名為 i。 這是 Bicep 中的標準慣例。 然而,您可以使用任何想要的名稱。

使用迴圈篩選項目

在某些情況下,您可能會想要使用與條件結合的複製迴圈來部署資源。 您可以藉由結合 iffor 關鍵字來完成這項作業。

在下列範例中,程式碼會使用陣列參數來定義一組邏輯伺服器。 只有當迴圈物件的 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@2021-11-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 不相符。