Ausgaben in Bicep

Dieser Artikel beschreibt, wie Sie in einer Bicep-Datei Ausgabewerte definieren. Sie verwenden Ausgaben, wenn Werte von den bereitgestellten Ressourcen zurückgegeben werden müssen. Die Anzahl der Ausgaben in einer Bicep-Datei ist auf 64 beschränkt. Weitere Informationen finden Sie unter Vorlagengrenzwerte.

Definieren der Ausgaben

Die Syntax zum Definieren eines Ausgabewerts lautet:

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

Eine Ausgabe darf nicht denselben Namen wie ein Parameter, eine Variable, ein Modul oder eine Ressource haben. Jeder Ausgabewert muss zu einem der Datentypen oder in einen benutzerdefinierten Datentypausdruck aufgelöst werden.

Im folgenden Beispiel wird gezeigt, wie Sie eine Eigenschaft von einer bereitgestellten Ressource zurückgeben lassen. Im Beispiel ist publicIP der symbolische Name einer öffentlichen IP-Adresse, die in der Bicep-Datei bereitgestellt wird. Der Ausgabewert erhält den vollqualifizierten Domänennamen für die öffentliche IP-Adresse.

output hostname string = publicIP.properties.dnsSettings.fqdn

Im nächsten Beispiel wird veranschaulicht, wie Ausgaben verschiedener Typen zurückgegeben werden.

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

Wenn Sie eine Eigenschaft ausgeben müssen, die einen Bindestrich im Namen aufweist, setzen Sie den Namen in eckige Klammern, anstatt die Punktnotation zu verwenden. Verwenden Sie z. B. ['property-name'] statt .property-name.

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

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

Das folgende Beispiel zeigt, wie Typausdrücke verwendet wird:

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

output out 'a' | 'b' = foo

Weitere Informationen finden Sie unter Benutzerdefinierte Datentypen.

Verwenden von Decorator-Elementen

Decorator-Elemente werden im Format @expression geschrieben und oberhalb von Ausgabedeklarationen platziert. In der folgenden Tabelle werden die für die Ausgabe verfügbaren Decorator-Elemente gezeigt.

Decorator Anwenden auf Argument Beschreibung
Beschreibung all Zeichenfolge Geben Sie Beschreibungen für die Ausgabe an.
discriminator Objekt Zeichenfolge Verwenden Sie dieses Decorator-Element, um sicherzustellen, dass die richtige Unterklasse identifiziert und verwaltet wird. Weitere Informationen finden Sie unter Benutzerdefinierter markierter Union-Datentyp.
MaxLength Array, Zeichenfolge int Die maximale Länge für die Zeichenfolge- und Array-Ausgabe. Der Stop-Wert ist inklusiv.
maxValue INT int Der maximale Wert für die Ausgabe ganzer Zahlen. Der Stop-Wert ist inklusiv.
metadata all Objekt Benutzerdefinierte Eigenschaften, die auf die Ausgabe angewendet werden sollen. Kann eine Beschreibungseigenschaft enthalten, die dem Description-Decorator entspricht.
minLength Array, Zeichenfolge int Die Mindestlänge für die Zeichenfolge- und Array-Ausgabe. Der Stop-Wert ist inklusiv.
minValue INT int Der Mindestwert für die Ausgabe ganzer Zahlen. Der Stop-Wert ist inklusiv.
sealed Objekt none Erhöhen Sie BCP089 von einer Warnung auf einen Fehler, wenn ein Eigenschaftenname eines benutzerdefinierten Datentyps wahrscheinlich ein Tippfehler ist. Weitere Informationen finden Sie unter Erhöhen der Fehlerebene.

Decorators befinden sich im sys-Namespace. Wenn Sie diesen Decorator von einem anderen Element gleichen Namens unterscheiden müssen, stellen Sie dem Decorator sys voran. Zum Beispiel, wenn Ihre Bicep Datei einen Parameter mit dem Namen description enthält, müssen Sie den sys Namespace hinzufügen, wenn Sie den description Dekorator verwenden.

@sys.description('The name of the instance.')
param name string
@sys.description('The description of the instance to display.')
param description string

Beschreibung

Um eine Erklärung hinzuzufügen, fügen Sie Ausgabedeklarationen eine Beschreibung hinzu. Zum Beispiel:

@description('Conditionally output the endpoint.')
output endpoint string = deployStorage ? myStorageAccount.properties.primaryEndpoints.blob : ''

Mit Markdown formatierter Text kann für den Beschreibungstext verwendet werden.

Diskriminator

Siehe Benutzerdefinierter markierter Union-Datentyp.

Ganzzahlige Einschränkungen

Sie können die minimalen und maximalen Werte für die ganzzahlige Ausgabe festlegen. Sie können eine oder beide Einschränkungen festlegen.

