نشر الموارد إلى نطاقات متعددة

مكتمل

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

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

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

إشعار

يتم عرض الأوامر في هذه الوحدة لتوضيح المفاهيم. لا تشغّل الأوامر الآن. ستتدرب على ما تتعلمه هنا قريبا.

تحديد نطاق الوحدة النمطية

يمكنك استخدام وحدات Bicep لنشر مجموعة من الموارد في نطاق مختلف عن targetScope المحدد في الملف. فيما يلي مثال لملف Bicep الذي تم نشره باستخدام targetScope subscription، ولكنه يستخدم وحدة نمطية لنشر بعض الموارد إلى مجموعة موارد:

targetScope = 'subscription'

module networkModule 'modules/network.bicep' = {
  scope: resourceGroup('ToyNetworking')
  name: 'networkModule'
}

لاحظ أن الخاصية scope تستخدم دالة Bicep للمساعدة في تحديد النطاق المطلوب استهدافه. يستخدم المثال السابق الدالة resourceGroup() ويحدد اسم مجموعة الموارد المراد استهدافها. يمكنك أيضا استخدام الدالات subscription()managementGroup()و وtenant(). باستخدام الكلمة الأساسية على targetScope ملفات Bicep والكلمة scope الأساسية على الوحدات النمطية، من الممكن إنشاء الكثير من مجموعات مختلفة من النطاقات الخاصة عمليات النشر الخاصة بك.

إشعار

أحد الاستثناءات هو أن ملفات Bicep مع أو subscription targetScope resourceGroup لا يمكن أن تتضمن وحدة نمطية مع من managementGroupscope .

تلميح

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

النشر عبر مجموعات موارد متعددة

الاستخدام الشائع للنطاقات هو نشر الموارد عبر مجموعات موارد متعددة. على الرغم من أنه لا يمكنك تعيين الخاصية scope على معظم موارد Azure، يمكنك استخدام الوحدات النمطية لإخبار Bicep أنه يجب نشر مجموعة من الموارد إلى مجموعة موارد مختلفة.

على سبيل المثال، قد تحتاج إلى إنشاء مجموعة واحدة من ملفات Bicep التي تنشر شبكة ظاهرية والموارد المقترنة بها إلى مجموعة موارد مشتركة تسمى ToyNetworking، ثم نشر واجهة شبكة إلى مجموعة موارد مختلفة. إليك ما يبدو عليه ملف Bicep:

module networkModule 'modules/network.bicep' = {
  scope: resourceGroup('ToyNetworking')
  name: 'networkModule'
}

resource networkInterface 'Microsoft.Network/networkInterfaces@2020-11-01' = {
  name: 'production-nic'
  location: resourceGroup().location
  properties: {
    ipConfigurations: [
      {
        name: 'toy-subnet-ip-configuration'
        properties: {
          subnet: {
            id: networkModule.outputs.subnetResourceId
          }
        }
      }
    ]
  }
}

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

بعد نشر هذا الملف، يمكنك استهداف مجموعة موارد أخرى تسمى ProjectTeddybear، على النحو التالي:

az deployment group create --resource-group ProjectTeddybear ...
New-AzResourceGroupDeployment -ResourceGroupName ProjectTeddybear ...

على الرغم من أن التوزيع يستهدف مجموعة موارد ProjectTeddybear ، يتم نشر موارد الشبكة الظاهرية إلى مجموعة موارد ToyNetworking . يتم نشر واجهة الشبكة إلى مجموعة موارد ProjectTeddybear .

يمكنك حتى نشر مجموعة موارد في اشتراك آخر عن طريق تضمين معرف الاشتراك في resourceGroup النطاق:

module networkModule 'modules/network.bicep' = {
  scope: resourceGroup('f0750bbe-ea75-4ae5-b24d-a92ca601da2c', 'ToyNetworking')
  name: 'networkModule'
}

وبالمثل، يمكنك استخدام دالة subscription() النطاق لنشر الموارد عبر اشتراكات متعددة في نطاق الاشتراك، ويمكنك استخدام دالة managementGroup() النطاق لنشر الموارد عبر مجموعات إدارة متعددة. ومع ذلك، لا يمكنك نشرها عبر مستأجرين متعددين.

تحديد النطاق لمورد واحد

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

على سبيل المثال، قد تستخدم ملف Bicep لإنشاء تدرج هرمي لمجموعة إدارة، كما هو موضح في المثال التالي:

