Steuern der Schleifenausführung und Schachteln von Schleifen

Abgeschlossen

Mithilfe des leistungsstarken Kopierschleifenfeatures können Sie dynamische und flexible Vorlagen erstellen. Es ist wichtig zu verstehen, wie die Ausführung von Schleifen beim Erstellen von Ressourcen gesteuert wird und wie Schleifen zum Festlegen von Ressourceneigenschaften und zum Schachteln von Schleifen verwendet werden.

In dieser Lerneinheit erfahren Sie, wie Sie die Ausführung von Kopierschleifen steuern und Ressourceneigenschaftsschleifen und geschachtelte Schleifen in Bicep verwenden.

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.

Steuern der Schleifenausführung

Standardmäßig erstellt Azure Resource Manager Ressourcen aus Schleifen parallel und in einer nicht deterministischen Reihenfolge. Als Sie in den vorherigen Übungen Schleifen erstellt haben, wurden beide logischen Azure SQL-Server zur gleichen Zeit erstellt. Dies trägt dazu bei, die Gesamtbereitstellungszeit zu reduzieren, da alle Ressourcen innerhalb der Schleife gleichzeitig bereitgestellt werden.

In einigen Fällen muss die Bereitstellung von Ressourcen in Schleifen jedoch sequenziell statt parallel erfolgen, oder Sie müssen kleine Batches von Änderungen parallel bereitstellen. Wenn Sie in Ihrer Produktionsumgebung beispielsweise über viele Azure App Service-Apps verfügen, sollten Sie Änderungen immer nur auf einer kleinen Anzahl gleichzeitig bereitstellen, um zu verhindern, dass sie durch die Updates alle gleichzeitig neu gestartet werden.

Mithilfe des Decorators @batchSize können Sie steuern, wie Ihre Kopierschleifen in Bicep ausgeführt werden. Legen Sie den Decorator für die Ressourcen- oder Moduldeklaration mit dem Schlüsselwort for fest.

Sehen wir uns eine Bicep-Beispieldefinition für eine Reihe von App Service-Anwendungen ohne den Decorator @batchSize an:

resource appServiceApp 'Microsoft.Web/sites@2023-12-01' = [for i in range(1,3): {
  name: 'app${i}'
  // ...
}]

Alle Ressourcen in dieser Schleife werden gleichzeitig bereitgestellt:

Diagram showing time on the horizontal axis, with app1, app2, and app3 stacked vertically to be deployed at the same time.

Nun wenden wir den Decorator @batchSize mit dem Wert 2 an:

@batchSize(2)
resource appServiceApp 'Microsoft.Web/sites@2023-12-01' = [for i in range(1,3): {
  name: 'app${i}'
  // ...
}]

Wenn Sie die Vorlage bereitstellen, führt Bicep die Bereitstellung in Zweierbatches durch:

Diagram showing time on the horizontal axis, with app1 and app2 stacked to run as one batch, and app3 to run as a second batch.

Hinweis

Bicep wartet, bis jeder Batch vollständig abgeschlossen ist, bevor der Vorgang mit dem nächsten Batch fortgesetzt wird. Wenn im vorherigen Beispiel die Bereitstellung von app2 vor der von app1 abgeschlossen ist, wartet Bicep auf den Abschluss von app1, bevor die Bereitstellung von app3 gestartet wird.

Sie können Bicep auch anweisen, die Schleife sequenziell auszuführen, indem Sie @batchSize auf 1 festlegen:

@batchSize(1)
resource appServiceApp 'Microsoft.Web/sites@2023-12-01' = [for i in range(1,3): {
  name: 'app${i}'
  // ...
}]

Wenn Sie die Vorlage bereitstellen, wartet Bicep auf den Abschluss der einzelnen Ressourcenbereitstellungen, bevor die jeweils nächste gestartet wird:

Diagram showing time on the horizontal axis, with app1, app2, and app3 being deployed sequentially.

