Distribuera flera resurser med hjälp av loopar
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 sa4
kan 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
, sa1
och 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
, 5
och 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-2
och 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 Production
med :
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
.