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.
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@2024-03-01' = {
...
}
"resources": [
{
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2024-03-01",
...
}
]
Een resource voorwaardelijk implementeren:
resource virtualMachine 'Microsoft.Compute/virtualMachines@2024-03-01' = if(deployVM) {
...
}
"resources": [
{
"condition": "[parameters('deployVM')]",
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2024-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@2023-11-01' = {
...
}
resource nic1 'Microsoft.Network/networkInterfaces@2023-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@2023-04-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:
- Gebruik modules voor Bicep.
- Gebruik gekoppelde sjablonen voor ARM-sjablonen.
Volgende stappen
- Zie Bicep-quickstart voor meer informatie over De Bicep.
- Zie ARM-sjablonen converteren tussen JSON en Bicep voor meer informatie over het converteren van sjablonen tussen de talen.