Verwenden von Schleifen mit Ressourceneigenschaften

Mithilfe von Schleifen können Sie Ressourceneigenschaften festlegen. Wenn Sie beispielsweise ein virtuelles Netzwerk bereitstellen, müssen Sie dessen Subnetze angeben. Ein Subnetz muss über zwei wichtige Informationen verfügen: einen Namen und ein Adresspräfix. Sie können einen Parameter mit einem Array von Objekten verwenden, damit Sie für jede Umgebung unterschiedliche Subnetze angeben können:

param subnetNames array = [
  'api'
  'worker'
]

resource virtualNetwork 'Microsoft.Network/virtualNetworks@2024-01-01' = {
  name: 'teddybear'
  location: resourceGroup().location
  properties: {
    addressSpace: {
      addressPrefixes: [
        '10.0.0.0/16'
      ]
    }
    subnets: [for (subnetName, i) in subnetNames: {
      name: subnetName
      properties: {
        addressPrefix: '10.0.${i}.0/24'
      }
    }]
  }
}

Beachten Sie in diesem Beispiel, dass die Schleife for innerhalb der Ressourcendefinition um den Eigenschaftswert subnets herum angezeigt wird.

Geschachtelte Schleifen

In einigen Szenarien müssen Sie eine Schleife innerhalb einer anderen Schleife, eine geschachtelte Schleife, verwenden. Sie können geschachtelte Schleifen mithilfe von Bicep erstellen.

Für Ihr Teddybär-Spielwarenunternehmen müssen Sie virtuelle Netzwerke in jedem/r Land/Region bereitstellen, in dem das Spielzeug auf den Markt gebracht wird. Jedes virtuelle Netzwerk benötigt einen anderen Adressraum und zwei Subnetze. Wir beginnen mit der Bereitstellung der virtuellen Netzwerke in einer Schleife:

param locations array = [
  'westeurope'
  'eastus2'
  'eastasia'
]

var subnetCount = 2

resource virtualNetworks 'Microsoft.Network/virtualNetworks@2024-01-01' = [for (location, i) in locations : {
  name: 'vnet-${location}'
  location: location
  properties: {
    addressSpace:{
      addressPrefixes:[
        '10.${i}.0.0/16'
      ]
    }
  }
}]

Mit dieser Schleife werden die virtuellen Netzwerke für die einzelnen Standorte bereitgestellt, und addressPrefix wird für das virtuelle Netzwerk mithilfe des Schleifenindexes festgelegt, um sicherzustellen, dass jedes virtuelle Netzwerk ein anderes Adresspräfix erhält.

Über eine geschachtelte Schleife können Sie die Subnetze innerhalb der einzelnen virtuellen Netzwerke bereitstellen:

resource virtualNetworks 'Microsoft.Network/virtualNetworks@2024-01-01' = [for (location, i) in locations : {
  name: 'vnet-${location}'
  location: location
  properties: {
    addressSpace:{
      addressPrefixes:[
        '10.${i}.0.0/16'
      ]
    }
    subnets: [for j in range(1, subnetCount): {
      name: 'subnet-${j}'
      properties: {
        addressPrefix: '10.${i}.${j}.0/24'
      }
    }]
  }
}]

Die geschachtelte Schleife verwendet die Funktion range(), um zwei Subnetze zu erstellen.

Wenn Sie die Vorlage bereitstellen, erhalten Sie die folgenden virtuellen Netzwerke und Subnetze:

Name des virtuellen Netzwerks Standort Adresspräfix Subnetze
vnet-westeurope westeurope 10.0.0.0/16 10.0.1.0/24, 10.0.2.0/24
vnet-eastus2 eastus2 10.1.0.0/16 10.1.1.0/24, 10.1.2.0/24
vnet-eastasia eastasia 10.2.0.0/16 10.2.1.0/24, 10.2.2.0/24