Wdrażanie wielu zasobów przy użyciu pętli

Ukończone

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@2021-09-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ą sa4metody , możesz użyć definicji zasobu w następujący sposób:

resource storageAccountResources 'Microsoft.Storage/storageAccounts@2021-09-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, sa1i 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, , 45i 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-1wartość , sqlserver-2itd. Można to osiągnąć przy użyciu następującego kodu Bicep:

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

resource sqlServers 'Microsoft.Sql/servers@2021-11-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ą iindeksu . 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 Productionró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@2021-11-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-wesqlserver-eas, ale nie sqlserver-eus2, ponieważ właściwość tego obiektu nie jest zgodna environmentNameProductionz parametrem .