Bereitstellen mehrerer Ressourcen mithilfe von Schleifen
Häufig müssen Sie mehrere Ressourcen bereitstellen, die sehr ähnlich sind. Indem Sie Ihren Bicep-Dateien Schleifen hinzufügen, müssen Sie Ressourcendefinitionen nicht wiederholen. Stattdessen können Sie die Anzahl von Instanzen einer Ressource, die Sie bereitstellen möchten, dynamisch festlegen. Sie können sogar die Eigenschaften für jede Instanz anpassen.
Für Ihr Spielwarenunternehmen müssen Sie eine Back-End-Infrastruktur bereitstellen, einschließlich einiger logischer Azure SQL-Server, um die Einführung des neuen intelligenten Teddybären zu unterstützen. Sie müssen einen dedizierten logischen Server in jedem Land/jeder Region bereitstellen, in dem bzw. der das Spielzeug verfügbar sein wird, damit Sie die Datenschutzbestimmungen der einzelnen Länder/Regionen einhalten.
Abgesehen von ihren Standorten werden alle logischen Server auf die gleiche Weise konfiguriert. Sie möchten Ihre logischen Server mithilfe von Bicep-Code bereitstellen und die Regionen, in denen die logischen Server bereitgestellt werden sollen, über einen Parameter angeben.
In dieser Lerneinheit erfahren Sie, wie Sie mehrere Instanzen von Ressourcen mithilfe von Kopierschleifen bereitstellen.
Hinweis
Die Befehle in dieser Lerneinheit dienen der Veranschaulichung der Konzepte. Führen Sie die Befehle jetzt noch nicht aus. Sie können das Erlernte in Kürze üben.
Verwenden von Kopierschleifen
Wenn Sie eine Ressource oder ein Modul in einer Bicep-Vorlage definieren, können Sie das Schlüsselwort for
zum Erstellen einer Schleife verwenden. Platzieren Sie das for
-Keyword in der Ressourcendeklaration, und geben Sie dann an, wie Bicep die einzelnen Elemente in der Schleife identifizieren soll. In der Regel durchlaufen Sie ein Array von Objekten in einer Schleife, um mehrere Instanzen einer Ressource zu erstellen. Im folgenden Beispiel werden mehrere Speicherkonten bereitgestellt, deren Namen als Parameterwerte angegeben werden:
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 diesem Beispiel durchläuft die Schleife jedes Element im Array storageAccountNames
. Jedes Mal, wenn Bicep die Schleife durchläuft, wird der aktuelle Wert in eine spezielle Variable namens storageAccountName
eingefügt, die als Wert für die Eigenschaft name
verwendet wird. Hinweis: Für Bicep müssen Sie eine eckige Klammer links ([
) vor das Schlüsselwort for
und eine eckige Klammer rechts (]
) hinter die Ressourcendefinition setzen.
Wenn Sie diese Bicep-Datei bereitstellen, sehen Sie, dass drei Speicherkonten erstellt wurden. Deren Namen werden durch die entsprechenden Elemente im storageAccountNames
-Array angegeben.
Erstellen einer Schleife basierend auf einer Anzahl
Gelegentlich müssen Sie eine Schleife verwenden, um eine bestimmte Anzahl von Ressourcen zu erstellen. In diesem Fall wird kein Array als Quelle verwendet. Bicep stellt die Funktion range()
bereit, die ein Array von Zahlen erstellt. Wenn Sie beispielsweise vier Speicherkonten erstellen müssen, sa1
bis sa4
, können Sie eine Ressourcendefinition wie die folgende verwenden:
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'
}
}]
Wenn Sie die Funktion range()
verwenden, geben Sie einen Startwert und die Anzahl von Werten an, die Sie erstellen möchten. Um beispielsweise Speicherkonten mit den Namen sa0
, sa1
und sa2
zu erstellen, verwenden Sie die Funktion range(0,3)
.
Hinweis
Bei Verwendung der Funktion range()
geben Sie zwei Argumente an. Das erste gibt den Startwert an, und das zweite teilt Bicep die gewünschte Anzahl von Werten mit. Wenn Sie beispielsweise range(3,4)
verwenden, gibt Bicep die Werte 3
, 4
, 5
und 6
zurück. Stellen Sie sicher, dass Sie die richtige Anzahl von Werten anfordern, insbesondere wenn Sie den Startwert 0 verwenden.
Zugreifen auf den Iterationsindex
Mit Bicep können Sie Arrays durchlaufen und den Index des aktuellen Elements im Array abrufen. Beispiel: Sie möchten einen logischen Server an jedem Standort erstellen, der durch ein Array angegeben wird. Die Namen der Server sollen sqlserver-1
, sqlserver-2
usw. lauten. Zu diesem Zweck können Sie den folgenden Bicep-Code verwenden:
param locations array = [
'westeurope'
'eastus2'
'eastasia'
]
resource sqlServers 'Microsoft.Sql/servers@2023-08-01-preview' = [for (location, i) in locations: {
name: 'sqlserver-${i+1}'
location: location
properties: {
administratorLogin: administratorLogin
administratorLoginPassword: administratorLoginPassword
}
}]
Beachten Sie, dass die Eigenschaft name
den Ausdruck i+1
enthält. Der erste Wert der Indexvariablen i
ist 0 (null), daher müssen Sie ihr +1
hinzufügen, wenn Ihre Servernamen bei 1
beginnen sollen.
Tipp
In diesem Beispiel haben wir die Indexvariable i
benannt. Dies ist die Standardkonvention in Bicep. Sie können jedoch einen beliebigen Namen verwenden.
Filtern von Elementen mit Schleifen
In einigen Fällen möchten Sie Ressourcen vielleicht über Kopierschleifen in Kombination mit Bedingungen bereitstellen. Hierzu können Sie die Schlüsselwörter if
und for
kombinieren.
Im folgenden Beispiel wird im Code ein Arrayparameter verwendet, um einen Satz logischer Server zu definieren. Mit der Kopierschleife wird eine Bedingung eingesetzt, um die Server nur dann bereitzustellen, wenn die Eigenschaft environmentName
des Schleifenobjekts den Wert Production
aufweist:
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@2023-08-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
}
}]
Wenn Sie das vorherige Beispiel bereitgestellt haben, werden Ihnen zwei logische Server angezeigt (sqlserver-we
und sqlserver-eas
), aber nicht sqlserver-eus2
, weil die Eigenschaft environmentName
dieses Objekts nicht Production
entspricht.