Vergleichen von JSON- und Bicep für Vorlagen

In diesem Artikel wird die Bicep-Syntax mit der JSON-Syntax für Azure Resource Manager-Vorlagen (ARM-Vorlagen) verglichen. In den meisten Fällen bietet Bicep eine Syntax, die weniger ausführlich ist als die entsprechende in JSON.

Wenn Sie mit JSON zum Entwickeln von ARM-Vorlagen vertraut sind, erfahren Sie in der folgenden Tabelle mehr über die entsprechende Syntax für Bicep.

Vergleichen von vollständigen Dateien

Mit dem Bicep Playground können Sie Bicep und die JSON-Entsprechung nebeneinander anzeigen. Sie können die Implementierungen derselben Infrastruktur vergleichen.

Sie können z. B. die Datei zur Bereitstellung eines SQL-Servers und einer Datenbank anzeigen. Das Bicep-Format ist ungefähr halb so groß wie die ARM-Vorlage.

Screenshot: Vorlagen nebeneinander

Ausdrücke

So erstellen Sie einen Ausdruck

func()
"[func()]"

Parameter

So deklarieren Sie einen Parameter mit einem Standardwert

param orgName string = 'Contoso'
"parameters": {
  "orgName": {
    "type": "string",
    "defaultValue": "Contoso"
  }
}

Um einen Parameterwert abzurufen, verwenden Sie den von Ihnen definierten Namen:

name: orgName
"name": "[parameters('orgName'))]"

Variablen

So deklarieren Sie eine Variable

var description = 'example value'
"variables": {
  "description": "example value"
},

Um einen Variablenwert abzurufen, verwenden Sie den von Ihnen definierten Namen:

workloadSetting: description
"workloadSetting": "[variables('description'))]"

Zeichenfolgen

So verketten Sie Zeichenfolgen

name: '${namePrefix}-vm'
"name": "[concat(parameters('namePrefix'), '-vm')]"

Logische Operatoren

So geben Sie logisches UNDzurück

isMonday && isNovember
[and(parameter('isMonday'), parameter('isNovember'))]

So legen Sie einen Wert bedingt fest

isMonday ? 'valueIfTrue' : 'valueIfFalse'
[if(parameters('isMonday'), 'valueIfTrue', 'valueIfFalse')]

Bereitstellungsumfang

So legen Sie den Zielbereich der Bereitstellung fest

targetScope = 'subscription'
"$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#"

Ressourcen

So deklarieren Sie eine Ressource

resource virtualMachine 'Microsoft.Compute/virtualMachines@2023-03-01' = {
  ...
}
"resources": [
  {
    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2020-06-01",
    ...
  }
]

So stellen Sie bedingt eine Ressource bereit

resource virtualMachine 'Microsoft.Compute/virtualMachines@2023-03-01' = if(deployVM) {
  ...
}
"resources": [
  {
    "condition": "[parameters('deployVM')]",
    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2023-03-01",
    ...
  }
]

So legen Sie eine Ressourceneigenschaft fest

sku: '2016-Datacenter'
"sku": "2016-Datacenter",

So rufen Sie die ID einer Ressource in der Vorlage ab

nic1.id
[resourceId('Microsoft.Network/networkInterfaces', variables('nic1Name'))]

Schleifen

So durchlaufen Sie Elemente in einem Array oder einer Anzahl

[for storageName in storageAccountNames: {
  ...
}]
"copy": {
  "name": "storagecopy",
  "count": "[length(parameters('storageAccountNames'))]"
},
...

Ressourcenabhängigkeiten

Für Bicep können Sie eine explizite Abhängigkeit festlegen, dieser Ansatz wird jedoch nicht empfohlen. Verwenden Sie stattdessen implizite Abhängigkeiten. Eine implizite Abhängigkeit wird erstellt, wenn eine Ressourcendeklaration auf den Bezeichner einer anderen Ressource verweist.

Im Folgenden wird eine Netzwerkschnittstelle mit einer impliziten Abhängigkeit von einer Netzwerksicherheitsgruppe veranschaulicht. Auf die Netzwerksicherheitsgruppe wird mit netSecurityGroup.id verwiesen.

resource netSecurityGroup 'Microsoft.Network/networkSecurityGroups@2022-11-01' = {
  ...
}

resource nic1 'Microsoft.Network/networkInterfaces@2022-11-01' = {
  name: nic1Name
  location: location
  properties: {
    ...
    networkSecurityGroup: {
      id: netSecurityGroup.id
    }
  }
}

Wenn Sie eine explizite Abhängigkeit festlegen müssen, verwenden Sie Folgendes:

dependsOn: [ storageAccount ]
"dependsOn": ["[resourceId('Microsoft.Storage/storageAccounts', 'parameters('storageAccountName'))]"]

Referenzressourcen

So rufen Sie eine Eigenschaft aus einer Ressource in der Vorlage ab

storageAccount.properties.primaryEndpoints.blob
[reference(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))).primaryEndpoints.blob]

So rufen Sie eine Eigenschaft einer vorhandenen Ressource ab, die nicht in der Vorlage bereitgestellt ist

resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' existing = {
  name: storageAccountName
}

// use later in template as often as needed
storageAccount.properties.primaryEndpoints.blob
// required every time the property is needed
"[reference(resourceId('Microsoft.Storage/storageAccounts/', parameters('storageAccountName')), '2019-06-01').primaryEndpoints.blob]"

Verwenden Sie in Bicep den geschachtelten Accessor (::), um eine Eigenschaft für eine in einer übergeordneten Ressource geschachtelte Ressource zu erhalten:

VNet1::Subnet1.properties.addressPrefix

Verwenden Sie für JSON die Referenzfunktion:

[reference(resourceId('Microsoft.Network/virtualNetworks/subnets', variables('subnetName'))).properties.addressPrefix]

Ausgaben

So geben Sie eine Eigenschaft aus einer Ressource in der Vorlage aus

output hostname string = publicIP.properties.dnsSettings.fqdn
"outputs": {
  "hostname": {
    "type": "string",
    "value": "[reference(resourceId('Microsoft.Network/publicIPAddresses', variables('publicIPAddressName'))).dnsSettings.fqdn]"
  },
}

So geben Sie einen Wert bedingt aus

output hostname string = condition ? publicIP.properties.dnsSettings.fqdn : ''
"outputs": {
  "hostname": {
    "condition": "[variables('condition')]",
    "type": "string",
    "value": "[reference(resourceId('Microsoft.Network/publicIPAddresses', variables('publicIPAddressName'))).dnsSettings.fqdn]"
  }
}

Der ternäre Bicep-Operator entspricht der if-Funktion im JSON-Code einer ARM-Vorlage, nicht der Eigenschaft „condition“. Die ternäre Syntax muss zu dem einen oder anderen Wert ausgewertet werden. Wenn die Bedingung in den vorherigen Beispielen falsch ist, gibt Bicep einen Hostnamen mit einer leeren Zeichenfolge aus, aber JSON gibt keine Werte aus.

Wiederverwendung von Code

So teilen Sie eine Lösung in mehrere Dateien auf

Nächste Schritte