Şablonlar için JSON ve Bicep karşılaştırması

Bu makalede, Bicep söz dizimi ile Azure Resource Manager şablonları (ARM şablonları) için JSON söz dizimi karşılaştırır. Çoğu durumda Bicep, JSON'daki eşdeğerden daha az ayrıntılı söz dizimi sağlar.

ARM şablonları geliştirmek için JSON kullanmayı biliyorsanız, Bicep için eşdeğer söz dizimi hakkında bilgi edinmek için aşağıdaki örnekleri kullanın.

Tüm dosyaları karşılaştırma

Bicep Playground, Bicep'i ve eşdeğer JSON'ı yan yana görüntülemenizi sağlar. Aynı altyapının uygulamalarını karşılaştırabilirsiniz.

Örneğin, sql sunucusu ve veritabanı dağıtmak için dosyasını görüntüleyebilirsiniz. Bicep, ARM şablonunun yaklaşık yarısı boyutundadır.

Yan yana şablonların ekran görüntüsü

İfadeler

İfade yazmak için:

func()
"[func()]"

Parametreler

Varsayılan değere sahip bir parametre bildirmek için:

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

Parametre değeri almak için tanımladığınız adı kullanın:

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

Değişkenler

Değişken bildirmek için:

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

Değişken değeri almak için tanımladığınız adı kullanın:

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

Dizeler

Dizeleri birleştirmek için:

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

Mantıksal işleçler

Mantıksal AND değerini döndürmek için:

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

Koşullu olarak değer ayarlamak için:

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

Dağıtım kapsamı

Dağıtımın hedef kapsamını ayarlamak için:

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

Kaynaklar

Bir kaynağı bildirmek için:

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

Bir kaynağı koşullu olarak dağıtmak için:

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

Kaynak özelliğini ayarlamak için:

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

Şablondaki bir kaynağın kaynak kimliğini almak için:

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

Döngüler

Dizideki veya sayıdaki öğeler üzerinde yineleme yapmak için:

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

Kaynak bağımlılıkları

Bicep için açık bir bağımlılık ayarlayabilirsiniz ancak bu yaklaşım önerilmez. Bunun yerine örtük bağımlılıklara güvenin. Bir kaynak bildirimi başka bir kaynağın tanımlayıcısını başvurduğunda örtük bir bağımlılık oluşturulur.

Aşağıda, bir ağ güvenlik grubuna örtük bağımlılığı olan bir ağ arabirimi gösterilmektedir. ile netSecurityGroup.idağ güvenlik grubuna başvurur.

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

Açık bir bağımlılık ayarlamanız gerekiyorsa şunu kullanın:

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

Başvuru kaynakları

Şablondaki bir kaynaktan özellik almak için:

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

Şablonda dağıtılmayan mevcut bir kaynaktan özellik almak için:

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

Bicep'te iç içe erişimciyi (::) kullanarak bir üst kaynak içinde iç içe yerleştirilmiş bir kaynağa özellik alın:

VNet1::Subnet1.properties.addressPrefix

JSON için başvuru işlevini kullanın:

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

Çıkışlar

Şablondaki bir kaynaktan özellik çıktısı almak için:

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

Koşullu olarak bir değer çıkarmak için:

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 üçüncül işleci, koşul özelliğine değil ARM şablonu JSON'unda if işlevine eşdeğerdir. Üçüncül söz diziminin bir değer veya başka bir değer olarak değerlendirmesi gerekir. Yukarıdaki örneklerde koşul false ise, Bicep boş bir dize ile bir konak adı verir, ancak JSON hiçbir değer çıkışı sağlamaz.

Kodu yeniden kullanma

Bir çözümü birden çok dosyaya ayırmak için:

Sonraki adımlar