Provádění smyčky řízení a vnoření smyček

Dokončeno

Pomocí funkce výkonných smyček kopírování můžete vytvářet dynamické a flexibilní šablony. Je důležité pochopit, jak řídit způsob, jakým se smyčky spouštějí při vytváření prostředků a jak používat smyčky k nastavení vlastností prostředků a vnořování smyček.

V této lekci se naučíte řídit spouštění smyček kopírování a jak používat smyčky vlastností prostředků a vnořené smyčky v Bicep.

Poznámka:

Příkazy v této lekci jsou znázorněny pro ilustraci konceptů. Zatím nespouštět příkazy. Brzy si procvičíte, co se tady naučíte.

Provádění řídicí smyčky

Azure Resource Manager ve výchozím nastavení vytváří prostředky ze smyček paralelně a v ne deterministickém pořadí. Když jste vytvořili smyčky v předchozích cvičeních, vytvořily se současně oba logické servery Azure SQL. To pomáhá zkrátit celkovou dobu nasazení, protože všechny prostředky ve smyčce se nasazují najednou.

V některých případech ale možná budete muset prostředky nasazovat ve smyčce postupně místo paralelně nebo nasazovat malé dávky změn paralelně. Pokud máte například ve svém produkčním prostředí hodně aplikací služby Aplikace Azure, můžete chtít nasadit změny jenom na malé číslo najednou, aby se zabránilo restartování všech aktualizací současně.

Způsob spouštění smyček kopírování v Bicep můžete řídit pomocí dekorátoru @batchSize . Umístěte dekorátor na deklaraci prostředku nebo modulu s klíčovým slovem for .

Podívejme se na ukázkovou definici Bicep pro sadu aplikací App Service bez dekorátoru @batchSize :

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

Všechny prostředky v této smyčce se nasadí současně paralelně:

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

Nyní použijeme @batchSize dekorátor s hodnotou 2:

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

Když šablonu nasadíte, Bicep se nasadí v dávkách dvou:

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.

Poznámka:

Bicep čeká na dokončení každé úplné dávky, než přejde na další. Pokud v předchozím příkladu aplikace 2 dokončí nasazení před aplikací 1, bicep čeká, dokud se aplikace 1 nedokončí, než začne nasazovat aplikaci 3.

Můžete také informovat Bicep, aby spouštět smyčku postupně, a to nastavením na @batchSize 1:

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

Když šablonu nasadíte, Bicep čeká na dokončení každého nasazení prostředků, než se spustí další:

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

Použití smyček s vlastnostmi prostředku

Pomocí smyček můžete nastavit vlastnosti prostředku. Když například nasadíte virtuální síť, musíte zadat její podsítě. Podsíť musí mít dva důležité informace: název a předponu adresy. Parametr můžete použít s polem objektů, abyste mohli pro každé prostředí zadat různé podsítě:

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'
      }
    }]
  }
}

V tomto příkladu si všimněte, že smyčka for se zobrazí v definici prostředku kolem subnets hodnoty vlastnosti.

Vnořené smyčky

Některé scénáře vyžadují použití smyčky uvnitř jiné smyčky nebo vnořené smyčky. Vnořené smyčky můžete vytvářet pomocí bicep.

Pro vaši společnost s teddy medvědem toy, musíte nasadit virtuální sítě v každé zemi nebo oblasti, kde se to bude spouštět. Každá virtuální síť potřebuje jiný adresní prostor a dvě podsítě. Začněme nasazením virtuálních sítí ve smyčce:

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'
      ]
    }
  }
}]

Tato smyčka nasadí virtuální sítě pro každé umístění a nastaví addressPrefix virtuální síť pomocí indexu smyčky, aby každá virtuální síť získala jinou předponu adresy.

K nasazení podsítí v rámci každé virtuální sítě můžete použít vnořenou smyčku:

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'
      }
    }]
  }
}]

Vnořená smyčka používá range() funkci k vytvoření dvou podsítí.

Při nasazení šablony získáte následující virtuální sítě a podsítě:

Název virtuální sítě Poloha Předpona adresy Podsítě
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