Bagikan melalui


Membandingkan JSON dan Bicep untuk templat

Artikel ini membandingkan sintaks Bicep dengan sintaks JSON untuk templat Azure Resource Manager (templat ARM). Dalam kebanyakan kasus, Bicep memberikan sintaks yang lebih sedikit verbose daripada yang setara di JSON.

Jika Anda terbiasa menggunakan JSON untuk mengembangkan templat ARM, gunakan contoh berikut untuk mempelajari sintaks yang setara untuk Bicep.

Membandingkan file lengkap

Dengan Bicep Playground, Anda dapat menampilkan Bicep dan JSON yang setara secara berdampingan. Anda dapat membandingkan implementasi dari infrastruktur yang sama.

Misalnya, Anda dapat menampilkan file untuk menyebarkan server SQL dan database. Bicep sekitar separuh ukuran template ARM.

Cuplikan layar templat berdampingan

Expressions

Untuk menulis ekspresi:

func()
"[func()]"

Parameter

Untuk mendeklarasikan parameter dengan nilai default:

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

Untuk mendapatkan nilai parameter, gunakan nama yang Anda tentukan:

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

Variabel

Untuk mendeklarasikan variabel:

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

Untuk mendapatkan nilai variabel, gunakan nama yang Anda tentukan:

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

String

Untuk menggabungkan string:

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

Operator logika

Untuk mengembalikan logika AND:

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

Untuk menetapkan nilai secara kondisional:

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

Lingkup penyebaran

Untuk mengatur lingkup target penyebaran:

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

Sumber

Untuk mendeklarasikan sumber daya:

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

Untuk menyebarkan sumber daya secara kondisional:

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

Untuk menetapkan properti sumber daya:

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

Untuk mendapatkan ID sumber daya dari sumber daya di templat:

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

Loop

Untuk melakukan iterasi atas item dalam array atau hitungan:

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

Dependensi sumber daya

Untuk Bicep, Anda dapat mengatur dependensi eksplisit, tetapi pendekatan ini tidak disarankan. Sebagai gantinya, mengandalkan dependensi implisit. Dependensi implisit dibuat ketika satu deklarasi sumber daya mereferensikan pengidentifikasi sumber daya lain.

Berikut ini menunjukkan antarmuka jaringan dengan dependensi implisit pada kelompok keamanan jaringan. Ini mereferensikan kelompok keamanan jaringan dengan 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
    }
  }
}

Jika Anda harus menetapkan dependensi eksplisit, gunakan:

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

Sumber daya referensi

Untuk mendapatkan properti dari sumber daya di templat:

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

Untuk mendapatkan properti dari sumber daya yang sudah ada yang tidak digunakan dalam templat:

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

Dalam Bicep, gunakan pengakses bersarang (::) untuk mendapatkan properti pada sumber daya yang bersarang dalam sumber daya induk:

VNet1::Subnet1.properties.addressPrefix

Untuk JSON, gunakan fungsi referensi:

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

Output

Untuk mendapatkan properti dari sumber daya di templat:

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

Untuk mengeluarkan nilai secara bersyarat:

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

Operator terner Bicep setara dengan fungsi if dalam JSON yang merupakan templat ARM, bukan properti kondisi. Sintaks terner harus mengevaluasi ke satu nilai atau yang lain. Jika kondisinya salah dalam sampel sebelumnya, Bicep mengeluarkan nama host dengan string kosong, tetapi JSON tidak mengeluarkan nilai.

Penggunaan kembali kode

Untuk memisahkan solusi menjadi beberapa file:

Langkah berikutnya