Saídas no Bicep

Este artigo descreve como definir valores de saída em um arquivo Bicep. Você usa saídas quando precisa retornar valores dos recursos implantados. Você está limitado a 64 saídas em um arquivo Bicep. Para obter mais informações, confira Limites de modelo.

Definir os valores de saída

A sintaxe para definir um valor de saída é:

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

Uma saída pode ter o mesmo nome que um parâmetro, variável, módulo ou recurso. Cada valor de saída deve ser resolvido para um dos tipos de dados.

O exemplo a seguir mostra como retornar uma propriedade de um recurso implantado. No exemplo, é publicIP o nome simbólico de um endereço IP público implantado no arquivo Bicep. O valor de saída obtém o nome de domínio totalmente qualificado para um endereço IP público.

output hostname string = publicIP.properties.dnsSettings.fqdn

O próximo exemplo mostra como retornar saídas de tipos diferentes.

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 você precisar gerar uma propriedade que tenha um hífen no nome, use colchetes ao redor do nome em vez da notação de ponto. Por exemplo, use ['property-name'] ao invés de .property-name.

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

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

Saída condicional

Quando o valor a ser retornado depender de uma condição na implantação, use o ? operador.

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

Normalmente, você usa uma saída condicional quando implementa condicionalmente um recurso. O exemplo a seguir mostra como retornar condicionalmente o ID do recurso para um endereço IP público com base na implantação de um novo.

Para especificar uma saída condicional no Bicep, use o operador ?. O exemplo a seguir retorna uma URL do ponto de extremidade ou uma cadeia de caracteres vazia, dependendo de uma condição.

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 saídas

Em alguns cenários, não é possível saber o número de instâncias de um valor que precisa retornar ao criar o modelo. Você pode retornar um número variável de valores usando a expressão for.

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

O exemplo a seguir itera em uma 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 obter mais informações sobre loops, consulte Loops iterativos no Bicep.

Saídas de módulos

Para obter um valor de saída de um módulo, use a seguinte sintaxe:

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

O exemplo a seguir mostra como definir o endereço IP em um balanceador de carga recuperando um valor de um modelo.

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

Obter valores de saída

Quando a implantação for bem-sucedida, os valores de saída serão retornados automaticamente nos resultados da implantação.

Para obter os valores de saída do histórico de implantações, use a CLI do Azure ou um script do Azure PowerShell.

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

Classificação de objeto em saídas

No JSON, um objeto é uma coleção não ordenada de zero ou mais pares chave-valor. A ordenação pode ser diferente, dependendo das implementações. Por exemplo, a função items() do Bicep classifica os objetos na ordem alfabética. Em outros locais, a ordenação original pode ser preservada. Devido a esse não determinismo, evite fazer suposições sobre a ordenação de chaves de objeto ao escrever um código que interage com saídas de parâmetros & de implantações.

Próximas etapas