Bereitstellen mehrerer Ressourcen mithilfe von Schleifen

Abgeschlossen

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@2021-09-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@2021-09-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@2021-11-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@2021-11-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.