Output in Bicep

Questo articolo descrive come definire i valori di output in un file Bicep. Gli output vengono usati quando è necessario restituire valori dalle risorse distribuite. Sono limitati a 64 output in un file Bicep. Per altre informazioni, vedere Limiti dei modelli.

Definire i valori di output

La sintassi per la definizione di un valore di output è:

output <name> <data-type or type-expression> = <value>

Un output può avere lo stesso nome di un parametro, di una variabile, di un modulo o di una risorsa. Ogni valore di output deve essere risolto in uno dei tipi di dati o in un'espressione di tipo di dati definita dall'utente.

Nell'esempio seguente viene illustrato come restituire una proprietà da una risorsa distribuita. Nell'esempio è publicIP il nome simbolico di un indirizzo IP pubblico distribuito nel file Bicep. Il valore di output ottiene il nome di dominio completo per l'indirizzo IP pubblico.

output hostname string = publicIP.properties.dnsSettings.fqdn

Nell'esempio seguente viene illustrato come restituire output di tipi diversi.

output stringOutput string = deployment().name
output integerOutput int = length(environment().authentication.audiences)
output booleanOutput bool = contains(deployment().name, 'demo')
output arrayOutput array = environment().authentication.audiences
output objectOutput object = subscription()

Se è necessario restituire una proprietà con un trattino nel nome, usare le parentesi quadre intorno al nome anziché la notazione punto. Usare, ad esempio, ['property-name'] invece di .property-name.

var user = {
  'user-name': 'Test Person'
}

output stringOutput string = user['user-name']

L'esempio seguente illustra come usare l'espressione di tipo:

param foo 'a' | 'b' = 'a'

output out 'a' | 'b' = foo

Per altre informazioni, vedere Tipi di dati definiti dall'utente.

Output condizionale

Quando il valore da restituire dipende da una condizione nella distribuzione, usare l'operatore ? .

output <name> <data-type> = <condition> ? <true-value> : <false-value>

In genere, si usa un output condizionale quando è stata distribuita una risorsa in modo condizionale. Nell'esempio seguente viene illustrato come restituire in modo condizionale l'ID risorsa per un indirizzo IP pubblico in base al fatto che ne sia stato distribuito uno nuovo.

Per specificare un output condizionale in Bicep, usare l'operatore ? . Nell'esempio seguente viene restituito un URL dell'endpoint o una stringa vuota a seconda di una condizione.

param deployStorage bool = true
param storageName string
param location string = resourceGroup().location

resource myStorageAccount 'Microsoft.Storage/storageAccounts@2019-06-01' = if (deployStorage) {
  name: storageName
  location: location
  kind: 'StorageV2'
  sku:{
    name:'Standard_LRS'
    tier: 'Standard'
  }
  properties: {
    accessTier: 'Hot'
  }
}

output endpoint string = deployStorage ? myStorageAccount.properties.primaryEndpoints.blob : ''

Numero dinamico di output

In alcuni scenari non si conosce il numero di istanze di un valore che è necessario restituire durante la creazione del modello. È possibile restituire un numero variabile di valori usando l'espressione for .

output <name> <data-type> = [for <item> in <collection>: {
  ...
}]

Nell'esempio seguente viene iterazione su una matrice.

param nsgLocation string = resourceGroup().location
param orgNames array = [
  'Contoso'
  'Fabrikam'
  'Coho'
]

resource nsg 'Microsoft.Network/networkSecurityGroups@2020-06-01' = [for name in orgNames: {
  name: 'nsg-${name}'
  location: nsgLocation
}]

output deployedNSGs array = [for (name, i) in orgNames: {
  orgName: name
  nsgName: nsg[i].name
  resourceId: nsg[i].id
}]

Per altre informazioni sui cicli, vedere Cicli iterativi in Bicep.

Output dai moduli

Per ottenere un valore di output da un modulo, usare la sintassi seguente:

<module-name>.outputs.<property-name>

L'esempio seguente illustra come impostare l'indirizzo IP in un servizio di bilanciamento del carico recuperando un valore da un modulo.

module publicIP 'modules/public-ip-address.bicep' = {
  name: 'public-ip-address-module'
}

resource loadBalancer 'Microsoft.Network/loadBalancers@2020-11-01' = {
  name: loadBalancerName
  location: location
  properties: {
    frontendIPConfigurations: [
      {
        name: 'name'
        properties: {
          publicIPAddress: {
            id: publicIP.outputs.resourceId
          }
        }
      }
    ]
    // ...
  }
}

Ottenere i valori di output

Quando la distribuzione ha esito positivo, i valori di output vengono restituiti automaticamente nei risultati della distribuzione.

Per ottenere i valori di output dalla cronologia di distribuzione, è possibile usare l'interfaccia della riga di comando di Azure o lo script di Azure PowerShell.

(Get-AzResourceGroupDeployment `
  -ResourceGroupName <resource-group-name> `
  -Name <deployment-name>).Outputs.resourceID.value

Ordinamento degli oggetti negli output

In JSON un oggetto è una raccolta non ordinata di zero o più coppie chiave/valore. L'ordinamento può essere diverso a seconda delle implementazioni. Ad esempio, la funzione Bicep items() ordina gli oggetti nell'ordine alfabetico. In altre posizioni, l'ordinamento originale può essere mantenuto. A causa di questo non determinismo, evitare di fare ipotesi sull'ordinamento delle chiavi oggetto durante la scrittura di codice, che interagisce con i parametri e gli output delle distribuzioni.

Passaggi successivi