Ş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.
İ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@2024-03-01' = {
...
}
"resources": [
{
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2024-03-01",
...
}
]
Bir kaynağı koşullu olarak dağıtmak için:
resource virtualMachine 'Microsoft.Compute/virtualMachines@2024-03-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 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.id
ağ güvenlik grubuna başvurur.
resource netSecurityGroup 'Microsoft.Network/networkSecurityGroups@2023-11-01' = {
...
}
resource nic1 'Microsoft.Network/networkInterfaces@2023-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@2023-04-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:
- Bicep için modülleri kullanın.
- ARM şablonları için bağlantılı şablonları kullanın.
Sonraki adımlar
- Bicep hakkında bilgi için bkz. Bicep hızlı başlangıcı.
- Şablonları diller arasında dönüştürme hakkında bilgi edinmek için bkz. ARM şablonlarını JSON ve Bicep arasında dönüştürme.