Distribuera flera resurser med hjälp av loopar

Slutförd

Ofta behöver du distribuera flera resurser som är mycket lika. Genom att lägga till loopar i dina Bicep-filer kan du undvika att behöva upprepa resursdefinitioner. I stället kan du dynamiskt ange antalet instanser av en resurs som du vill distribuera. Du kan till och med anpassa egenskaperna för varje instans.

För ditt leksaksföretag måste du distribuera backend-infrastruktur, inklusive vissa logiska Azure SQL-servrar, för att stödja lanseringen av den nya smarta nallebjörnen. Du måste distribuera en dedikerad logisk server till varje land/region där leksaken kommer att vara tillgänglig, så att du följer varje lands/regions dataskyddslagar.

Förutom deras platser konfigureras alla logiska servrar på samma sätt. Du vill använda Bicep-kod för att distribuera dina logiska servrar, och med en parameter kan du ange i vilka regioner de logiska servrarna ska distribueras.

I den här lektionen får du lära dig hur du distribuerar flera instanser av resurser med hjälp av kopieringsloopar.

Kommentar

Kommandona i den här enheten visas för att illustrera begrepp. Kör inte kommandona än. Du kommer att öva på det du lär dig här snart.

Använda kopieringsloopar

När du definierar en resurs eller en modul i en Bicep-mall kan du använda nyckelordet for för att skapa en loop. Placera nyckelordet for i resursdeklarationen och ange sedan hur du vill att Bicep ska identifiera varje objekt i loopen. Vanligtvis loopar du över en matris med objekt för att skapa flera instanser av en resurs. I följande exempel distribueras flera lagringskonton och deras namn anges som parametervärden:

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'
  }
}]

I det här exemplet itererar loopen genom varje objekt i matrisen storageAccountNames . Varje gång Bicep går igenom loopen placeras det aktuella värdet i en särskild variabel med namnet storageAccountName, och det används som värdet för name egenskapen. Observera att Bicep kräver att du placerar ett inledande hakparentestecken ([) före nyckelordet for och ett avslutande hakparentestecken (]) efter resursdefinitionen.

Om du distribuerade den här Bicep-filen skulle du se att tre lagringskonton skapades, med deras namn angivna av motsvarande objekt i matrisen storageAccountNames .

Loop baserat på antal

Ibland kan du behöva loopa för att skapa ett visst antal resurser och inte använda en matris som källa. Bicep tillhandahåller range() funktionen, som skapar en matris med tal. Om du till exempel behöver skapa fyra lagringskonton som anropas sa1 via sa4kan du använda en resursdefinition som den här:

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'
  }
}]

När du använder range() funktionen anger du dess startvärde och antalet värden som du vill skapa. Om du till exempel vill skapa lagringskonton med namnen sa0, sa1och sa2, använder du funktionen range(0,3).

Kommentar

När du använder range() funktionen anger du två argument. Den första anger startvärdet och det andra anger det antal värden som du vill använda för Bicep. Om du till exempel använder range(3,4) returnerar Bicep värdena 3, 4, 5och 6. Kontrollera att du begär rätt antal värden, särskilt när du använder ett startvärde på 0.

Få åtkomst till iterationsindexet

Med Bicep kan du iterera genom matriser och hämta indexet för det aktuella elementet i matrisen. Anta till exempel att du vill skapa en logisk server på varje plats som anges av en matris, och du vill att namnen på servrarna ska vara sqlserver-1, sqlserver-2och så vidare. Du kan uppnå detta med hjälp av följande Bicep-kod:

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

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

Observera att egenskapen name innehåller uttrycket i+1. Det första värdet för i indexvariabeln är noll, så du måste lägga +1 till det om du vill att servernamnen ska börja med 1.

Dricks

I det här exemplet har vi namngett indexvariabeln i. Detta är standardkonventionen i Bicep. Du kan dock använda valfritt namn.

Filtrera objekt med loopar

I vissa situationer kanske du vill distribuera resurser med hjälp av kopieringsloopar i kombination med villkor. Du kan göra detta genom att kombinera nyckelorden if och for .

I följande exempel använder koden en matrisparameter för att definiera en uppsättning logiska servrar. Ett villkor används med kopieringsloopen för att distribuera servrarna endast när environmentName egenskapen för loopobjektet är lika Productionmed :

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@2024-05-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
  }
}]

Om du distribuerade föregående exempel skulle du se två logiska servrar sqlserver-we och sqlserver-eas, men inte sqlserver-eus2, eftersom objektets environmentName egenskap inte matchar Production.