عمليات نشر الاشتراك مع قوالب Azure Resource Manager

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

إشعار

يمكنك نشر حوالي 800 مجموعة موارد مختلفة في عملية النشر على مستوى الاشتراك.

لنشر القوالب على مستوى الاشتراك، استخدم Azure CLI أو PowerShell أو REST API أو المدخل.

تلميح

نوصي باستخدام Bicep لأنها تقدم نفس الإمكانات التي توفرها نماذج ARM ولأن البنية أسهل في الاستخدام. لمعرفة المزيد، راجع عمليات توزيع الاشتراك.

الموارد المدعومة

لا يمكن نشر جميع أنواع الموارد على مستوى الاشتراك. يسرد هذا المقطع أنواع الموارد المعتمدة.

بخصوص Azure Blueprints، استخدم:

بالنسبة إلى نُهج Azure، استخدم:

للتحكم في الوصول، استخدم:

بالنسبة للقوالب المتداخلة التي يتم نشرها في مجموعات الموارد، استخدم:

لإنشاء مجموعات موارد جديدة، استخدم:

لإدارة اشتراكك، استخدم:

للمراقبة، استخدم:

للأمان، استخدم:

وتشمل الأنواع الأخرى المدعومة ما يلي:

مخطط

يختلف المخطط الذي تستخدمه لعمليات نشر مستوى الاشتراك عن المخطط الخاص بعمليات نشر مجموعة الموارد.

بالنسبة للقوالب، قم باستخدام:

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  ...
}

مخطط ملف المعلمة هو نفسه لجميع نطاقات النشر. بالنسبة لملفات المعلمات، قم باستخدام:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
  ...
}

أوامر التوزيع

للنشر إلى اشتراك، استخدم أوامر النشر على مستوى الاشتراك.

بالنسبة لـ Azure CLI، استخدم الأمر az deployment sub create. المثال التالي ينشر قالب لإنشاء مجموعة موارد:

az deployment sub create \
  --name demoSubDeployment \
  --location centralus \
  --template-uri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/emptyrg.json" \
  --parameters rgName=demoResourceGroup rgLocation=centralus

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

موقع التوزيع والاسم

يجب توفير موقع للنشر عند القيام بعمليات النشر على مستوى الاشتراك. ينفصل موقع النشر عن موقع الموارد التي تقوم بنشرها. يحدد موقع التوزيع مكان تخزين بيانات التوزيع. تتطلب عمليات نشرمجموعة الإدارة والمستأجر موقعاً أيضاً. بالنسبة إلى عمليات نشر مجموعة الموارد، يتم استخدام موقع مجموعة الموارد لتخزين بيانات النشر.

يمكنك توفير اسم لعملية التوزيع، أو استخدام اسم التوزيع الافتراضي. يكون الاسم الافتراضي هو اسم ملف القالب. على سبيل المثال، يؤدي نشر قالب باسم main.bicep إلى إنشاء اسم نشر افتراضي يسمى main.

يكون الموقع غير قابل للتغيير لكل اسم عملية توزيع. ولا يمكنك إنشاء عملية توزيع في أحد المواقع عندما يكون هناك توزيع موجود بنفس الاسم في موقع آخر. على سبيل المثال، إذا قمت بإنشاء نشر اشتراك باسم deployment1 في الموقع centralus، فلا يمكنك لاحقاً إنشاء نشر آخر بالاسم deployment1 في الموقع westus. إذا تلقيت رمز الخطأ InvalidDeploymentLocation، فاستخدم اسمًا مختلفًا أو نفس موقع التوزيع السابق لذلك الاسم.

نطاقات التوزيع

عند النشر إلى اشتراك، يمكنك نشر الموارد إلى:

  • الاشتراك الهدف من العملية
  • أي اشتراك في المستأجر
  • مجموعات الموارد داخل الاشتراك أو الاشتراكات الأخرى
  • المستأجر للاشتراك

