مقارنة JSON وBicep للقوالب

تقارن هذه المقالة بناء جملة Bicep مع بناء جملة JSON لقوالب إدارة موارد Azure (قوالب ARM). في معظم الحالات، يوفر Bicep بناء جملة أقل طولًا من المكافئ في JSON.

إذا كنت معتادًا على استخدام JSON لتطوير قوالب إدارة موارد Azure (ARM)، فاستخدم الأمثلة التالية للتعرف على بناء جملة مكافئة لـBicep.

مقارنة الملفات الكاملة

يتيح لك ملعب Bicep عرض Bicep وما يعادله من JSON جنبًا إلى جنب. يمكنك مقارنة تطبيقات البنية الأساسية نفسها.

على سبيل المثال، يمكنك عرض الملف لتوزيع قاعدة بيانات وخادم SQL. يبلغ حجم Bicep حوالي نصف حجم قالب ARM.

لقطة شاشة للقوالب جنبا إلى جنب

Expressions

لتأليف تعبير:

func()
"[func()]"

المعلمات

لتعريف معلمة بقيمة افتراضية:

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

للحصول على قيمة معلمة، استخدم الاسم الذي حددته:

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

المتغيرات

لتعريف متغير:

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

للحصول على قيمة متغيرة، استخدم الاسم الذي حددته:

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

السلاسل

لتسلسل السلاسل:

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

العوامل المنطقية

لإرجاع المنطقي AND:

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

لتعيين قيمة بشكل مشروط:

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

نطاق النشر

لتعيين النطاق المستهدف للنشر:

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

الموارد

لتعريف مورد:

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

لنشر مورد بشكل مشروط:

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

لتعيين خاصية مورد:

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

للحصول على معرف المورد لمورد في القالب:

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

الحلقات

للتكرار على العناصر في مصفوفة أو العد:

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

تبعيات الموارد

بالنسبة لـBicep، يمكنك تعيين تبعية صريحة ولكن لا يوصى بهذا النهج. بدلا من ذلك، اعتمد على التبعيات الضمنية. يتم إنشاء تبعية ضمنية عندما يشير إعلان مورد إلى معرف مورد آخر.

يظهر ما يلي واجهة شبكة إتصال مع تبعية ضمنية على مجموعة أمان شبكة إتصال. يشير إلى مجموعة أمان الشبكة مع 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
    }
  }
}

إذا كان يجب عليك تعيين تبعية صريحة، استخدم:

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

موارد مرجعية

للحصول على خاصية من مورد في القالب:

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

للحصول على خاصية من مورد موجود لم يتم توزيعه في القالب:

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، استخدم الملحق المتداخل (::) للحصول على خاصية على مورد متداخل داخل مورد أصل:

VNet1::Subnet1.properties.addressPrefix

بالنسبة إلى JSON، استخدم الدالة المرجعية:

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

المخرجات

لإخراج خاصية من مورد في القالب:

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

لإخراج قيمة بشكل مشروط:

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 هو المكافئ للدالة if في قالب ARM JSON، وليس خاصية الشرط. يجب أن يتم تقييم بناء الجملة الثلاثية بقيمة واحدة أو أخرى. إذا كان الشرط false في العينات السابقة، يخرج Bicep اسم مضيف مع سلسلة فارغة ولكن لا يخرج JSON أية قيم.

إعادة استخدام الرمز

لفصل الحل إلى ملفات متعددة:

الخطوات التالية