مقارنة 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 أية قيم.
إعادة استخدام الرمز
لفصل الحل إلى ملفات متعددة:
- بالنسبة للـBicep، استخدم نماذج.
- بالنسبة لقوالب إدارة موارد Azure، استخدم قوالب مرتبطة.
الخطوات التالية
- للحصول على معلومات حول Bicep، راجع تشغيل Bicep سريع.
- لمعرفة المزيد حول تحويل القوالب بين اللغات، راجع تحويل قوالب إدارة موارد Azure بين JSON وBicep.