Wdrażanie wielu zasobów przy użyciu pętli
Często należy wdrożyć wiele zasobów, które są bardzo podobne. Dodając pętle do plików Bicep, można uniknąć konieczności powtarzania definicji zasobów. Zamiast tego można dynamicznie ustawić liczbę wystąpień zasobu, który chcesz wdrożyć. Można nawet dostosować właściwości dla każdego wystąpienia.
W przypadku twojej firmy toy musisz wdrożyć infrastrukturę zaplecza, w tym niektóre serwery logiczne Usługi Azure SQL, aby obsługiwać uruchamianie nowego inteligentnego niedźwiedzia teddy. Należy wdrożyć dedykowany serwer logiczny w każdym kraju/regionie, w którym będzie dostępna toka, aby zapewnić zgodność z przepisami dotyczącymi ochrony danych w każdym kraju/regionie.
Oprócz ich lokalizacji wszystkie serwery logiczne zostaną skonfigurowane w taki sam sposób. Chcesz użyć kodu Bicep do wdrożenia serwerów logicznych, a parametr powinien umożliwić określenie regionów, w których powinny być wdrażane serwery logiczne.
W tej lekcji dowiesz się, jak wdrożyć wiele wystąpień zasobów przy użyciu pętli kopiowania.
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.
Używanie pętli kopiowania
Podczas definiowania zasobu lub modułu w szablonie Bicep możesz użyć for
słowa kluczowego , aby utworzyć pętlę.
for
Umieść słowo kluczowe w deklaracji zasobu, a następnie określ, jak chcesz, aby Bicep zidentyfikował każdy element w pętli. Zazwyczaj wykonujesz pętlę na tablicy obiektów, aby utworzyć wiele wystąpień zasobu. W poniższym przykładzie wdrożono wiele kont magazynu, a ich nazwy są określane jako wartości parametrów:
param storageAccountNames array = [
'saauditus'
'saauditeurope'
'saauditapac'
]
resource storageAccountResources 'Microsoft.Storage/storageAccounts@2023-05-01' = [for storageAccountName in storageAccountNames: {
name: storageAccountName
location: resourceGroup().location
kind: 'StorageV2'
sku: {
name: 'Standard_LRS'
}
}]
W tym przykładzie pętla iteruje poszczególne elementy w tablicy storageAccountNames
. Za każdym razem, gdy Bicep przechodzi przez pętlę, umieszcza bieżącą wartość w specjalnej zmiennej o nazwie storageAccountName
, i jest używana jako wartość name
właściwości. Zwróć uwagę, że znak Bicep wymaga umieszczenia nawiasu otwierającego ([
) przed for
słowem kluczowym i znaku zamykającego (]
) po definicji zasobu.
Jeśli wdrożono ten plik Bicep, zobaczysz, że zostały utworzone trzy konta magazynu z ich nazwami określonymi przez odpowiednie elementy w tablicy storageAccountNames
.
Pętla oparta na liczbie
Czasami może być konieczne utworzenie pętli w celu utworzenia określonej liczby zasobów, a nie użycia tablicy jako źródła. Bicep udostępnia range()
funkcję, która tworzy tablicę liczb. Jeśli na przykład musisz utworzyć cztery konta magazynu wywoływane sa1
za pomocą sa4
metody , możesz użyć definicji zasobu w następujący sposób:
resource storageAccountResources 'Microsoft.Storage/storageAccounts@2023-05-01' = [for i in range(1,4): {
name: 'sa${i}'
location: resourceGroup().location
kind: 'StorageV2'
sku: {
name: 'Standard_LRS'
}
}]
Gdy używasz range()
funkcji, należy określić jej wartość początkową i liczbę wartości, które chcesz utworzyć. Jeśli na przykład chcesz utworzyć konta magazynu o nazwach sa0
, sa1
i sa2
, użyj funkcji range(0,3)
.
Uwaga
W przypadku korzystania z range()
funkcji należy podać dwa argumenty. Pierwszy określa wartość początkową, a drugi informuje Bicep o żądanej liczbie wartości. Jeśli na przykład używasz range(3,4)
metody , funkcja Bicep zwraca wartości 3
, , 4
5
i 6
. Upewnij się, że żądasz odpowiedniej liczby wartości, szczególnie w przypadku użycia wartości początkowej 0.
Uzyskiwanie dostępu do indeksu iteracji
Dzięki funkcji Bicep można iterować po tablicach i pobierać indeks bieżącego elementu w tablicy. Załóżmy na przykład, że chcesz utworzyć serwer logiczny w każdej lokalizacji określonej przez tablicę, a nazwy serwerów mają mieć sqlserver-1
wartość , sqlserver-2
itd. Można to osiągnąć przy użyciu następującego kodu Bicep:
param locations array = [
'westeurope'
'eastus2'
'eastasia'
]
resource sqlServers 'Microsoft.Sql/servers@2024-05-01-preview' = [for (location, i) in locations: {
name: 'sqlserver-${i+1}'
location: location
properties: {
administratorLogin: administratorLogin
administratorLoginPassword: administratorLoginPassword
}
}]
Zwróć uwagę, że name
właściwość zawiera wyrażenie i+1
. Pierwszą wartością zmiennej indeksu i
jest zero, więc musisz dodać +1
ją, jeśli nazwy serwerów mają zaczynać się od 1
.
Napiwek
W tym przykładzie nazwaliśmy zmienną i
indeksu . Jest to standardowa konwencja w Bicep. Można jednak użyć dowolnej nazwy.
Filtrowanie elementów za pomocą pętli
W niektórych sytuacjach możesz chcieć wdrożyć zasoby przy użyciu pętli kopiowania połączonych z warunkami. Można to zrobić, łącząc if
słowa kluczowe i .for
W poniższym przykładzie kod używa parametru tablicy do zdefiniowania zestawu serwerów logicznych. Warunek jest używany z pętlą kopiowania w celu wdrożenia serwerów tylko wtedy, gdy environmentName
właściwość obiektu pętli jest Production
równa :
param sqlServerDetails array = [
{
name: 'sqlserver-we'
location: 'westeurope'
environmentName: 'Production'
}
{
name: 'sqlserver-eus2'
location: 'eastus2'
environmentName: 'Development'
}
{
name: 'sqlserver-eas'
location: 'eastasia'
environmentName: 'Production'
}
]
resource sqlServers 'Microsoft.Sql/servers@2024-05-01-preview' = [for sqlServer in sqlServerDetails: if (sqlServer.environmentName == 'Production') {
name: sqlServer.name
location: sqlServer.location
properties: {
administratorLogin: administratorLogin
administratorLoginPassword: administratorLoginPassword
}
tags: {
environment: sqlServer.environmentName
}
}]
Jeśli wdrożono powyższy przykład, zobaczysz dwa serwery logiczne i sqlserver-we
sqlserver-eas
, ale nie sqlserver-eus2
, ponieważ właściwość tego obiektu nie jest zgodna environmentName
Production
z parametrem .