Jämföra JSON och Bicep för mallar

Den här artikeln jämför Bicep-syntax med JSON-syntax för Azure Resource Manager-mallar (ARM-mallar). I de flesta fall tillhandahåller Bicep syntax som är mindre utförlig än motsvarigheten i JSON.

Om du är bekant med att använda JSON för att utveckla ARM-mallar kan du använda följande exempel för att lära dig mer om motsvarande syntax för Bicep.

Jämför fullständiga filer

Med Bicep Playground kan du visa Bicep och motsvarande JSON sida vid sida. Du kan jämföra implementeringarna av samma infrastruktur.

Du kan till exempel visa filen för att distribuera en SQL-server och databas. Bicep är ungefär hälften så stor som ARM-mallen.

Skärmbild av sida vid sida-mallar

Uttryck

Så här skapar du ett uttryck:

func()
"[func()]"

Parametrar

Så här deklarerar du en parameter med ett standardvärde:

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

Om du vill hämta ett parametervärde använder du det namn som du definierade:

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

Variabler

Så här deklarerar du en variabel:

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

Om du vill hämta ett variabelvärde använder du det namn som du definierade:

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

Strängar

Så här sammanfogar du strängar:

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

Logiska operatorer

Så här returnerar du det logiska AND:

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

Så här ställer du in ett värde villkorligt:

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

Distributionsomfång

Så här anger du distributionens målomfång:

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

Resurser

Så här deklarerar du en resurs:

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

Så här distribuerar du en resurs villkorligt:

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

Så här anger du en resursegenskap:

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

Så här hämtar du resurs-ID för en resurs i mallen:

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

Loopar

Så här itererar du över objekt i en matris eller antal:

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

Resursberoenden

För Bicep kan du ange ett explicit beroende, men den här metoden rekommenderas inte. Förlita dig i stället på implicita beroenden. Ett implicit beroende skapas när en resursdeklaration refererar till identifieraren för en annan resurs.

Följande visar ett nätverksgränssnitt med ett implicit beroende av en nätverkssäkerhetsgrupp. Den refererar till nätverkssäkerhetsgruppen med 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
    }
  }
}

Om du måste ange ett uttryckligt beroende använder du:

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

Referensresurser

Så här hämtar du en egenskap från en resurs i mallen:

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

Så här hämtar du en egenskap från en befintlig resurs som inte har distribuerats i mallen:

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

I Bicep använder du den kapslade accessorn (::) för att hämta en egenskap på en resurs som är kapslad i en överordnad resurs:

VNet1::Subnet1.properties.addressPrefix

För JSON använder du referensfunktionen:

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

Utdata

Så här matar du ut en egenskap från en resurs i mallen:

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

Så här matar du ut ett värde villkorsstyrt:

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

Operatorn Bicep ternary motsvarar if-funktionen i en ARM-mall-JSON, inte villkorsegenskapen. Syntaxen för ternary måste utvärderas till det ena eller det andra värdet. Om villkoret är falskt i föregående exempel matar Bicep ut ett värdnamn med en tom sträng, men JSON matar ut inga värden.

Återanvändning av kod

Så här separerar du en lösning i flera filer:

Nästa steg