Använda variabel- och utdataloopar

Slutförd

Du har lärt dig hur du kan använda kopieringsloopar för att distribuera flera instanser av resurser och hur du anger egenskaperna för en resurs med hjälp av loopar. I Bicep kan du också använda loopar med variabler och utdata.

För ditt leksaksföretag måste du distribuera virtuella nätverk med samma undernätskonfiguration i flera Azure-regioner. Du förväntar dig att du kommer att behöva lägga till ytterligare undernät i dina virtuella nätverk i framtiden, så du vill ha flexibiliteten i dina Bicep-mallar för att ändra undernätskonfigurationen.

Eftersom du även kommer att distribuera flera lagringskonton i Din Azure-miljö måste du ange slutpunkterna för varje lagringskonto som utdata så att dina distributionspipelines kan använda den här informationen.

I den här lektionen får du lära dig hur du använder loopar med variabler och utdata.

Kommentar

Kommandona i den här enheten visas för att illustrera begrepp. Kör inte kommandona än. Du kommer att öva på det du lär dig här snart.

Variabelloopar

Genom att använda variabelloopar kan du skapa en matris som du sedan kan använda via Bicep-filen. Precis som med andra loopar använder du nyckelordet for för att skapa en variabelloop:

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

I föregående exempel skapas en matris som innehåller värdena item1, , item2item3, item4och item5.

Vanligtvis använder du variabelloopar för att skapa mer komplexa objekt som du sedan kan använda i en resursdeklaration. Så här använder du variabelloopar för att skapa en subnets egenskap:

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@2024-05-01' = {
  name: 'teddybear'
  location: resourceGroup().location
  properties:{
    addressSpace:{
      addressPrefixes:[
        addressPrefix
      ]
    }
    subnets: subnetsProperty
  }
}

Det här exemplet illustrerar en effektiv användning för variabelloopar: att omvandla en parameter som har enkla, lättförstålliga värden till ett mer komplext objekt som motsvarar Den Azure-resursens nödvändiga definition. Du kan använda variabelloopar för att aktivera parametrar för att endast ange den nyckelinformation som ska ändras för varje objekt i listan. Du kan sedan använda Bicep-uttryck eller standardvärden för att ange andra obligatoriska egenskaper för resursen.

Utdataloopar

Du kan använda Bicep-utdata för att ange information från dina distributioner tillbaka till användaren eller verktyget som startade distributionen. Utdataslingor ger dig flexibiliteten och kraften hos loopar i dina utdata.

Precis som med andra loopar använder du nyckelordet for för att ange en utdataloop:

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

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

Du använder vanligtvis utdataslingor tillsammans med andra loopar i mallen. Låt oss till exempel titta på en Bicep-fil som distribuerar en uppsättning lagringskonton till Azure-regioner som anges av parametern locations :

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

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

Du måste förmodligen returnera information om varje lagringskonto som du har skapat, till exempel dess namn och de slutpunkter som kan användas för att komma åt det. Genom att använda en utdataloop kan du hämta den här informationen i Bicep-filen.

Kommentar

För närvarande stöder Bicep inte direkt refererande resurser som har skapats i en loop inifrån en utdataloop. Det innebär att du måste använda matrisindexerare för att komma åt resurserna, som du ser i nästa exempel.

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
}]

Varning

Använd inte utdata för att returnera hemligheter, till exempel åtkomstnycklar eller lösenord. Utdata loggas och de är inte utformade för hantering av säkra data.