تحدث انتقالات النطاق المحظورة الوحيدة من مجموعة الموارد إلى مجموعة الإدارة، أو من الاشتراك إلى مجموعة الإدارة.

يمكن تحديد نطاق مورد ملحق لهدف مختلف عن هدف النشر.

يجب أن يكون لدى المستخدم الذي يقوم بتوزيع القالب حق الوصول إلى النطاق المحدد.

يوضح هذا القسم كيفية تحديد النطاقات المختلفة. يمكنك دمج هذه النطاقات المختلفة في قالب واحد.

نطاق الاشتراك الهدف

لنشر الموارد إلى الاشتراك الهدف، أضف هذه الموارد إلى قسم الموارد في القالب.

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    subscription-level-resources
  ],
  "outputs": {}
}

للحصول على أمثلة من النشر إلى الاشتراك، راجع إنشاء مجموعات الموارد وتعيين تعريف النهج.

نطاق الاشتراك الآخر

لنشر الموارد إلى اشتراك مختلف عن الاشتراك الذي تتم به العملية، أضف عملية نشر متداخلة. تعيين الخاصية subscriptionId لمعرف الاشتراك الذي تريد النشر إليه. تعيين الخاصية location للنشر المتداخلة.

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "nestedDeployment",
      "subscriptionId": "00000000-0000-0000-0000-000000000000",
      "location": "westus",
      "properties": {
        "mode": "Incremental",
        "template": {
          subscription-resources
        }
      }
    }
  ],
  "outputs": {}
}

نطاق لمجموعة الموارد

لنشر الموارد إلى مجموعة موارد في الاشتراك، قم بإضافة نشر متداخلة وتضمين resourceGroup الخاصية. في المثال التالي، يستهدف النشر المتداخل مجموعة موارد تسمى demoResourceGroup.

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "nestedDeployment",
      "resourceGroup": "demoResourceGroup",
      "properties": {
        "mode": "Incremental",
        "template": {
          resource-group-resources
        }
      }
    }
  ],
  "outputs": {}
}

للحصول على مثال للنشر إلى مجموعة موارد، راجع إنشاء مجموعة موارد وموارد.

نطاق للمستأجر

لإنشاء موارد في المستأجر، قم بتعيين scope إلى /. يجب أن يكون لدى المستخدم الذي يقوم بنشر القالب حق الوصول المطلوب للنشر لدى المستأجر.

لاستخدام نشر متداخل، قم بتعيين scope وlocation.

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "nestedDeployment",
      "location": "centralus",
      "scope": "/",
      "properties": {
        "mode": "Incremental",
        "template": {
          tenant-resources
        }
      }
    }
  ],
  "outputs": {}
}

بدلاً من استخدام الوحدة النمطية، يمكنك تعيين النطاق / لبعض أنواع الموارد.

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "mgName": {
      "type": "string",
      "defaultValue": "[concat('mg-', uniqueString(newGuid()))]"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Management/managementGroups",
      "apiVersion": "2021-04-01",
      "name": "[parameters('mgName')]",
      "scope": "/",
      "location": "eastus",
      "properties": {}
    }
  ],
  "outputs": {
    "output": {
      "type": "string",
      "value": "[parameters('mgName')]"
    }
  }
}

لمزيد من المعلومات، راجع مجموعة الإدارة.

مجموعات الموارد

إنشاء مجموعات الموارد

لإنشاء مجموعة موارد في قالب Azure Resource Manager، قم بتعريف مورد Microsoft.Resources/resourceGroups باسم وموقع لمجموعة الموارد.

ينشئ القالب التالي مجموعة موارد فارغة.

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "rgName": {
      "type": "string"
    },
    "rgLocation": {
      "type": "string"
    }
  },
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Resources/resourceGroups",
      "apiVersion": "2022-09-01",
      "name": "[parameters('rgName')]",
      "location": "[parameters('rgLocation')]",
      "properties": {}
    }
  ],
  "outputs": {}
}