targetScope = 'managementGroup'

resource parentManagementGroup 'Microsoft.Management/managementGroups@2020-05-01' = {
  scope: tenant()
  name: 'NonProduction'
  properties: {
    displayName: 'Non-production'
  }
}

resource childManagementGroup 'Microsoft.Management/managementGroups@2020-05-01' = {
  scope: tenant()
  name: 'SecretRND'
  properties: {
    displayName: 'Secret R&D Projects'
    details: {
      parent: {
        id: parentManagementGroup.id
      }
    }
  }
}

لاحظ أن هذا المثال يستخدم targetScope = 'managementGroup' في ملف القالب، ولكنه ينشر بعد ذلك مجموعات الإدارة داخل tenant() النطاق.

إشعار

يوضح المثال السابق كيفية استخدام Bicep لإنشاء تدرج هرمي لمجموعة الإدارة. ستكون مجموعة إدارة NonProduction تابعة لمجموعة إدارة الجذر، وستكون مجموعة إدارة SecretRND تابعة لمجموعة إدارة NonProduction.

إنشاء مجموعة إدارة وتدرج هرمي للاشتراك

الآن أنت تعرف كيفية نشر العديد من الموارد المختلفة في مجموعة متنوعة من النطاقات، وأنت تعرف كيفية استخدام وحدات Bicep والكلمة scope الأساسية لنشر مجموعات من الموارد. دعونا نطبق كل هذه المعلومات الجديدة على توسيع التدرج الهرمي لمجموعة الإدارة في المثال السابق. الآن، سيتضمن التسلسل الهرمي أيضا اسما مستعارا للاشتراك، وهو مورد نطاق المستأجر الذي ينشئ اشتراك Azure جديدا:

resource subscription 'Microsoft.Subscription/aliases@2020-09-01' = {
  scope: tenant()
  name: subscriptionAliasName
  properties: {
    // ...
  }
}

إشعار

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

يمكنك بعد ذلك إقران الاشتراك بمجموعة إدارة، والتي تتطلب منك نشر نوع مورد يسمى Microsoft.Management/managementGroups/subscriptions. وبسبب الطريقة التي يعمل بها هذا المورد، يمكنك إعلانه في وحدة. على سبيل المثال، ها هو ملف يُسمى modules/mg-subscription-association.bicep:

targetScope = 'tenant'

@description('The name of the management group that should contain the subscription.')
param managementGroupName string

@description('The subscription ID to place into the management group.')
param subscriptionId string

resource managementGroup 'Microsoft.Management/managementGroups@2021-04-01' existing = {
  name: managementGroupName
}

resource subscriptionAssociation 'Microsoft.Management/managementGroups/subscriptions@2021-04-01' = {
  parent: managementGroup
  name: subscriptionId
}

لاحظ أن مجموعة الإدارة يُشار إليها من خلال الكلمة الأساسية existing.

يمكن للملف Bicep الرئيسي فيما بعد إنشاء الاقتران عن طريق تضمين الوحدة النمطية. ها هو ملف Bicep بأكمله:

targetScope = 'managementGroup'

@description('The name of the subscription alias to deploy.')
param subscriptionAliasName string

resource parentManagementGroup 'Microsoft.Management/managementGroups@2020-05-01' = {
  scope: tenant()
  name: 'NonProduction'
  properties: {
    displayName: 'Non-production'
  }
}

resource childManagementGroup 'Microsoft.Management/managementGroups@2020-05-01' = {
  scope: tenant()
  name: 'SecretRND'
  properties: {
    displayName: 'Secret R&D Projects'
    details: {
      parent: {
        id: parentManagementGroup.id
      }
    }
  }
}

resource subscription 'Microsoft.Subscription/aliases@2020-09-01' = {
  scope: tenant()
  name: subscriptionAliasName
  properties: {
    // ...
  }
}

module subscriptionAssociation 'modules/mg-subscription-association.bicep' = {
  name: 'subscriptionAssociation'
  scope: tenant()
  params: {
    managementGroupName: childManagementGroup.name
    subscriptionId: subscription.properties.subscriptionId
  }
}

كما رأيت، يمكنك استخدام جميع النطاقات وميزات لغة Bicep معًا لإنشاء عمليات نشر متطورة للبنية الأساسية لـ Azure بأكملها.