Meerdere resources implementeren met behulp van lussen
Vaak moet u meerdere resources implementeren die vergelijkbaar zijn. Door lussen toe te voegen aan uw Bicep-bestanden, kunt u voorkomen dat u resourcedefinities moet herhalen. In plaats daarvan kunt u het aantal exemplaren van een resource dat u wilt implementeren dynamisch instellen. U kunt zelfs de eigenschappen voor elk exemplaar aanpassen.
Voor uw speelgoedbedrijf moet u een back-endinfrastructuur implementeren, waaronder enkele logische Azure SQL-servers, ter ondersteuning van de lancering van de nieuwe slimme teddybeer. U moet een toegewezen logische server implementeren voor elk land of elke regio waar het speelgoed beschikbaar is, zodat u voldoet aan de wetgeving voor gegevensbescherming van elk land/regio.
Naast hun locaties worden alle logische servers op dezelfde manier geconfigureerd. U wilt Bicep-code gebruiken om uw logische servers te implementeren. Met een parameter kunt u de regio's opgeven waarin de logische servers moeten worden geïmplementeerd.
In deze les leert u hoe u meerdere exemplaren van resources implementeert met behulp van kopieerlussen.
Notitie
De opdrachten in deze les worden weergegeven om concepten te illustreren. Voer de opdrachten nog niet uit. U oefent wat u hier binnenkort leert.
Kopieerlussen gebruiken
Wanneer u een resource of een module in een Bicep-sjabloon definieert, kunt u het for
trefwoord gebruiken om een lus te maken. Plaats het for
trefwoord in de resourcedeclaratie en geef vervolgens op hoe u wilt dat Bicep elk item in de lus identificeert. Normaal gesproken doorloopt u een matrix met objecten om meerdere exemplaren van een resource te maken. In het volgende voorbeeld worden meerdere opslagaccounts geïmplementeerd en de bijbehorende namen worden opgegeven als parameterwaarden:
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'
}
}]
In dit voorbeeld doorloopt de lus elk item in de storageAccountNames
matrix. Telkens wanneer Bicep door de lus loopt, wordt de huidige waarde in een speciale variabele met de naam en storageAccountName
gebruikt als de waarde van de name
eigenschap. U ziet dat Bicep vereist dat u een haakje openen ([
) plaatst vóór het for
trefwoord en een haakje sluiten (]
) na de resourcedefinitie.
Als u dit Bicep-bestand hebt geïmplementeerd, ziet u dat er drie opslagaccounts zijn gemaakt, met hun namen die zijn opgegeven door de bijbehorende items in de storageAccountNames
matrix.
Lus op basis van een telling
Soms moet u een lus maken om een specifiek aantal resources te maken en geen matrix als bron te gebruiken. Bicep biedt de range()
functie, waarmee een matrix met getallen wordt gemaakt. Als u bijvoorbeeld vier opslagaccounts moet maken die worden aangeroepen sa1
sa4
, kunt u een resourcedefinitie als volgt gebruiken:
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'
}
}]
Wanneer u de functie gebruikt, geeft u de range()
beginwaarde en het aantal waarden op dat u wilt maken. Als u bijvoorbeeld opslagaccounts wilt maken met de namen sa0
, sa1
en sa2
, gebruikt u de functie range(0,3)
.
Notitie
Wanneer u de range()
functie gebruikt, geeft u twee argumenten op. De eerste geeft de beginwaarde aan en de tweede geeft Bicep het gewenste aantal waarden aan. Als u bijvoorbeeld bicep gebruiktrange(3,4)
, worden de waarden 3
, 4
, en 5
6
. Zorg ervoor dat u het juiste aantal waarden aanvraagt, met name wanneer u een beginwaarde van 0 gebruikt.
Toegang tot de iteratie-index
Met Bicep kunt u matrices herhalen en de index van het huidige element in de matrix ophalen. Stel dat u een logische server wilt maken op elke locatie die is opgegeven door een matrix, en u wilt dat de namen van de servers zijn sqlserver-1
, sqlserver-2
enzovoort. U kunt dit bereiken met behulp van de volgende Bicep-code:
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
}
}]
U ziet dat de name
eigenschap de expressie i+1
bevat. De eerste waarde van de i
indexvariabele is nul, dus u moet hieraan toevoegen +1
als u wilt dat uw servernamen beginnen met 1
.
Tip
In dit voorbeeld hebben we de indexvariabele i
een naam. Dit is de standaardconventie in Bicep. U kunt echter elke gewenste naam gebruiken.
Items filteren met lussen
In sommige situaties wilt u mogelijk resources implementeren met behulp van kopieerlussen in combinatie met voorwaarden. U kunt dit doen door de if
trefwoorden en for
trefwoorden te combineren.
In het volgende voorbeeld gebruikt de code een matrixparameter om een set logische servers te definiëren. Een voorwaarde wordt gebruikt met de kopieerlus om de servers alleen te implementeren wanneer de environmentName
eigenschap van het lusobject gelijk is Production
aan:
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
}
}]
Als u het voorgaande voorbeeld hebt geïmplementeerd, ziet u twee logische servers, maar niet, omdat de eigenschap van sqlserver-we
dat object niet overeenkomtsqlserver-eas
.sqlserver-eus2
environmentName
Production