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.

Definición de valores de salida

La sintaxis para definir un valor de salida es:

output <name> <data-type> = <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.

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

Salida condicional

Cuando el valor que se va a devolver dependa 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@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 : ''

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

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. El nombre del módulo es publicIP.

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

Pasos siguientes