var thisMonth = 3

@minValue(1)
@maxValue(12)
output month int = thisMonth

Längenbeschränkungen

Sie können die minimale und maximale Länge für die Zeichenfolge- und Array-Ausgabe angeben. Sie können eine oder beide Einschränkungen festlegen. Bei Zeichenfolgen gibt die Länge die Anzahl der Zeichen an. Bei Arrays gibt die Länge die Anzahl der Elemente im Array an.

Im folgenden Beispiel werden zwei Ausgaben deklariert. Eine Ausgabe bezieht sich auf den Namen eines Speicherkontos, der 3–24 Zeichen enthalten muss. Die andere Ausgabe ist ein Array, das 1–5 Elemente aufweisen muss.

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

Metadaten

Wenn Sie benutzerdefinierte Eigenschaften haben, die Sie auf eine Ausgabe anwenden möchten, fügen Sie einen Metadaten-Decorator hinzu. Definieren Sie innerhalb der Metadaten ein Objekt mit den benutzerdefinierten Namen und Werten. Das Objekt, das Sie für die Metadaten definieren, kann Eigenschaften eines beliebigen Namens und Typs enthalten.

Sie können diesen Decorator verwenden, um Informationen über die Ausgabe nachzuverfolgen, bei denen es nicht sinnvoll wäre, sie in die Beschreibung aufzunehmen.

var obj = {}
@description('Configuration values that are applied when the application starts.')
@metadata({
  source: 'database'
  contact: 'Web team'
})
output settings object = obj

Wenn Sie ein @metadata()-Decorator-Element mit einer Eigenschaft bereitstellen, die mit einem anderen Decorator-Element in Konflikt steht, hat dieses Decorator-Element immer Vorrang vor allen Elementen im @metadata()-Decorator-Element. Daher ist die in Konflikt stehende Eigenschaft innerhalb des Werts @metadata() redundant und wird ersetzt. Weitere Informationen finden Sie unter Keine widersprüchlichen Metadaten.

Versiegelt

Siehe Erhöhen der Fehlerebene.

Bedingte Ausgabe

Wenn der zurückzugebende Wert von einer Bedingung in der Bereitstellung abhängt, verwenden Sie den ?-Operator.

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

In der Regel verwenden Sie eine bedingte Ausgabe, wenn Sie eine Ressource bedingt bereitgestellt haben. Das folgende Beispiel zeigt, wie die Ressourcen-ID für eine öffentliche IP-Adresse abhängig davon zurückgegeben wird, ob eine neue Ressourcen-ID bereitgestellt wurde.

Um eine bedingte Ausgabe in Bicep anzugeben, verwenden Sie den ?-Operator. Im folgenden Beispiel wird entweder eine Endpunkt-URL oder eine leere Zeichenfolge zurückgegeben, abhängig von einer Bedingung.

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

Dynamische Anzahl von Ausgaben

In einigen Szenarien wissen Sie nicht, wie viele Instanzen eines Werts beim Erstellen der Vorlage zurückgegeben werden müssen. Sie können eine variable Anzahl von Werten zurückgeben, indem Sie den for-Ausdruck verwenden.

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

Im folgenden Beispiel wird ein Array durchlaufen.

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

Weitere Informationen zu Schleifen finden Sie unter Iterative Schleifen in Bicep.

Ausgaben von Modulen

Um von einem Modul einen Ausgabewert zu erhalten, verwenden Sie die folgende Syntax:

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

Das folgende Beispiel zeigt, wie Sie die IP-Adresse für einen Lastenausgleich festlegen, indem Sie einen Wert aus einem Modul abrufen.

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

Abrufen von Ausgabewerten

Bei erfolgreicher Bereitstellung werden die Ausgabewerte automatisch in den Ergebnissen der Bereitstellung zurückgegeben.

Sie können ein Azure CLI- oder Azure PowerShell-Skript verwenden, um Ausgabewerte aus dem Bereitstellungsverlauf abzurufen.

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

Objektsortierung in Ausgaben

In JSON ist ein Objekt eine nicht geordnete Auflistung von null oder mehr Schlüssel-Wert-Paaren. Die Reihenfolge kann je nach Implementierung unterschiedlich sein. Die Items()-Funktion von Bicep sortiert die Objekte beispielsweise in alphabetischer Reihenfolge. An anderen Stellen kann die ursprüngliche Reihenfolge beibehalten werden. Aufgrund dieses Nicht-Determinismus sollten Sie beim Schreiben von Code, der mit den Parametern und Ausgaben der Bereitstellung interagiert, keine Annahmen über die Reihenfolge der Objektschlüssel anstellen.

Nächste Schritte