Meerdere resources implementeren met behulp van lussen

Voltooid

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 storageAccountNamegebruikt 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 sa1sa4, 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, sa1en 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 56. 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-2enzovoort. 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+1bevat. 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 ieen 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 Productionaan:

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-eus2environmentNameProduction