Dela via


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

I den här artikeln jämförs 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 använder du 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()]"

Parameterar

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:et:

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@2024-03-01' = {
  ...
}
"resources": [
  {
    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2024-03-01",
    ...
  }
]

Så här distribuerar du en resurs villkorligt:

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

Så här anger du en resursegenskap:

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

Så här hämtar du resurs-ID:t 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@2024-05-01' = {
  ...
}

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

Om du måste ange ett explicit 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@2024-01-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 inbäddade accessorn (::) för att hämta en egenskap på en resurs inbäddad 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 villkorligt:

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

Bicep-ternary-operatorn motsvarar if-funktionen i en ARM-mall-JSON, inte villkorsegenskapen. Ternäruttrycket 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