عمليات نشر الاشتراك باستخدام ملفات Bicep

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

توضح هذه المقالة كيفية تعيين نطاق النشر إلى اشتراك في ملف Bicep.

ملاحظة

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

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

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

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

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

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

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

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

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

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

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

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

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

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

تعيين نطاق

لتعيين النطاق للاشتراك، استخدم:

targetScope = 'subscription'

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

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

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

az deployment sub create \
  --name demoSubDeployment \
  --location centralus \
  --template-file main.bicep \
  --parameters rgName=demoResourceGroup rgLocation=centralus

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

موقع النشر واسمه

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

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

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

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

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

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

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

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

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

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

targetScope = 'subscription'

// resource group created in target subscription
resource exampleResource 'Microsoft.Resources/resourceGroups@2022-09-01' = {
  ...
}

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

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

targetScope = 'subscription'

param otherSubscriptionID string

// module deployed at subscription level but in a different subscription
module exampleModule 'module.bicep' = {
  name: 'deployToDifferentSub'
  scope: subscription(otherSubscriptionID)
}

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

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

targetScope = 'subscription'

param resourceGroupName string

module exampleModule 'module.bicep' = {
  name: 'exampleModule'
  scope: resourceGroup(resourceGroupName)
}

إذا تم إنشاء مجموعة الموارد في نفس ملف Bicep، استخدم الاسم الرمزي لمجموعة الموارد لتعيين قيمة النطاق. للحصول على مثال لتعيين النطاق إلى الاسم الرمزي، راجع إنشاء مجموعة موارد باستخدام Bicep.

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

لإنشاء موارد في المستأجر، أضف الوحدة النمطية. استخدم ⁧⁩الوظيفة tenant⁧⁩ لتعيين الخاصية ⁧scope⁩ الخاصة بها.

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

يتضمن المثال التالي وحدة نمطية موزعة إلى المستأجر.

targetScope = 'subscription'

// module deployed at tenant level
module exampleModule 'module.bicep' = {
  name: 'deployToTenant'
  scope: tenant()
}

بدلاً من استخدام وحدة نمطية، يمكنك تعيين النطاق ⁧tenant()⁩ لبعض أنواع الموارد. ينشر المثال التالي مجموعة إدارة في المستأجر.

targetScope = 'subscription'

param mgName string = 'mg-${uniqueString(newGuid())}'

// management group created at tenant
resource managementGroup 'Microsoft.Management/managementGroups@2021-04-01' = {
  scope: tenant()
  name: mgName
  properties: {}
}

output output string = mgName

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

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

للحصول على معلومات حول إنشاء مجموعات الموارد، راجع إنشاء مجموعة موارد باستخدام Bicep.

نهج Azure

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

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

targetScope = 'subscription'

param policyDefinitionID string
param policyName string
param policyParameters object = {}

resource policyAssign 'Microsoft.Authorization/policyAssignments@2022-06-01' = {
  name: policyName
  properties: {
    policyDefinitionId: policyDefinitionID
    parameters: policyParameters
  }
}

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

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

targetScope = 'subscription'

resource locationPolicy 'Microsoft.Authorization/policyDefinitions@2021-06-01' = {
  name: 'locationpolicy'
  properties: {
    policyType: 'Custom'
    parameters: {}
    policyRule: {
      if: {
        field: 'location'
        equals: 'northeurope'
      }
      then: {
        effect: 'deny'
      }
    }
  }
}

resource locationRestrict 'Microsoft.Authorization/policyAssignments@2022-06-01' = {
  name: 'allowedLocation'
  properties: {
    policyDefinitionId: locationPolicy.id
  }
}

التحكم في الوصول

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

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

targetScope = 'subscription'

@description('Name of the resourceGroup to create')
param resourceGroupName string

@description('Location for the resourceGroup')
param resourceGroupLocation string

@description('principalId of the user that will be given contributor access to the resourceGroup')
param principalId string

@description('roleDefinition to apply to the resourceGroup - default is contributor')
param roleDefinitionId string = 'b24988ac-6180-42a0-ab88-20f7382dd24c'

@description('Unique name for the roleAssignment in the format of a guid')
param roleAssignmentName string = guid(principalId, roleDefinitionId, resourceGroupName)

var roleID = '/subscriptions/${subscription().subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/${roleDefinitionId}'

resource newResourceGroup 'Microsoft.Resources/resourceGroups@2022-09-01' = {
  name: resourceGroupName
  location: resourceGroupLocation
  properties: {}
}

module applyLock 'lock.bicep' = {
  name: 'applyLock'
  scope: newResourceGroup
}

module assignRole 'role.bicep' = {
  name: 'assignRBACRole'
  scope: newResourceGroup
  params: {
    principalId: principalId
    roleNameGuid: roleAssignmentName
    roleDefinitionId: roleID
  }
}

يوضح المثال التالي الوحدة النمطية لتطبيق التأمين:

resource createRgLock 'Microsoft.Authorization/locks@2020-05-01' = {
  name: 'rgLock'
  properties: {
    level: 'CanNotDelete'
    notes: 'Resource group should not be deleted.'
  }
}

يوضح المثال التالي الوحدة النمطية لتعيين الدور:

@description('The principal to assign the role to')
param principalId string

@description('A GUID used to identify the role assignment')
param roleNameGuid string = newGuid()

param roleDefinitionId string

resource roleNameGuid_resource 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: roleNameGuid
  properties: {
    roleDefinitionId: roleDefinitionId
    principalId: principalId
  }
}

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

لكي تتعرف على النطاقات الأخرى، راجع: