Usare cicli di variabili e output

Completato

Si è appreso come usare i cicli di copia per distribuire più istanze delle risorse e come impostare le proprietà di una risorsa tramite i cicli. In Bicep è anche possibile usare cicli con variabili e output.

Per l'azienda di giocattoli, è necessario distribuire reti virtuali con la stessa configurazione di subnet in più aree di Azure. Si prevede che in futuro sarà necessario aggiungere altre subnet alle reti virtuali, quindi si vuole che i modelli Bicep offrano la flessibilità necessaria per modificare la configurazione della subnet.

Poiché si distribuiranno anche più account di archiviazione nell'ambiente Azure, è necessario fornire gli endpoint per ogni account di archiviazione come output, in modo che le pipeline di distribuzione possano usare queste informazioni.

In questa unità verranno fornite informazioni su come usare i cicli con variabili e output.

Nota

I comandi riportati in questa unità vengono illustrati per spiegare i concetti. Non eseguire ancora i comandi. Presto sarà possibile provare quanto appreso.

Cicli di variabili

Usando i cicli di variabili, è possibile creare una matrice, che è quindi possibile usare tramite il file Bicep. Come per gli altri cicli, per creare un ciclo di variabili si usa la parola chiave for:

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

L'esempio precedente consente di creare una matrice contenente i valori item1, item2, item3, item4 e item5.

In genere i cicli di variabili si usano per creare oggetti più complessi che è quindi possibile usare all'interno di una dichiarazione di risorsa. Ecco come usare i cicli di variabili per creare una proprietà subnets:

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

Questo esempio illustra un uso efficace dei cicli di variabili: la trasformazione di un parametro con valori semplici e di facile comprensione in un oggetto più complesso che consente di definire la risorsa di Azure. Usando i cicli di variabili, i parametri possono specificare solo le informazioni chiave che cambieranno per ogni elemento dell'elenco. È quindi possibile usare espressioni Bicep o valori predefiniti per impostare altre proprietà richieste per la risorsa.

Cicli di output

Gli output Bicep consentono di fornire informazioni dalle distribuzioni all'utente o allo strumento che ha avviato la distribuzione. I cicli di output offrono la flessibilità e la potenza dei cicli all'interno degli output.

Come per gli altri cicli, per specificare un ciclo di output si usa la parola chiave for:

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

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

In genere i cicli di output si usano in combinazione con altri cicli all'interno del modello. Esaminare ad esempio un file Bicep che distribuisce un set di account di archiviazione nelle aree di Azure specificate dal parametro 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'
  }
}]

Probabilmente sarà necessario restituire informazioni su ogni account di archiviazione creato, ad esempio il nome e gli endpoint che è possibile usare per accedervi. Usando un ciclo di output, è possibile recuperare tali informazioni nel file Bicep.

Nota

Attualmente, Bicep non consente di fare riferimento direttamente alle risorse create all'interno di un ciclo da un ciclo di output. Ciò significa che è necessario usare indicizzatori di matrice per accedere alle risorse, come illustrato nell'esempio seguente.

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

Attenzione

Non usare gli output per restituire segreti, ad esempio chiavi di accesso o password. Gli output vengono registrati e non sono progettati per gestire dati protetti.