Uitvoer in Bicep

In dit artikel wordt beschreven hoe u uitvoerwaarden definieert in een Bicep-bestand. U gebruikt uitvoer wanneer u waarden van de geïmplementeerde resources moet retourneren. U bent beperkt tot 64 uitvoer in een Bicep-bestand. Zie Sjabloonlimieten voor meer informatie.

Uitvoerwaarden definiëren

De syntaxis voor het definiëren van een uitvoerwaarde is:

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

Een uitvoer kan dezelfde naam hebben als een parameter, variabele, module of resource. Elke uitvoerwaarde moet worden omgezet in een van de gegevenstypen of door de gebruiker gedefinieerde expressie voor gegevenstypen.

In het volgende voorbeeld ziet u hoe u een eigenschap van een geïmplementeerde resource kunt retourneren. In het voorbeeld publicIP is dit de symbolische naam voor een openbaar IP-adres dat is geïmplementeerd in het Bicep-bestand. De uitvoerwaarde haalt de volledig gekwalificeerde domeinnaam op voor het openbare IP-adres.

output hostname string = publicIP.properties.dnsSettings.fqdn

In het volgende voorbeeld ziet u hoe u uitvoer van verschillende typen retourneert.

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()

Als u een eigenschap met een afbreekstreepje in de naam wilt uitvoeren, gebruikt u vierkante haken rond de naam in plaats van punt notatie. Gebruik bijvoorbeeld ['property-name'] in plaats van .property-name.

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

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

In het volgende voorbeeld ziet u hoe u een typeexpressie gebruikt:

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

output out 'a' | 'b' = foo

Zie Door de gebruiker gedefinieerde gegevenstypen voor meer informatie.

Voorwaardelijke uitvoer

Wanneer de te retourneren waarde afhankelijk is van een voorwaarde in de implementatie, gebruikt u de ? operator.

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

Normaal gesproken gebruikt u een voorwaardelijke uitvoer wanneer u een resource voorwaardelijk hebt geïmplementeerd . In het volgende voorbeeld ziet u hoe u de resource-id voorwaardelijk retourneert voor een openbaar IP-adres op basis van of er een nieuwe is geïmplementeerd.

Als u een voorwaardelijke uitvoer in Bicep wilt opgeven, gebruikt u de ? operator. In het volgende voorbeeld wordt een eindpunt-URL of een lege tekenreeks geretourneerd, afhankelijk van een voorwaarde.

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

Dynamisch aantal uitvoer

In sommige scenario's weet u niet hoeveel exemplaren van een waarde u moet retourneren bij het maken van de sjabloon. U kunt een variabel aantal waarden retourneren met behulp van de for expressie.

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

In het volgende voorbeeld wordt een matrix herhaald.

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

Zie Iteratieve lussen in Bicep voor meer informatie over lussen.

Uitvoer van modules

Gebruik de volgende syntaxis om een uitvoerwaarde op te halen uit een module:

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

In het volgende voorbeeld ziet u hoe u het IP-adres op een load balancer instelt door een waarde op te halen uit een module.

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

Uitvoerwaarden ophalen

Wanneer de implementatie slaagt, worden de uitvoerwaarden automatisch geretourneerd in de resultaten van de implementatie.

Als u uitvoerwaarden wilt ophalen uit de implementatiegeschiedenis, kunt u het Azure CLI- of Azure PowerShell-script gebruiken.

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

Objectsortering in uitvoer

In JSON is een object een niet-geordende verzameling van nul of meer sleutel-waardeparen. De volgorde kan verschillen, afhankelijk van de implementaties. De functie Bicep items() sorteert bijvoorbeeld de objecten in alfabetische volgorde. Op andere plaatsen kan de oorspronkelijke volgorde behouden blijven. Vanwege dit niet-determinisme vermijdt u veronderstellingen over de volgorde van objectsleutels bij het schrijven van code, die communiceert met implementatieparameters en uitvoer.

Volgende stappen