استخدم عنصر النسخ مع مجموعات الموارد لإنشاء أكثر من مجموعة موارد.

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "rgNamePrefix": {
      "type": "string"
    },
    "rgLocation": {
      "type": "string"
    },
    "instanceCount": {
      "type": "int"
    }
  },
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Resources/resourceGroups",
      "apiVersion": "2022-09-01",
      "location": "[parameters('rgLocation')]",
      "name": "[concat(parameters('rgNamePrefix'), copyIndex())]",
      "copy": {
        "name": "rgCopy",
        "count": "[parameters('instanceCount')]"
      },
      "properties": {}
    }
  ],
  "outputs": {}
}

للحصول على معلومات حول تكرار المورد، راجع تكرار الموارد في قوالب Azure Resource Manager، والبرنامج التعليمي: إنشاء مثيلات موارد متعددة باستخدام قوالب Azure Resource Manager.

إنشاء مجموعة موارد وموارد

لإنشاء مجموعة الموارد ونشر الموارد إليها، استخدم قالباً متداخلاً. يحدد القالب المتداخل الموارد التي يجب نشرها في مجموعة الموارد. تعيين القالب المتداخل على أنه يعتمد على مجموعة الموارد؛ للتأكد من وجود مجموعة الموارد قبل نشر الموارد. يمكنك النشر إلى ما يصل إلى 800 مجموعة موارد.

يُنشئ المثال التالي مجموعة موارد وينشر حساب تخزين إلى مجموعة الموارد.

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "rgName": {
      "type": "string"
    },
    "rgLocation": {
      "type": "string"
    },
    "storagePrefix": {
      "type": "string",
      "maxLength": 11
    }
  },
  "variables": {
    "storageName": "[format('{0}{1}', parameters('storagePrefix'), uniqueString(subscription().id, parameters('rgName')))]"
  },
  "resources": [
    {
      "type": "Microsoft.Resources/resourceGroups",
      "apiVersion": "2022-09-01",
      "name": "[parameters('rgName')]",
      "location": "[parameters('rgLocation')]",
      "properties": {}
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2022-09-01",
      "name": "storageDeployment",
      "resourceGroup": "[parameters('rgName')]",
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "resources": [
            {
              "type": "Microsoft.Storage/storageAccounts",
              "apiVersion": "2022-09-01",
              "name": "[variables('storageName')]",
              "location": "[parameters('rgLocation')]",
              "sku": {
                "name": "Standard_LRS"
              },
              "kind": "StorageV2"
            }
          ]
        }
      },
      "dependsOn": [
        "[resourceId('Microsoft.Resources/resourceGroups/', parameters('rgName'))]"
      ]
    }
  ]
}

نهج Azure

تعيين تعريف النهج

يُعين المثال التالي تعريف نهج موجود للاشتراك. إذا كان تعريف النهج يستخدم معلمات، فقم بتوفيرها ككائن. إذا لم يكن تعريف النهج يستخدم المعلمات، فاستخدم الكائن الافتراضي الفارغ.

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "policyDefinitionID": {
      "type": "string"
    },
    "policyName": {
      "type": "string"
    },
    "policyParameters": {
      "type": "object",
      "defaultValue": {}
    }
  },
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Authorization/policyAssignments",
      "apiVersion": "2020-03-01",
      "name": "[parameters('policyName')]",
      "properties": {
        "scope": "[subscription().id]",
        "policyDefinitionId": "[parameters('policyDefinitionID')]",
        "parameters": "[parameters('policyParameters')]"
      }
    }
  ]
}

لنشر هذا القالب باستخدام Azure CLI، استخدم:

# Built-in policy definition that accepts parameters
definition=$(az policy definition list --query "[?displayName=='Allowed locations'].id" --output tsv)

az deployment sub create \
  --name demoDeployment \
  --location centralus \
  --template-uri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/policyassign.json" \
  --parameters policyDefinitionID=$definition policyName=setLocation policyParameters="{'listOfAllowedLocations': {'value': ['westus']} }"

