Używanie pętli zmiennych i wyjściowych

Ukończone

Wiesz już, jak za pomocą pętli kopiowania wdrożyć wiele wystąpień zasobów i jak ustawić właściwości zasobu przy użyciu pętli. W środowisku Bicep można również używać pętli ze zmiennymi i danymi wyjściowymi.

W firmie z tej samej konfiguracji podsieci należy wdrożyć sieci wirtualne z tą samą konfiguracją podsieci w wielu regionach świadczenia usługi Azure. Oczekujesz, że w przyszłości musisz dodać dodatkowe podsieci do sieci wirtualnych, więc chcesz mieć elastyczność w szablonach Bicep, aby zmodyfikować konfigurację podsieci.

Ponieważ będziesz również wdrażać wiele kont magazynu w środowisku platformy Azure, musisz podać punkty końcowe dla każdego konta magazynu jako dane wyjściowe, aby potoki wdrażania mogły korzystać z tych informacji.

W tej lekcji dowiesz się, jak używać pętli ze zmiennymi i danymi wyjściowymi.

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.

Pętle zmiennych

Korzystając z pętli zmiennych, można utworzyć tablicę, której następnie można użyć za pomocą pliku Bicep. Podobnie jak w przypadku innych pętli, użyj słowa kluczowego for , aby utworzyć pętlę zmiennej:

var items = [for i in range(1, 5): 'item${i}']

Powyższy przykład tworzy tablicę zawierającą wartości item1, , item2, item3item4i item5.

Zwykle należy użyć pętli zmiennych, aby utworzyć bardziej złożone obiekty, których następnie można użyć w deklaracji zasobu. Oto jak używać pętli zmiennych do tworzenia subnets właściwości:

param addressPrefix string = '10.10.0.0/16'
param subnets array = [
  {
    name: 'frontend'
    ipAddressRange: '10.10.0.0/24'
  }
  {
    name: 'backend'
    ipAddressRange: '10.10.1.0/24'
  }
]

var subnetsProperty = [for subnet in subnets: {
  name: subnet.name
  properties: {
    addressPrefix: subnet.ipAddressRange
  }
}]

resource virtualNetwork 'Microsoft.Network/virtualNetworks@2021-08-01' = {
  name: 'teddybear'
  location: resourceGroup().location
  properties:{
    addressSpace:{
      addressPrefixes:[
        addressPrefix
      ]
    }
    subnets: subnetsProperty
  }
}

W tym przykładzie przedstawiono efektywne użycie pętli zmiennych: przekształcanie parametru, który zawiera proste, łatwe do zrozumienia wartości w bardziej złożony obiekt odpowiadający wymaganej definicji zasobu platformy Azure. Za pomocą pętli zmiennych można włączyć parametry, aby określić tylko kluczowe informacje, które zostaną zmienione dla każdego elementu na liście. Następnie możesz użyć wyrażeń Bicep lub wartości domyślnych, aby ustawić inne wymagane właściwości zasobu.

Pętle wyjściowe

Możesz użyć danych wyjściowych Bicep, aby przekazać informacje z wdrożeń z powrotem do użytkownika lub narzędzia, które uruchomiło wdrożenie. Pętle wyjściowe zapewniają elastyczność i moc pętli w danych wyjściowych.

Podobnie jak w przypadku innych pętli, użyj słowa kluczowego for , aby określić pętlę danych wyjściowych:

var items = [
  'item1'
  'item2'
  'item3'
  'item4'
  'item5'
]

output outputItems array = [for i in range(0, length(items)): items[i]]

Zwykle będziesz używać pętli wyjściowych w połączeniu z innymi pętlami w szablonie. Przyjrzyjmy się na przykład plikowi Bicep, który wdraża zestaw kont magazynu w regionach platformy Azure określonych przez locations parametr :

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

resource storageAccounts 'Microsoft.Storage/storageAccounts@2021-09-01' = [for location in locations: {
  name: 'toy${uniqueString(resourceGroup().id, location)}'
  location: location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
  }
}]

Prawdopodobnie trzeba będzie zwrócić informacje o każdym utworzonym koncie magazynu, takim jak jego nazwa i punkty końcowe, których można użyć do uzyskania do niego dostępu. Korzystając z pętli danych wyjściowych, możesz pobrać te informacje w pliku Bicep.

Uwaga

Obecnie Bicep nie obsługuje bezpośredniego odwoływania się do zasobów utworzonych w pętli z poziomu pętli wyjściowej. Oznacza to, że musisz użyć indeksatorów tablicy, aby uzyskać dostęp do zasobów, jak pokazano w następnym przykładzie.

output storageEndpoints array = [for i in range(0, length(locations)): {
  name: storageAccounts[i].name
  location: storageAccounts[i].location
  blobEndpoint: storageAccounts[i].properties.primaryEndpoints.blob
  fileEndpoint: storageAccounts[i].properties.primaryEndpoints.file
}]

Uwaga

Nie używaj danych wyjściowych do zwracania wpisów tajnych, takich jak klucze dostępu lub hasła. Dane wyjściowe są rejestrowane i nie są przeznaczone do obsługi bezpiecznych danych.