Aracılığıyla paylaş


Ş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'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 dosyayı görüntüleyebilirsiniz. Bicep, ARM şablonunun yaklaşık yarısı kadardı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')]"

Dize

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'))]

Bir değeri koşullu olarak 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

Kaynak bildirmek için:

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

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

resource virtualMachine 'Microsoft.Compute/virtualMachines@2025-04-01' = if(deployVM) {
  ...
}
"resources": [
  {
    "condition": "[parameters('deployVM')]",
    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2024-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 öğeleri veya bir sayı ü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. Herhangi bir kaynak bildirimi başka bir kaynağın tanımlayıcısına referans verdiğinde ö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. netSecurityGroup.id ile ağ güvenlik grubuna atıfta bulunur.

resource netSecurityGroup 'Microsoft.Network/networkSecurityGroups@2025-01-01' = {
  ...
}

resource nic1 'Microsoft.Network/networkInterfaces@2025-01-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ı

Şablonda bir kaynağın içinden ö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@2025-06-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, bir üst kaynağın içinde iç içe yerleştirilmiş bir kaynağa özellik almak için iç içe erişimcisini (::) kullanın:

VNet1::Subnet1.properties.addressPrefix

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

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

Çıktılar

Kaynakta bir özelliği şablondan çıkarmak 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'daki if işlevine eşdeğerdir. Üçlü operatör sözdiziminin bir değere ya da diğerine değerlendirilmesi gerekir. Önceki örneklerde koşul yanlışsa, Bicep boş bir dizeyle ana bilgisayar adı üretir, ancak JSON hiçbir değer üretmez.

Kodu yeniden kullanma

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

Sonraki Adımlar