Salidas en Bicep
En este artículo, se describe cómo definir valores de salida en un archivo de Bicep. Las salidas se usan cuando es necesario devolver valores de los recursos implementados. Está limitada a 64 salidas en un archivo Bicep. Para obtener más información, consulte Límites de plantilla.
Definir las salidas
La sintaxis para definir un valor de salida es:
output <name> <data-type or type-expression> = <value>
Una salida puede tener el mismo nombre que un parámetro, una variable, un módulo o un recurso. Cada valor de salida debe resolverse en uno de los tipos de datos o la expresión de tipo de datos definida por el usuario.
En el ejemplo siguiente se muestra cómo devolver una propiedad desde un recurso implementado. En el ejemplo, publicIP
es el nombre simbólico de una dirección IP pública implementada en el archivo de Bicep. El valor de salida obtiene el nombre de dominio completo de la dirección IP pública.
output hostname string = publicIP.properties.dnsSettings.fqdn
En el ejemplo siguiente se muestra cómo devolver salidas de distintos tipos.
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()
Si necesita generar una propiedad que tenga un guion en el nombre, use corchetes alrededor del nombre en lugar de la notación de puntos. Por ejemplo, use ['property-name']
en lugar de .property-name
.
var user = {
'user-name': 'Test Person'
}
output stringOutput string = user['user-name']
En el ejemplo siguiente se muestra cómo usar la expresión de tipo:
param foo 'a' | 'b' = 'a'
output out 'a' | 'b' = foo
Para obtener más información, consulte Tipos de datos definidos por el usuario.
Usar decoradores
Los decoradores se escriben en el formato @expression
y se colocan encima de las declaraciones de salida. La siguiente tabla muestra los decoradores disponibles para las salidas.
Decorador | Aplicar a | Argumento | Descripción |
---|---|---|---|
descripción | all | string | Proporcione descripciones para la salida. |
discriminator | objeto | string | Use este decorador para asegurarse de que la subclase correcta se identifica y administra. Para obtener más información, vea Tipo de datos de unión etiquetado personalizado. |
maxLength | array, string | int | Longitud máxima de las salidas de cadena y matriz. El valor es inclusivo. |
maxValue | int | int | El valor máximo para la salida de enteros. Este valor es inclusivo. |
metadata | all | objeto | Propiedades personalizadas que se aplicarán a la salida. Pueden incluir una propiedad de descripción equivalente al decorador de la descripción. |
minLength | array, string | int | La longitud mínima para las salidas de cadenas y matrices. El valor es inclusivo. |
minValue | int | int | El valor mínimo para la salida de enteros. Este valor es inclusivo. |
sealed | objeto | None | Eleve BCP089 de una advertencia a un error cuando es probable que un nombre de propiedad de un tipo de datos use-define sea un error tipográfico. Para obtener más información, consulte Elevación del nivel de error. |
Los decoradores están en el espacio de nombres sys. Si tiene que diferenciar un decorador de otro elemento con el mismo nombre, anteceda el decorador con sys
. Por ejemplo, si el archivo de Bicep incluye un parámetro llamado description
, debe agregar el espacio de nombres sys al usar el decorador description.
@sys.description('The name of the instance.')
param name string
@sys.description('The description of the instance to display.')
param description string
Descripción
Para añadir una explicación, añada una descripción a las declaraciones de salida. Por ejemplo:
@description('Conditionally output the endpoint.')
output endpoint string = deployStorage ? myStorageAccount.properties.primaryEndpoints.blob : ''
El texto con formato Markdown se puede usar para el texto de descripción.
Discriminador
Consulte Tipo de datos de unión con etiquetado personalizado.
Restricciones de enteros
Puede establecer valores mínimos y máximos para las salidas de cantidades enteras. Puede establecer una o las dos restricciones.
var thisMonth = 3
@minValue(1)
@maxValue(12)
output month int = thisMonth
Restricciones de longitud
Puede especificar longitudes mínimas y máximas para las salidas de cadenas y matrices. Puede establecer una o las dos restricciones. Para las cadenas, la longitud indica el número de caracteres. Para las matrices, la longitud indica el número de elementos de la matriz.
En el ejemplo siguiente declara dos salidas. Una salida es para un nombre de cuenta de almacenamiento que debe tener entre 3 y 24 caracteres. La otra salida es una matriz que debe tener de 1 a 5 elementos.
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
Metadatos
Si tiene propiedades personalizadas que desea aplicar a una salida, añada un decorador de metadatos. Dentro de los metadatos, defina un objeto con los nombres y valores personalizados. El objeto que defina para los metadatos puede contener propiedades de cualquier nombre y tipo.
Este decorador se puede utilizar para rastrear información sobre la salida que no tenga sentido añadir a la descripción.
var obj = {}
@description('Configuration values that are applied when the application starts.')
@metadata({
source: 'database'
contact: 'Web team'
})
output settings object = obj
Cuando se proporciona un decorador @metadata()
con una propiedad que está en conflicto con otro decorador, ese decorador siempre tiene prioridad sobre cualquier elemento del decorador @metadata()
. Por tanto, la propiedad en conflicto dentro del valor @metadata()
es redundante y se reemplazará. Para obtener más información, consulte Regla de linter: no-conflicting-metadata.
Sellado
Consulte Elevación del nivel de error.
Salida condicional
Cuando el valor que se va a devolver depende de una condición de la implementación, use el operador ?
.
output <name> <data-type> = <condition> ? <true-value> : <false-value>
Por norma general, se usa una salida condicional cuando se implementa condicionalmente un recurso. En el ejemplo siguiente, se muestra cómo se devuelve condicionalmente el identificador de recurso de una dirección IP pública en función de si se ha implementado una nueva.
Para especificar una salida condicional en Bicep, use el operador ?
. En el ejemplo siguiente se devuelve una dirección URL de punto de conexión o una cadena vacía en función de una condición.
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 : ''
Número dinámico de salidas
En algunos escenarios, no se conoce el número de instancias de un valor que se debe devolver al crear la plantilla. Puede devolver un número variable de valores mediante la expresión for
.
output <name> <data-type> = [for <item> in <collection>: {
...
}]
En el ejemplo siguiente se recorre en iteración una matriz.
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
}]
Para más información sobre los bucles, consulte Bucles iterativos en Bicep.
Salidas de módulos
Para obtener un valor de salida de un módulo, use la sintaxis siguiente:
<module-name>.outputs.<property-name>
En el ejemplo siguiente, se muestra cómo establecer la dirección IP en un equilibrador de carga mediante la recuperación de un valor desde un módulo.
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
}
}
}
]
// ...
}
}
Obtención de valores de salida
Cuando la implementación se realiza correctamente, los valores de salida se devuelven automáticamente en los resultados de la implementación.
Para obtener valores de salida del historial de implementación, puede usar la CLI de Azure o un script de Azure PowerShell.
(Get-AzResourceGroupDeployment `
-ResourceGroupName <resource-group-name> `
-Name <deployment-name>).Outputs.resourceID.value
Ordenación de objetos en salidas
En JSON, un objeto es una colección desordenada de cero o más pares clave-valor. El orden puede ser diferente en función de las implementaciones. Por ejemplo, la función Bicep items() ordena los objetos por orden alfabético. En otros lugares, se puede conservar la ordenación original. Debido a este no determinismo, evite realizar suposiciones sobre el orden de las claves de objeto al escribir código, que interactúa con los parámetros y salidas de implementación.
Pasos siguientes
- Para información sobre las propiedades disponibles para las salidas, consulte Descripción de la estructura y la sintaxis de Bicep.