Wykonywanie pętli sterowania i pętle zagnieżdżenia

Ukończone

Korzystając z funkcji zaawansowanych pętli kopiowania, można tworzyć dynamiczne i elastyczne szablony. Ważne jest, aby zrozumieć, jak kontrolować sposób wykonywania pętli podczas tworzenia zasobów i używania pętli do ustawiania właściwości zasobów i pętli zagnieżdżania.

W tej lekcji dowiesz się, jak kontrolować wykonywanie pętli kopiowania oraz jak używać pętli właściwości zasobów i zagnieżdżonych pętli w Bicep.

Uwaga

Polecenia w tej lekcji są wyświetlane w celu zilustrowania pojęć. Nie uruchamiaj jeszcze poleceń. Będziesz ćwiczyć to, czego nauczysz się tutaj wkrótce.

Wykonywanie pętli sterowania

Domyślnie usługa Azure Resource Manager tworzy zasoby na podstawie pętli równolegle i w kolejności niedeterministycznej. Podczas tworzenia pętli w poprzednich ćwiczeniach oba serwery logiczne usługi Azure SQL zostały utworzone w tym samym czasie. Pomaga to skrócić ogólny czas wdrażania, ponieważ wszystkie zasoby w pętli są wdrażane jednocześnie.

W niektórych przypadkach jednak może być konieczne wdrożenie zasobów w pętlach sekwencyjnie zamiast równolegle lub wdrożenie małych partii zmian równolegle. Jeśli na przykład masz wiele aplikacji usługi aplikacja systemu Azure Service w środowisku produkcyjnym, możesz wdrożyć zmiany tylko w niewielkiej liczbie jednocześnie, aby zapobiec ponownemu uruchomieniu wszystkich aktualizacji jednocześnie.

Za pomocą dekoratora @batchSize można kontrolować sposób uruchamiania pętli kopiowania w aplikacji Bicep. Umieść dekorator w deklaracji zasobu lub modułu za pomocą słowa kluczowego for .

Przyjrzyjmy się przykładowej definicji Bicep dla zestawu aplikacji usługi App Service bez dekoratora @batchSize :

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

Wszystkie zasoby w tej pętli zostaną wdrożone w tym samym czasie, równolegle:

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

Teraz zastosujmy @batchSize dekorator z wartością 2:

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

Podczas wdrażania szablonu Bicep zostanie wdrożony w partiach dwóch:

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.

Uwaga

Bicep czeka na zakończenie każdej pełnej partii, zanim przejdzie do następnego. W poprzednim przykładzie, jeśli aplikacja App2 zakończy wdrożenie przed aplikacją app1, Bicep czeka na zakończenie aplikacji app1 przed rozpoczęciem wdrażania aplikacji 3.

Możesz również poinformować Bicep, aby uruchomić pętlę sekwencyjnie, ustawiając wartość na @batchSize1:

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

Po wdrożeniu szablonu Bicep czeka na zakończenie każdego wdrożenia zasobów przed rozpoczęciem następnego:

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

Używanie pętli z właściwościami zasobów

Możesz użyć pętli, aby ułatwić ustawianie właściwości zasobów. Na przykład podczas wdrażania sieci wirtualnej należy określić jej podsieci. Podsieć musi mieć dwie ważne informacje: nazwę i prefiks adresu. Można użyć parametru z tablicą obiektów, aby można było określić różne podsieci dla każdego środowiska:

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

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

W tym przykładzie zwróć uwagę, że pętla for pojawia się w definicji zasobu wokół subnets wartości właściwości.

Pętle zagnieżdżone

Niektóre scenariusze wymagają użycia pętli wewnątrz innej pętli lub zagnieżdżonej pętli. Pętle zagnieżdżone można tworzyć przy użyciu Bicep.

W przypadku twojej firmy teddy bear toy należy wdrożyć sieci wirtualne w każdym kraju/regionie, w którym będzie uruchamiana ta puszka. Każda sieć wirtualna wymaga innej przestrzeni adresowej i dwóch podsieci. Zacznijmy od wdrożenia sieci wirtualnych w pętli:

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

var subnetCount = 2

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

Ta pętla wdraża sieci wirtualne dla każdej lokalizacji i ustawia addressPrefix dla sieci wirtualnej za pomocą indeksu pętli, aby upewnić się, że każda sieć wirtualna otrzymuje inny prefiks adresu.

Możesz użyć zagnieżdżonej pętli, aby wdrożyć podsieci w każdej sieci wirtualnej:

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

Pętla zagnieżdżona używa range() funkcji do tworzenia dwóch podsieci.

Podczas wdrażania szablonu uzyskujesz następujące sieci wirtualne i podsieci:

Nazwa sieci wirtualnej Lokalizacja Prefiks adresu Podsieci
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