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 gli 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.
Usare elementi Decorator
Gli elementi Decorator vengono scritti nel formato @expression
e vengono posizionati sopra le dichiarazioni di output. Nella tabella seguente vengono illustrati gli elementi Decorator disponibili per gli output.
Decorator | Applica a | Argomento | Descrizione |
---|---|---|---|
description | tutto | string | Specificare le descrizioni per l'output. |
discriminator | oggetto | string | Usare questo elemento Decorator per assicurarsi che venga identificata e gestita la sottoclasse corretta. Per altre informazioni, vedere Tipo di dati unione con tag personalizzati. |
maxLength | array, stringa | int | Lunghezza massima per gli output di stringa e matrice. Il valore è inclusivo. |
maxValue | int | int | Valore massimo per l'output integer. Questo valore è inclusivo. |
metadata | tutto | oggetto | Proprietà personalizzate da applicare all'output. Può includere una proprietà description equivalente all'elemento decorator della descrizione. |
minLength | array, stringa | int | Lunghezza minima per gli output di stringa e matrice. Il valore è inclusivo. |
minValue | int | int | Valore minimo per l'output integer. Questo valore è inclusivo. |
sealed | oggetto | Nessuno | Consente di elevare BCP089 da avviso a errore quando è probabile che un nome di proprietà di un tipo di dati definito dall'utente contenga un errore di digitazione. Per altre informazioni, vedere Elevare il livello di errore. |
I decorator si trovano nello spazio dei nomi sys. Se è necessario distinguere un decorator da un altro elemento con lo stesso nome, anteporre al decorator con sys
. Ad esempio, se il file Bicep include un parametro denominato description
, è necessario aggiungere lo spazio dei nomi sys quando si usa il decorator descrizione.
@sys.description('The name of the instance.')
param name string
@sys.description('The description of the instance to display.')
param description string
Descrizione
Per aggiungere una spiegazione, aggiungere una descrizione alle dichiarazioni di output. Ad esempio:
@description('Conditionally output the endpoint.')
output endpoint string = deployStorage ? myStorageAccount.properties.primaryEndpoints.blob : ''
Il testo in formato Markdown può essere usato come testo dell'elemento description.
Discriminatore
Vedere Tipo di dati unione con tag personalizzati.
Vincoli sui numeri interi
È possibile impostare valori minimi e massimi per gli output integer. È possibile impostare uno o entrambi i vincoli.
var thisMonth = 3
@minValue(1)
@maxValue(12)
output month int = thisMonth
Vincoli di lunghezza
È possibile specificare lunghezze minime e massime per gli output di stringa e matrice. È possibile impostare uno o entrambi i vincoli. Per le stringhe, la lunghezza indica il numero di caratteri. Per le matrici, la lunghezza indica il numero di elementi nell'array.
Nell'esempio seguente vengono dichiarati due output. Un output è per un nome di account di archiviazione che deve avere 3-24 caratteri. L'altro output è una matrice che deve avere da 1 a 5 elementi.
var accountName = uniqueString(resourceGroup().id)
var appNames = [
'SyncSphere'
'DataWhiz'
'FlowMatrix'
]
@minLength(3)
@maxLength(24)
output storageAccountName string = accountName
@minLength(1)
@maxLength(5)
output applicationNames array = appNames
Metadati UFX
Se si dispone di proprietà personalizzate da applicare a un output, aggiungere un elemento Decorator di metadati. All'interno dei metadati definire un oggetto con i nomi e i valori personalizzati. L'oggetto definito per i metadati può contenere proprietà di qualsiasi nome e tipo.
È possibile usare questo elemento Decorator per tenere traccia delle informazioni sull'output che non ha senso aggiungere alla descrizione.
var obj = {}
@description('Configuration values that are applied when the application starts.')
@metadata({
source: 'database'
contact: 'Web team'
})
output settings object = obj
Quando si fornisce un decorator @metadata()
con una proprietà in conflitto con un altro decorator, tale decorator ha sempre la precedenza su qualsiasi elemento nel decorator @metadata()
. Pertanto, la proprietà in conflitto all'interno del valore @metadata()
è ridondante e verrà sostituita. Per altre informazioni, vedere Nessun metadati in conflitto.
Sealed
Vedere Elevare il livello di errore.
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 si ha distribuito un risorsa in modo condizionale. L'esempio seguente mostra 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@2023-04-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 un array.
param nsgLocation string = resourceGroup().location
param orgNames array = [
'Contoso'
'Fabrikam'
'Coho'
]
resource nsg 'Microsoft.Network/networkSecurityGroups@2023-11-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@2023-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ò variare, a seconda delle implementazioni. Ad esempio, la funzione Bicep items() dispone gli oggetti in ordine alfabetico. In altre posizioni, l'ordine originale può essere mantenuto. Dato questo non determinismo, è preferibile evitare di fare ipotesi sull'ordinamento delle chiavi oggetto durante la scrittura del codice, che interagisce con i parametri e gli output delle distribuzioni.
Passaggi successivi
- Per informazioni sulle proprietà disponibili per gli output, vedere Informazioni sulla struttura e la sintassi di Bicep.