JSON en Bicep voor sjablonen vergelijken

In dit artikel wordt de Bicep-syntaxis vergeleken met de JSON-syntaxis voor Azure Resource Manager-sjablonen (ARM-sjablonen). In de meeste gevallen biedt Bicep een syntaxis die minder uitgebreid is dan het equivalent in JSON.

Als u bekend bent met het gebruik van JSON om ARM-sjablonen te ontwikkelen, gebruikt u de volgende voorbeelden voor meer informatie over de equivalente syntaxis voor Bicep.

Volledige bestanden vergelijken

Met Bicep Playground kunt u Bicep en gelijkwaardige JSON naast elkaar weergeven. U kunt de implementaties van dezelfde infrastructuur vergelijken.

U kunt bijvoorbeeld het bestand weergeven om een SQL-server en -database te implementeren. De Bicep is ongeveer de helft van de grootte van de ARM-sjabloon.

Schermafbeelding van sjablonen naast elkaar

Expressies

Een expressie maken:

func()
"[func()]"

Parameters

Een parameter met een standaardwaarde declareren:

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

Als u een parameterwaarde wilt ophalen, gebruikt u de naam die u hebt gedefinieerd:

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

Variabelen

Een variabele declareren:

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

Als u een variabelewaarde wilt ophalen, gebruikt u de naam die u hebt gedefinieerd:

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

Tekenreeksen

Tekenreeksen samenvoegen:

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

Logische operators

De logische AND retourneren:

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

Een waarde voorwaardelijk instellen:

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

Implementatiebereik

Het doelbereik van de implementatie instellen:

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

Resources

Een resource declareren:

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

Een resource voorwaardelijk implementeren:

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

Een resource-eigenschap instellen:

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

De resource-id van een resource in de sjabloon ophalen:

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

Lussen

Items in een matrix of telling herhalen:

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

Bronafhankelijkheden

Voor Bicep kunt u een expliciete afhankelijkheid instellen, maar deze benadering wordt niet aanbevolen. Vertrouw in plaats daarvan op impliciete afhankelijkheden. Er wordt een impliciete afhankelijkheid gemaakt wanneer een resourcedeclaratie verwijst naar de id van een andere resource.

Hieronder ziet u een netwerkinterface met een impliciete afhankelijkheid van een netwerkbeveiligingsgroep. Het verwijst naar de netwerkbeveiligingsgroep met netSecurityGroup.id.

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

Als u een expliciete afhankelijkheid moet instellen, gebruikt u:

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

Referentieresources

Een eigenschap ophalen uit een resource in de sjabloon:

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

Een eigenschap ophalen uit een bestaande resource die niet is geïmplementeerd in de sjabloon:

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

Gebruik in Bicep de geneste accessor (::) om een eigenschap op te halen voor een resource die is genest in een bovenliggende resource:

VNet1::Subnet1.properties.addressPrefix

Gebruik voor JSON de referentiefunctie:

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

Uitvoerwaarden

Een eigenschap uitvoeren vanuit een resource in de sjabloon:

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

Een waarde voorwaardelijk uitvoeren:

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

De bicep-ternaire operator is het equivalent van de functie if in een JSON van een ARM-sjabloon, niet de voorwaardeeigenschap. De ternaire syntaxis moet de ene of de andere waarde evalueren. Als de voorwaarde onwaar is in de voorgaande voorbeelden, voert Bicep een hostnaam uit met een lege tekenreeks, maar JSON voert geen waarden uit.

Code opnieuw gebruiken

Een oplossing in meerdere bestanden opsplitsen:

Volgende stappen