دوال قالب ARM في نطاقات التوزيع

باستخدام قوالب Azure Resource Manager (قوالب ARM)، يمكنك التوزيع إلى مجموعات الموارد أو الاشتراكات أو مجموعات الإدارة أو المستأجرين. بشكل عام، تعمل دوال قوالب ARM بنفس الطريقة لكافة النطاقات. توضح هذه المقالة الاختلافات الموجودة لبعض الدوال حسب النطاق.

دوال مدعومة

عند التوزيع إلى نطاقات مختلفة، هناك بعض الاعتبارات الهامة:

  • يتم اعتماد الدالة (resourceGroup) عمليات توزيع مجموعة الموارد.

  • يتم اعتماد الدالة(subscription) لمجموعة الموارد وتوزيع الاشتراك.

  • يتم اعتماد الدالات (المرجع) و(list) لكافة النطاقات.

  • استخدم (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

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