Verstehen der Struktur und Syntax von ARM-Vorlagen
In diesem Artikel wird die Struktur und Syntax einer Bicep-Datei beschrieben. Er zeigt die verschiedenen Abschnitte der Datei und die Eigenschaften, die in diesen Abschnitten verfügbar sind.
Ein schrittweises Tutorial über den Erstellungsprozess einer Bicep-Datei finden Sie unter Schnellstart: Erstellen von Bicep-Dateien mit Visual Studio Code.
Bicep-Format
Bicep ist eine deklarative Sprache, was bedeutet, dass die Elemente in beliebiger Reihenfolge enthalten sein können. Im Gegensatz zu imperativen Sprachen wirkt sich die Reihenfolge der Elemente nicht darauf aus, wie die Bereitstellung verarbeitet wird.
Eine Bicep Datei verfügt über die folgenden Elemente.
@<decorator>(<argument>)
metadata <metadata-name> = ANY
targetScope = '<scope>'
@<decorator>(<argument>)
type <user-defined-data-type-name> = <type-expression>
@<decorator>(<argument>)
func <user-defined-function-name> (<argument-name> <data-type>, <argument-name> <data-type>, ...) <function-data-type> => <expression>
@<decorator>(<argument>)
param <parameter-name> <parameter-data-type> = <default-value>
@<decorator>(<argument>)
var <variable-name> = <variable-value>
@<decorator>(<argument>)
resource <resource-symbolic-name> '<resource-type>@<api-version>' = {
<resource-properties>
}
@<decorator>(<argument>)
module <module-symbolic-name> '<path-to-file>' = {
name: '<linked-deployment-name>'
params: {
<parameter-names-and-values>
}
}
@<decorator>(<argument>)
output <output-name> <output-data-type> = <output-value>
Das folgende Beispiel zeigt eine Implementierung dieser Elemente.
metadata description = 'Creates a storage account and a web app'
@description('The prefix to use for the storage account name.')
@minLength(3)
@maxLength(11)
param storagePrefix string
param storageSKU string = 'Standard_LRS'
param location string = resourceGroup().location
var uniqueStorageName = '${storagePrefix}${uniqueString(resourceGroup().id)}'
resource stg 'Microsoft.Storage/storageAccounts@2023-04-01' = {
name: uniqueStorageName
location: location
sku: {
name: storageSKU
}
kind: 'StorageV2'
properties: {
supportsHttpsTrafficOnly: true
}
}
module webModule './webApp.bicep' = {
name: 'webDeploy'
params: {
skuName: 'S1'
location: location
}
}
Metadaten
Metadaten sind in Bicep ein nicht typisierter Wert, der in Bicep-Dateien enthalten sein kann. Sie können damit zusätzliche Informationen über Ihre Bicep-Dateien bereitstellen, einschließlich Details wie Name, Beschreibung, Autor, Erstellungsdatum und mehr.
Zielbereich
Standardmäßig ist der Zielbereich auf festgelegt resourceGroup
. Wenn Sie auf der Ebene der Ressourcengruppe bereitstellen, müssen Sie den Zielbereich in Ihrer Bicep-Datei nicht festlegen.
Zulässige Werte sind:
- ResourceGroup : Standardwert, der für Ressourcengruppen-Bereitstellungenverwendet wird.
- Abonnement : wird für Abonnement-Bereitstellungenverwendet.
- managementGroup - wird für Bereitstellungen der Verwaltungsgruppe verwendet.
- Tenant - Verwendet fürTenant-Bereitstellungen.
In einem Modul können Sie einen Bereich definieren, der sich vom Bereich für den Rest der Bicep-Datei unterscheiden kann. Weitere Informationen finden Sie unter Online-Backup konfigurieren.
Decorator-Elemente
Sie können für jedes der folgenden Elemente eine oder mehrere Decorator-Elemente hinzufügen:
Zu den Decorators gehören:
Decorator | Auf Element anwenden | Auf Datentyp anwenden | Argument | Beschreibung |
---|---|---|---|---|
Zulässig | param | all | array | Verwenden Sie diesen Decorator, um sicherzustellen, dass der Benutzer korrekte Werte bereitstellt. Dieses Decorator-Element ist nur für param -Anweisungen zulässig. Um zu deklarieren, dass eine Eigenschaft einer Gruppe vordefinierter Werte in einer type - oder output -Anweisung angehören muss, verwenden Sie die Union-Typsyntax. Die Union-Typsyntax kann auch in param -Anweisungen verwendet werden. |
batchSize | module, resource | N/V | integer | Richten Sie Instanzen so ein, dass sie sequenziell bereitgestellt werden. |
Beschreibung | func, param, module, output, resource, type, var | all | Zeichenfolge | Geben Sie Beschreibungen für die Elemente an. Markdown-formatierter Text kann für den Beschreibungstext verwendet werden. |
discriminator | param, type, output | 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. |
Export | func, type, var | all | none | Gibt an, dass das Element von einer anderen Bicep-Datei importiert werden kann. |
maxLength | param, output, type | Array, Zeichenfolge | int | Die maximale Länge für Zeichenfolgen- und Arrayelemente. Der Stop-Wert ist inklusiv. |
maxValue | param, output, type | int | int | Der maximale Wert für die ganzzahligen Elemente. Der Stop-Wert ist inklusiv. |
metadata | func, output, param, type | all | Objekt | Benutzerdefinierte Eigenschaften, die auf die Elemente angewendet werden sollen. Kann eine Beschreibungseigenschaft enthalten, die dem Description-Decorator entspricht. |
minLength | param, output, type | Array, Zeichenfolge | int | Die minimale Länge für Zeichenfolgen- und Arrayelemente. Der Stop-Wert ist inklusiv. |
minValue | param, output, type | int | int | Der minimale Wert für die ganzzahligen Elemente. Der Stop-Wert ist inklusiv. |
sealed | param, type, output | Objekt | none | Erhöhen Sie BCP089 von einer Warnung auf einen Fehler, wenn ein Eigenschaftenname eines benutzerdefinierten Datentyps wahrscheinlich einen Tippfehler enthält. Weitere Informationen finden Sie unter Erhöhen der Fehlerebene. |
secure | param, type | String-Objekt | none | Markiert den Parameter als sicher. Der Wert eines sicheren Parameters wird weder im Bereitstellungsverlauf gespeichert noch protokolliert. Weitere Informationen finden Sie unter Sichern von Zeichenfolgen und Objekten. |
Parameter
Verwenden Sie Parameter für Werte, die für verschiedene Bereitstellungen variieren müssen. Sie können einen Standardwert für den Parameter definieren, der verwendet wird, wenn während der Bereitstellung kein Wert angegeben wird.
Beispielsweise können Sie einen SKU-Parameter hinzufügen, um unterschiedliche Größen für eine Ressource anzugeben. Sie können unterschiedliche Werte übergeben, je nachdem, ob Sie die Bereitstellung in einer Test- oder Produktionsumgebungen durchführen.
param storageSKU string = 'Standard_LRS'
Der Parameter kann in Ihrer Bicep-Datei verwendet werden.
sku: {
name: storageSKU
}
Sie können für jeden Parameter ein oder mehrere Decorator-Zeichen hinzufügen. Weitere Informationen finden Sie unter Verwenden von Decorator-Elementen.
Weitere Informationen finden Sie unter Parameter in Bicep.
Variablen
Sie können die Lesbarkeit Ihrer Bicep-Datei verbessern, indem Sie komplexe Ausdrücke in einer Variable kapseln. Beispielsweise können Sie eine Variable für einen Ressourcennamen hinzufügen, der durch Verkettung mehrerer Werte erstellt wird.
var uniqueStorageName = '${storagePrefix}${uniqueString(resourceGroup().id)}'
Wenden Sie diese Variable überall an, wo Sie den komplexen Ausdruck benötigen.
resource stg 'Microsoft.Storage/storageAccounts@2023-04-01' = {
name: uniqueStorageName
Sie können für jede Variable ein oder mehrere Decorator-Elemente hinzufügen. Weitere Informationen finden Sie unter Verwenden von Decorator-Elementen.
Weitere Informationen finden Sie unter Variablen in Bicep.
Typen
Sie können die Anweisung „type
“ verwenden, um benutzerdefinierte Datentypen zu definieren.
param location string = resourceGroup().location
type storageAccountSkuType = 'Standard_LRS' | 'Standard_GRS'
type storageAccountConfigType = {
name: string
sku: storageAccountSkuType
}
param storageAccountConfig storageAccountConfigType = {
name: 'storage${uniqueString(resourceGroup().id)}'
sku: 'Standard_LRS'
}
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-04-01' = {
name: storageAccountConfig.name
location: location
sku: {
name: storageAccountConfig.sku
}
kind: 'StorageV2'
}
Sie können für jeden benutzerdefinierten Datentyp ein oder mehrere Decorator-Elemente hinzufügen. Weitere Informationen finden Sie unter Verwenden von Decorator-Elementen.
Weitere Informationen finden Sie unter Benutzerdefinierte Datentypen.
Functions
In Ihrer Bicep-Datei können Sie ihre eigenen Funktionen erstellen und zusätzlich die standardmäßigen Bicep-Funktionen verwenden, die automatisch in Ihren Bicep-Dateien verfügbar sind. Erstellen Sie eigene Funktionen, wenn Sie über komplizierte Ausdrücke verfügen, die in Ihrer Bicep-Dateien wiederholt verwendet werden.
func buildUrl(https bool, hostname string, path string) string => '${https ? 'https' : 'http'}://${hostname}${empty(path) ? '' : '/${path}'}'
output azureUrl string = buildUrl(true, 'microsoft.com', 'azure')
Weitere Informationen finden Sie unter Benutzerdefinierte Funktionen.
Ressourcen
Verwenden resource
Sie das Schlüsselwort, um eine bereitzustellende Ressource zu definieren. Die Ressourcendeklaration enthält einen symbolischen Namen für die Ressource. Sie verwenden diesen symbolischen Namen in anderen Teilen der Bicep-Datei, um einen Wert aus der Ressource abzurufen.
Die Ressourcendeklaration enthält den Ressourcentyp und die API-Version. Schließen Sie im Text der Ressourcendeklaration Eigenschaften ein, die für den Ressourcentyp spezifisch sind.
resource stg 'Microsoft.Storage/storageAccounts@2023-04-01' = {
name: uniqueStorageName
location: location
sku: {
name: storageSKU
}
kind: 'StorageV2'
properties: {
supportsHttpsTrafficOnly: true
}
}
Sie können für jede Ressource ein oder mehrere Decorator-Elemente hinzufügen. Weitere Informationen finden Sie unter Verwenden von Decorator-Elementen.
Weitere Informationen finden Sie unter Ressourcendeklaration in Bicep.
Einige Ressourcen stehen in einer hierarchischen Beziehung zueinander. Sie können eine untergeordnete Ressource entweder innerhalb oder außerhalb der übergeordneten Ressource definieren.
Das folgende Beispiel zeigt, wie Sie eine untergeordnete Ressource in einer übergeordneten Ressource definieren. Sie enthält ein Speicherkonto mit einer untergeordneten Ressource (Dateidienst), der innerhalb des Speicherkontos definiert ist. Der Dateidienst verfügt ebenfalls über eine untergeordnete Ressource (Freigabe), die im Dienst definiert ist.
resource storage 'Microsoft.Storage/storageAccounts@2023-04-01' = {
name: 'examplestorage'
location: resourceGroup().location
kind: 'StorageV2'
sku: {
name: 'Standard_LRS'
}
resource service 'fileServices' = {
name: 'default'
resource share 'shares' = {
name: 'exampleshare'
}
}
}
Das nächste Beispiel zeigt, wie eine untergeordnete Ressource außerhalb der übergeordneten Ressource definiert wird. Sie verwenden die übergeordnete Eigenschaft, um eine hierarchische Beziehung zu ermitteln. Es werden dieselben drei Ressourcen definiert.
resource storage 'Microsoft.Storage/storageAccounts@2023-04-01' = {
name: 'examplestorage'
location: resourceGroup().location
kind: 'StorageV2'
sku: {
name: 'Standard_LRS'
}
}
resource service 'Microsoft.Storage/storageAccounts/fileServices@2023-04-01' = {
name: 'default'
parent: storage
}
resource share 'Microsoft.Storage/storageAccounts/fileServices/shares@2023-04-01' = {
name: 'exampleshare'
parent: service
}
Weitere Informationen finden Sie unter Festlegen von Name und Typ für untergeordnete Ressourcen in Bicep.
Module
Mit Modulen können Sie Code aus einer Bicep-Datei in anderen Bicep-Dateien wiederverwenden. Sie geben in der Moduldeklaration einen Link zu der Datei an, die Sie wiederverwenden möchten. Wenn Sie die Bicep-Datei bereitstellen, werden auch die Ressourcen im Modul bereitgestellt.
module webModule './webApp.bicep' = {
name: 'webDeploy'
params: {
skuName: 'S1'
location: location
}
}
Mit dem symbolischen Namen können Sie von einer anderen Stelle in der Datei auf das Modul verweisen. Beispielsweise können Sie einen Ausgabewert aus einem Modul mit dem symbolischen Namen und dem Namen des Ausgabewerts erhalten.
Sie können für jedes Modul ein oder mehrere Decorator-Elemente hinzufügen. Weitere Informationen finden Sie unter Verwenden von Decorator-Elementen.
Weitere Informationen finden Sie unter Was ist Bicep (Vorschau)?.
Ausgaben
Verwenden Sie Ausgänge, um Werte aus der Bereitstellung zurückzugeben. In der Regel geben Sie einen Wert aus einer bereitgestellten Ressource zurück, wenn Sie diesen Wert für einen anderen Vorgang wieder verwenden müssen.
output storageEndpoint object = stg.properties.primaryEndpoints
Sie können für jede Ausgabe ein oder mehrere Decorator-Elemente hinzufügen. Weitere Informationen finden Sie unter Verwenden von Decorator-Elementen.
Weitere Informationen finden Sie unter Ausgaben in Bicep.
Schleifen
Sie können Ihrer Bicep-Datei iterative Schleifen hinzufügen, um mehrere Kopien von folgenden Elementen zu definieren:
- resource
- module
- -Variable
- property
- output
Verwenden Sie den for
-Ausdruck, um eine Schleife zu definieren.
param moduleCount int = 2
module stgModule './example.bicep' = [for i in range(0, moduleCount): {
name: '${i}deployModule'
params: {
}
}]
Sie können ein Array, ein Objekt oder einen ganzzahligen Index durchlaufen.
Weitere Informationen finden Sie unter Iterative Schleifen in Bicep.
Bedingte Bereitstellung
Sie können Ihrer Bicep-Datei eine Ressource oder ein Modul hinzufügen, die bzw. das bedingt bereitgestellt wird. Während der Bereitstellung wird die Bedingung ausgewertet. Das Ergebnis bestimmt dann, ob die Ressource oder das Modul bereitgestellt wird. Verwenden Sie den if
-Ausdruck, um eine bedingte Bereitstellung zu definieren.
param deployZone bool
resource dnsZone 'Microsoft.Network/dnsZones@2023-07-01-preview' = if (deployZone) {
name: 'myZone'
location: 'global'
}
Für weitere Informationen siehe Bedingter Einsatz in Bicep.
Leerraum
Leerzeichen und Tabstoppzeichen werden beim Erstellen von Bicep-Dateien ignoriert.
Bicep reagiert empfindlich auf Zeilenvorschübe. Zum Beispiel:
resource sa 'Microsoft.Storage/storageAccounts@2023-04-01' = if (newOrExisting == 'new') {
...
}
Kann nicht wie folgt geschrieben werden:
resource sa 'Microsoft.Storage/storageAccounts@2023-04-01' =
if (newOrExisting == 'new') {
...
}
Definieren Sie Objekte und Arrays auf mehreren Zeilen.
Kommentare
Wird //
für einzeilige Kommentare oder /* ... */
für mehrzeilenbasierte Kommentare verwendet.
Das folgende Beispiel zeigt einen einzeiligen Kommentar.
// This is your primary NIC.
resource nic1 'Microsoft.Network/networkInterfaces@2023-11-01' = {
...
}
Das folgende Beispiel zeigt einen mehrzeiligen Kommentar.
/*
This Bicep file assumes the key vault already exists and
is in same subscription and resource group as the deployment.
*/
param existingKeyVaultName string
Mehrzeilige Zeichenfolgen
Sie können eine Zeichenfolge in mehrere Zeilen unterteilen. Verwenden Sie drei einfache Anführungszeichen '''
, um die mehrzeilige Zeichenfolge zu starten und zu beenden.
Zeichen innerhalb der mehrzeiligen Zeichenfolge werden unverändert behandelt. Escapezeichen sind nicht erforderlich. Sie können nicht '''
in die mehrzeilige Zeichenfolge einschließen. Zeichen folgen Interpolationen werden zurzeit nicht unterstützt.
Sie können entweder die Zeichenfolge direkt nach dem Öffnen '''
oder eine neue Zeile einschließen. In beiden Fällen enthält die resultierende Zeichenfolge keine neue Zeile. Abhängig von den Zeilenenden in der BICEP-Datei werden neue Zeilen als \r\n
oder \n
interpretiert.
Das folgende Beispiel zeigt eine mehrzeilige Zeichenkette.
var stringVar = '''
this is multi-line
string with formatting
preserved.
'''
Das vorangegangene Beispiel entspricht dem folgenden JSON.
"variables": {
"stringVar": "this is multi-line\r\n string with formatting\r\n preserved.\r\n"
}
Mehrzeilige Deklarationen
Sie können jetzt mehrere Zeilen in Funktions-, Array- und Objektdeklarationen verwenden. Diese Funktion erfordert Bicep CLI Version 0.7.X oder höher.
Im folgenden Beispiel ist die resourceGroup()
-Definition in mehrere Zeilen unterteilt.
var foo = resourceGroup(
mySubscription,
myRgName)
Beispiele für mehrzeilige Deklarationen finden Sie unter Arrays und unter Objekte.
Bekannte Einschränkungen
- Keine Unterstützung für das „apiProfile“-Konzept, das für die Zuordnung eines einzelnen „apiProfile“ zu einer festgelegten „apiVersion“ für jeden Ressourcentyp verwendet wird.
- Benutzerdefinierte Funktionen werden zurzeit nicht unterstützt. Ein experimentelles Feature ist derzeit jedoch verfügbar. Weitere Informationen finden Sie unter Benutzerdefinierte Funktionen in Bicep.
- Einige Bicep-Features erfordern eine entsprechende Änderung an der Zwischensprache (JSON-Vorlagen von Azure Resource Manager). Wir kündigen die Verfügbarkeit dieser Features an, wenn alle erforderlichen Updates für die globale Azure-Plattform bereitgestellt wurden. Wenn Sie eine andere Umgebung wie Azure Stack verwenden, kann es zu einer Verzögerung bei der Verfügbarkeit des Features kommen. Das Bicep-Feature ist nur verfügbar, wenn die Zwischensprache in dieser Umgebung ebenfalls aktualisiert wurde.
Nächste Schritte
Eine Einführung in BICEP finden Sie unter Was ist BICEP?. Informationen zu Bicep-Datentypen finden Sie unter Datentypen.