Uitvoering van besturingslussen en nestlussen

Voltooid

Met behulp van de krachtige functie voor kopieerlussen kunt u dynamische en flexibele sjablonen maken. Het is belangrijk om te begrijpen hoe u de manier bepaalt waarop lussen worden uitgevoerd wanneer ze resources maken en hoe u lussen gebruikt om resource-eigenschappen en nestlussen in te stellen.

In deze les leert u hoe u de uitvoering van kopieerlussen beheert en hoe u resource-eigenschapslussen en geneste lussen in Bicep gebruikt.

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.

Uitvoering van besturingslus

Azure Resource Manager maakt standaard resources op basis van lussen parallel en in een niet-deterministische volgorde. Wanneer u lussen in de vorige oefeningen hebt gemaakt, zijn beide logische Azure SQL-servers tegelijkertijd gemaakt. Dit helpt de totale implementatietijd te verminderen, omdat alle resources binnen de lus tegelijk worden geïmplementeerd.

In sommige gevallen moet u echter mogelijk resources in lussen opeenvolgend implementeren in plaats van parallel, of kleine batches met wijzigingen parallel implementeren. Als u bijvoorbeeld veel Azure-app Service-apps in uw productieomgeving hebt, kunt u wijzigingen in slechts een klein aantal tegelijk implementeren om te voorkomen dat alle updates tegelijkertijd opnieuw worden opgestart.

U kunt bepalen hoe uw kopieerlussen worden uitgevoerd in Bicep met behulp van de @batchSize decorator. Plaats de decorator op de resource- of moduledeclaratie met het for trefwoord.

Laten we eens kijken naar een bicep-voorbeelddefinitie voor een set App Service-toepassingen zonder de @batchSize decorator:

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

Alle resources in deze lus worden tegelijkertijd geïmplementeerd, parallel:

Diagram met de tijd op de horizontale as, waarbij app1, app2 en app3 verticaal zijn gestapeld om tegelijkertijd te worden geïmplementeerd.

Nu gaan we de @batchSize decorator toepassen met een waarde van 2:

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

Wanneer u de sjabloon implementeert, wordt Bicep geïmplementeerd in batches van twee:

Diagram met de tijd op de horizontale as, waarbij app1 en app2 zijn gestapeld om als één batch te worden uitgevoerd en app3 om als een tweede batch te worden uitgevoerd.

Notitie

Bicep wacht tot elke volledige batch is voltooid voordat deze verdergaat met de volgende. Als app2 in het voorgaande voorbeeld de implementatie voor app1 heeft voltooid, wacht Bicep totdat app1 is voltooid voordat app3 wordt geïmplementeerd.

U kunt bicep ook laten weten dat de lus sequentieel moet worden uitgevoerd door het @batchSize volgende in te 1stellen:

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

Wanneer u de sjabloon implementeert, wacht Bicep tot elke resource-implementatie is voltooid voordat de volgende wordt gestart:

Diagram met de tijd op de horizontale as, waarbij app1, app2 en app3 opeenvolgend worden geïmplementeerd.

Lussen gebruiken met resource-eigenschappen

U kunt lussen gebruiken om resource-eigenschappen in te stellen. Wanneer u bijvoorbeeld een virtueel netwerk implementeert, moet u de subnetten opgeven. Een subnet moet twee belangrijke informatie bevatten: een naam en een adresvoorvoegsel. U kunt een parameter gebruiken met een matrix met objecten, zodat u verschillende subnetten voor elke omgeving kunt opgeven:

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

resource virtualNetwork 'Microsoft.Network/virtualNetworks@2024-05-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'
      }
    }]
  }
}

In dit voorbeeld ziet u dat de for lus binnen de resourcedefinitie wordt weergegeven rond de subnets eigenschapswaarde.

Geneste lussen

Voor sommige scenario's moet u een lus binnen een andere lus of een geneste lus gebruiken. U kunt geneste lussen maken met Bicep.

Voor uw teddybeer speelgoedbedrijf moet u virtuele netwerken implementeren in elk land of elke regio waar het speelgoed wordt gelanceerd. Elk virtueel netwerk heeft een andere adresruimte en twee subnetten nodig. Laten we beginnen met het implementeren van de virtuele netwerken in een lus:

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

var subnetCount = 2

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

Met deze lus worden de virtuele netwerken voor elke locatie geïmplementeerd en wordt het addressPrefix voor het virtuele netwerk ingesteld met behulp van de lusindex om ervoor te zorgen dat elk virtueel netwerk een ander adresvoorvoegsel krijgt.

U kunt een geneste lus gebruiken om de subnetten binnen elk virtueel netwerk te implementeren:

resource virtualNetworks 'Microsoft.Network/virtualNetworks@2024-05-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'
      }
    }]
  }
}]

De geneste lus gebruikt de range() functie om twee subnetten te maken.

Wanneer u de sjabloon implementeert, krijgt u de volgende virtuele netwerken en subnetten:

Naam van virtueel netwerk Locatie Adresvoorvoegsel Subnetten
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