لنشر هذا القالب باستخدام PowerShell، استخدم:

$definition = Get-AzPolicyDefinition | Where-Object { $_.Properties.DisplayName -eq 'Allowed locations' }

$locations = @("westus", "westus2")
$policyParams =@{listOfAllowedLocations = @{ value = $locations}}

New-AzSubscriptionDeployment `
  -Name policyassign `
  -Location centralus `
  -TemplateUri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/policyassign.json" `
  -policyDefinitionID $definition.PolicyDefinitionId `
  -policyName setLocation `
  -policyParameters $policyParams

إنشاء تعريفات النهج وتعيينها

يمكنك تحديد تعريف النهج وتعيينه في نفس القالب.

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {},
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Authorization/policyDefinitions",
      "apiVersion": "2020-03-01",
      "name": "locationpolicy",
      "properties": {
        "policyType": "Custom",
        "parameters": {},
        "policyRule": {
          "if": {
            "field": "location",
            "equals": "northeurope"
          },
          "then": {
            "effect": "deny"
          }
        }
      }
    },
    {
      "type": "Microsoft.Authorization/policyAssignments",
      "apiVersion": "2020-03-01",
      "name": "location-lock",
      "dependsOn": [
        "locationpolicy"
      ],
      "properties": {
        "scope": "[subscription().id]",
        "policyDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/policyDefinitions', 'locationpolicy')]"
      }
    }
  ]
}

لإنشاء تعريف النهج في اشتراكك، وتخصيصه للاشتراك، استخدم أمر CLI التالي:

az deployment sub create \
  --name demoDeployment \
  --location centralus \
  --template-uri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/policydefineandassign.json"

لنشر هذا القالب باستخدام PowerShell، استخدم:

New-AzSubscriptionDeployment `
  -Name definePolicy `
  -Location centralus `
  -TemplateUri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/policydefineandassign.json"

Azure Blueprints

إنشاء تعريف مخطط

يمكنك إنشاء تعريف مخطط من قالب.

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "blueprintName": {
      "defaultValue": "sample-blueprint",
      "type": "String",
      "metadata": {
        "description": "The name of the blueprint definition."
      }
    }
  },
  "resources": [
    {
      "type": "Microsoft.Blueprint/blueprints",
      "apiVersion": "2018-11-01-preview",
      "name": "[parameters('blueprintName')]",
      "properties": {
        "targetScope": "subscription",
        "description": "Blueprint with a policy assignment artifact.",
        "resourceGroups": {
          "sampleRg": {
            "description": "Resource group to add the assignment to."
          }
        },
        "parameters": {
          "listOfResourceTypesNotAllowed": {
            "type": "array",
            "metadata": {
              "displayName": "Resource types to pass to the policy assignment artifact."
            },
            "defaultValue": [
              "Citrix.Cloud/accounts"
            ]
          }
        }
      }
    },
    {
      "type": "Microsoft.Blueprint/blueprints/artifacts",
      "apiVersion": "2018-11-01-preview",
      "name": "[concat(parameters('blueprintName'), '/policyArtifact')]",
      "kind": "policyAssignment",
      "dependsOn": [
        "[parameters('blueprintName')]"
      ],
      "properties": {
        "displayName": "Blocked Resource Types policy definition",
        "description": "Block certain resource types",
        "policyDefinitionId": "[tenantResourceId('Microsoft.Authorization/policyDefinitions', '6c112d4e-5bc7-47ae-a041-ea2d9dccd749')]",
        "resourceGroup": "sampleRg",
        "parameters": {
          "listOfResourceTypesNotAllowed": {
            "value": "[[parameters('listOfResourceTypesNotAllowed')]"
          }
        }
      }
    }
  ]
}

لإنشاء تعريف المخطط في اشتراكك، استخدم الأمر CLI التالي:

az deployment sub create \
  --name demoDeployment \
  --location centralus \
  --template-uri "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/subscription-deployments/blueprints-new-blueprint/azuredeploy.json"

لنشر هذا القالب باستخدام PowerShell، استخدم:

New-AzSubscriptionDeployment `
  -Name demoDeployment `
  -Location centralus `
  -TemplateUri "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/subscription-deployments/blueprints-new-blueprint/azuredeploy.json"

