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 menyediakan sintaksis yang kurang verbose daripada yang setara dalam JSON.

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

Membandingkan file lengkap

Bicep Playground memungkinkan Anda melihat Bicep dan JSON yang setara secara berdampingan. Anda dapat membandingkan implementasi infrastruktur yang sama.

Misalnya, Anda dapat melihat file untuk menyebarkan server dan database SQL. Bicep ini sekitar setengah ukuran templat ARM.

Cuplikan layar templat berdampingan

Ekspresi

Untuk menulis ekspresi:

func()
"[func()]"

Parameter-parameternya

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 logis

Untuk mengembalikan LOGIKA DAN:

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

Untuk menetapkan nilai secara kondisional:

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

Cakupan penyebaran

Untuk mengatur cakupan target penyebaran:

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

Sumber Daya

Untuk mendeklarasikan sumber daya:

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

Untuk menyebarkan sumber daya secara kondisional:

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

Untuk mengatur properti sumber daya:

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

Untuk mendapatkan ID sumber daya dalam templat:

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

Perulangan

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. Sebaliknya, andalkan 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@2024-05-01' = {
  ...
}

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

Jika Anda harus mengatur dependensi eksplisit, gunakan:

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

Sumber daya referensi

Untuk mendapatkan properti dari sumber daya dalam 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 diimplementasikan di dalam templat tersebut.

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

Di Bicep, gunakan aksesor tertanam (::) untuk mendapatkan properti pada sumber daya yang tertanam 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 menghasilkan properti dari sumber daya dalam templat:

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

Untuk menghasilkan nilai secara kondisional:

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 ternary-Bicep setara dengan fungsi if dalam templat ARM JSON, bukan properti kondisinya. Sintaks terner harus mengevaluasi menjadi satu nilai atau nilai lainnya. Jika kondisi salah dalam sampel sebelumnya, Bicep menghasilkan nama host dengan string kosong, tetapi JSON tidak menghasilkan nilai.

Penggunaan kembali kode

Untuk memisahkan solusi ke dalam beberapa file:

Langkah selanjutnya