Wykonywanie pętli sterowania i pętle zagnieżdżenia
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@2024-04-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:
Teraz zastosujmy @batchSize
dekorator z wartością 2
:
@batchSize(2)
resource appServiceApp 'Microsoft.Web/sites@2024-04-01' = [for i in range(1,3): {
name: 'app${i}'
// ...
}]
Podczas wdrażania szablonu Bicep zostanie wdrożony w partiach dwóch:
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 @batchSize
1
:
@batchSize(1)
resource appServiceApp 'Microsoft.Web/sites@2024-04-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:
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@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'
}
}]
}
}
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@2024-05-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@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'
}
}]
}
}]
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 |