عنصر تحكم الوصول

لمعرفة المزيد حول تعيين الأدوار، راجع تعيين أدوار Azure باستخدام قوالب Azure Resource Manager .

يُنشئ المثال التالي مجموعة موارد، وتطبيق تأمين عليها، وتعيين دور للحساب الأساسي.

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "metadata": {
    "_generator": {
      "name": "bicep",
      "version": "0.5.6.12127",
      "templateHash": "16815708176905569328"
    }
  },
  "parameters": {
    "rgName": {
      "type": "string",
      "metadata": {
        "description": "Name of the resourceGroup to create"
      }
    },
    "rgLocation": {
      "type": "string",
      "metadata": {
        "description": "Location for the resourceGroup"
      }
    },
    "principalId": {
      "type": "string",
      "metadata": {
        "description": "principalId of the user that will be given contributor access to the resourceGroup"
      }
    },
    "roleDefinitionId": {
      "type": "string",
      "defaultValue": "b24988ac-6180-42a0-ab88-20f7382dd24c",
      "metadata": {
        "description": "roleDefinition to apply to the resourceGroup - default is contributor"
      }
    },
    "roleAssignmentName": {
      "type": "string",
      "defaultValue": "[guid(parameters('principalId'), parameters('roleDefinitionId'), parameters('rgName'))]",
      "metadata": {
        "description": "Unique name for the roleAssignment in the format of a guid"
      }
    }
  },
  "resources": [
    {
      "type": "Microsoft.Resources/resourceGroups",
      "apiVersion": "2019-10-01",
      "name": "[parameters('rgName')]",
      "location": "[parameters('rgLocation')]",
      "tags": {
        "Note": "subscription level deployment"
      },
      "properties": {}
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2020-10-01",
      "name": "applyLock",
      "resourceGroup": "[parameters('rgName')]",
      "properties": {
        "expressionEvaluationOptions": {
          "scope": "inner"
        },
        "mode": "Incremental",
        "parameters": {
          "principalId": {
            "value": "[parameters('principalId')]"
          },
          "roleDefinitionId": {
            "value": "[parameters('roleDefinitionId')]"
          },
          "roleAssignmentName": {
            "value": "[parameters('roleAssignmentName')]"
          }
        },
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "metadata": {
            "_generator": {
              "name": "bicep",
              "version": "0.5.6.12127",
              "templateHash": "6034226420560042393"
            }
          },
          "parameters": {
            "principalId": {
              "type": "string",
              "metadata": {
                "description": "principalId of the user that will be given contributor access to the resourceGroup"
              }
            },
            "roleDefinitionId": {
              "type": "string",
              "metadata": {
                "description": "roleDefinition to apply to the resourceGroup - default is contributor"
              }
            },
            "roleAssignmentName": {
              "type": "string",
              "metadata": {
                "description": "Unique name for the roleAssignment in the format of a guid"
              }
            }
          },
          "resources": [
            {
              "type": "Microsoft.Authorization/locks",
              "apiVersion": "2016-09-01",
              "name": "DontDelete",
              "properties": {
                "level": "CanNotDelete",
                "notes": "Prevent deletion of the resourceGroup"
              }
            },
            {
              "type": "Microsoft.Authorization/roleAssignments",
              "apiVersion": "2020-04-01-preview",
              "name": "[guid(parameters('roleAssignmentName'))]",
              "properties": {
                "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', parameters('roleDefinitionId'))]",
                "principalId": "[parameters('principalId')]"
              }
            }
          ]
        }
      },
      "dependsOn": [
        "[subscriptionResourceId('Microsoft.Resources/resourceGroups', parameters('rgName'))]"
      ]
    }
  ]
}

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