دوال قالب ARM في نطاقات التوزيع
باستخدام قوالب Azure Resource Manager (قوالب ARM)، يمكنك التوزيع إلى مجموعات الموارد أو الاشتراكات أو مجموعات الإدارة أو المستأجرين. بشكل عام، تعمل دوال قوالب ARM بنفس الطريقة لكافة النطاقات. توضح هذه المقالة الاختلافات الموجودة لبعض الدوال حسب النطاق.
دوال مدعومة
عند التوزيع إلى نطاقات مختلفة، هناك بعض الاعتبارات الهامة:
يتم اعتماد الدالة (resourceGroup) عمليات توزيع مجموعة الموارد.
يتم اعتماد الدالة(subscription) لمجموعة الموارد وتوزيع الاشتراك.
استخدم (resourceId) للحصول على معرف مورد توزيع في مجموعة الموارد.
"subnet": { "id": "[resourceId(parameters('virtualNetworkResourceGroup'), 'Microsoft.Network/virtualNetworks/subnets', parameters('virtualNetworkName'), parameters('subnet1Name'))]" }
استخدم وظيفة (subscriptionResourceId) للحصول على معرف مورد توزيع في الاشتراك.
على سبيل المثال، للحصول على معرف المورد لتعريف النهج الذي يتم توزيعه إلى اشتراك، استخدم:
"roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]"
استخدم الدالة (extensionResourceId) للموارد التي يتم تنفيذها كملحقات لمجموعة الإدارة. تعريفات النهج المخصصة التي يتم توزيعها إلى مجموعة الإدارة هي ملحقات لمجموعة الإدارة.
للحصول على معرف المورد لتعريف نهج مخصص على مستوى مجموعة الإدارة، قم باستخدام:
"policyDefinitionId": "[extensionResourceId(variables('mgScope'), 'Microsoft.Authorization/policyDefinitions', parameters('policyDefinitionID'))]"
استخدم الدالة (subscriptionResourceId) للحصول على معرف مورد توزيع في الاشتراك. تعريفات النهج المضمنة هي موارد على مستوى بُعد المستأجر. عند تعيين نهج مضمنة على مستوى مجموعة الإدارة، استخدم الدالة tenantResourceId.
للحصول على معرف المورد لتعريف نهج مضمن، قم باستخدام:
"policyDefinitionId": "[tenantResourceId('Microsoft.Authorization/policyDefinitions', parameters('policyDefinitionID'))]"
دقة الدالة خلال النطاقات
عند التوزيع إلى أكثر من نطاق، تعمل الدالات (resourceGroup) و (subscription) على حل بشكل مختلف استنادًا إلى كيفية تحديد القالب. عند الارتباط بالقالب الخارجي، يتم حل الوظائف دائمًا بنطاق هذا القالب. عندما تقوم بدمج قالب داخل قالب أصلي، استخدم الخاصية expressionEvaluationOptions
لتحديد ما إذا كانت الوظائف تتناسب مع مجموعة الموارد والاشتراك في القالب الأصلي أو القالب المتداخل. قم بتعيين الخاصية إلى inner
لحل نطاق القالب المتداخل. قم بتعيين الخاصية على outer
لحل نطاق النموذج الأصلي.
يوضح الجدول التالي ما إذا كانت الوظائف يتم حلها إلى مجموعة الموارد الرئيسية أو مجموعة الموارد المضمنة والاشتراك.
نوع قالب | النطاق | الدقة |
---|---|---|
التداخل | الخارجي (الافتراضي) | مجموعة موارد الأصل |
التداخل | الداخلي | مجموعة الموارد الفرعية |
الارتباط التشعبي | غير متوفر | مجموعة الموارد الفرعية |
يظهر قالب المثال التالي:
- القالب المتداخل مع النطاق الافتراضي الخارجي
- قالب متداخل مع نطاق داخلي
- الارتباط التشعبي للقالب
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2022-09-01",
"name": "defaultScopeTemplate",
"resourceGroup": "inlineGroup",
"properties": {
"mode": "Incremental",
"parameters": {},
"template": {
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [],
"outputs": {
"resourceGroupOutput": {
"type": "string",
"value": "[resourceGroup().name]"
}
}
}
}
},
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2022-09-01",
"name": "innerScopeTemplate",
"resourceGroup": "inlineGroup",
"properties": {
"expressionEvaluationOptions": {
"scope": "inner"
},
"mode": "Incremental",
"parameters": {},
"template": {
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [],
"outputs": {
"resourceGroupOutput": {
"type": "string",
"value": "[resourceGroup().name]"
}
}
}
}
},
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2022-09-01",
"name": "linkedTemplate",
"resourceGroup": "linkedGroup",
"properties": {
"mode": "Incremental",
"parameters": {},
"templateLink": {
"contentVersion": "1.0.0.0",
"uri": "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/resourcegroupname.json"
}
}
}
],
"outputs": {
"parentRG": {
"type": "string",
"value": "[format('Parent resource group is {0}', resourceGroup().name)]"
},
"defaultScopeRG": {
"type": "string",
"value": "[format('Default scope resource group is {0}', reference('defaultScopeTemplate').outputs.resourceGroupOutput.value)]"
},
"innerScopeRG": {
"type": "string",
"value": "[format('Inner scope resource group is {0}', reference('innerScopeTemplate').outputs.resourceGroupOutput.value)]"
},
"linkedRG": {
"type": "string",
"value": "[format('Linked resource group is {0}', reference('linkedTemplate').outputs.resourceGroupOutput.value)]"
}
}
}
لاختبار القالب السابق والاطلاع على النتائج، استخدم PowerShell أو Azure CLI.
New-AzResourceGroup -Name parentGroup -Location southcentralus
New-AzResourceGroup -Name inlineGroup -Location southcentralus
New-AzResourceGroup -Name linkedGroup -Location southcentralus
New-AzResourceGroupDeployment `
-ResourceGroupName parentGroup `
-TemplateUri https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/crossresourcegroupproperties.json
إخراج من المثال السابق هو:
Name Type Value
=============== ========================= ==========
parentRG String Parent resource group is parentGroup
defaultScopeRG String Default scope resource group is parentGroup
innerScopeRG String Inner scope resource group is inlineGroup
linkedRG String Linked resource group is linkedgroup
الخطوات التالية
- لفهم كيفية تحديد المعلمات في نموذجك، راجع فهم بنية وبناء جملة قوالب ARM.
- للحصول على نصائح حول حل أخطاء التوزيع الشائعة، راجع استكشاف أخطاء توزيع Azure الشائعة وإصلاحها باستخدام Azure Resource Manager.
- للحصول على معلومات حول نشر قالب يتطلب رمز SAS المميز، راجع نشر قالب ARM الخاص برمز SAS المميز.