التحكم في تنفيذ حلقة والحلقات المتداخلة

مكتمل

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

في هذه الوحدة، ستتعلم كيفية التحكم في تنفيذ حلقات النسخ وكيفية استخدام حلقات خصائص المورد والحلقات المتداخلة في Bicep.

إشعار

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

التحكم في تنفيذ حلقة

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

في بعض الحالات، ومع ذلك، قد تحتاج إلى نشر الموارد في حلقات بشكل تسلسلي بدلاً من متوازٍ، أو نشر دفعات صغيرة من التغييرات معًا في نفس الوقت. على سبيل المثال، إذا كان لديك الكثير من تطبيقات Azure App Service في بيئة الإنتاج، فقد تحتاج إلى نشر تغييرات على عدد صغير فقط في كل مرة لمنع التحديثات من إعادة تشغيلها جميعًا في نفس الوقت.

يمكنك التحكم في الطريقة التي يتم بها تشغيل حلقات النسخ الخاصة بك في Bicep باستخدام مصممة @batchSize. وضع مصممة على المورد أو الإعلان عن الوحدة النمطية مع الكلمة الأساسية for.

لننظر إلى مثال تعريف Bicep لمجموعة من تطبيقات App Service دون مصممة @batchSize:

resource appServiceApp 'Microsoft.Web/sites@2021-03-01' = [for i in range(1,3): {
  name: 'app${i}'
  // ...
}]

سيتم نشر كافة الموارد في هذه الحلقة في نفس الوقت، بالتوازي:

Diagram showing time on the horizontal axis, with app1, app2, and app3 stacked vertically to be deployed at the same time.

الآن لنقُم بتطبيق مصممة @batchSize مع قيمة 2:

@batchSize(2)
resource appServiceApp 'Microsoft.Web/sites@2021-03-01' = [for i in range(1,3): {
  name: 'app${i}'
  // ...
}]

عندما تقوم بنشر القالب، سيتم نشر Bicep على دفعتين:

Diagram showing time on the horizontal axis, with app1 and app2 stacked to run as one batch, and app3 to run as a second batch.

إشعار

Bicep ينتظر اكتمال كل دفعة كاملة قبل أن ينتقل إلى التالي. في المثال السابق، إذا اكتمل نشر app2 قبل app1، ينتظر Bicep حتى ينتهي app1 قبل أن يبدأ في نشر app3.

يمكنك أيضًا إعلام Bicep لتشغيل الحلقة بشكل تسلسلي عن طريق تعيين @batchSize إلى 1:

@batchSize(1)
resource appServiceApp 'Microsoft.Web/sites@2021-03-01' = [for i in range(1,3): {
  name: 'app${i}'
  // ...
}]

عند نشر القالب، ينتظر Bicep إتمام كل نشر للموارد قبل أن يبدأ التالي:

Diagram showing time on the horizontal axis, with app1, app2, and app3 being deployed sequentially.

استخدام الحلقات مع خصائص المورد

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

param subnetNames array = [
  'api'
  'worker'
]

resource virtualNetwork 'Microsoft.Network/virtualNetworks@2021-08-01' = {
  name: 'teddybear'
  location: resourceGroup().location
  properties: {
    addressSpace: {
      addressPrefixes: [
        '10.0.0.0/16'
      ]
    }
    subnets: [for (subnetName, i) in subnetNames: {
      name: subnetName
      properties: {
        addressPrefix: '10.0.${i}.0/24'
      }
    }]
  }
}

في هذا المثال، لاحظ أن الحلقة for تظهر ضمن تعريف المورد، حول قيمة الخاصية subnets.

الحلقات المتداخلة

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

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

param locations array = [
  'westeurope'
  'eastus2'
  'eastasia'
]

var subnetCount = 2

resource virtualNetworks 'Microsoft.Network/virtualNetworks@2021-08-01' = [for (location, i) in locations : {
  name: 'vnet-${location}'
  location: location
  properties: {
    addressSpace:{
      addressPrefixes:[
        '10.${i}.0.0/16'
      ]
    }
  }
}]

تقوم هذه الحلقة بنشر الشبكات الظاهرية لكل موقع، ويقوم بتعيين addressPrefix للشبكة الظاهرية باستخدام فهرس الحلقة لضمان حصول كل شبكة ظاهرية على بادئة عنوان مختلفة.

يمكنك استخدام حلقة متداخلة لنشر الشبكات الفرعية داخل كل شبكة ظاهرية:

resource virtualNetworks 'Microsoft.Network/virtualNetworks@2021-08-01' = [for (location, i) in locations : {
  name: 'vnet-${location}'
  location: location
  properties: {
    addressSpace:{
      addressPrefixes:[
        '10.${i}.0.0/16'
      ]
    }
    subnets: [for j in range(1, subnetCount): {
      name: 'subnet-${j}'
      properties: {
        addressPrefix: '10.${i}.${j}.0/24'
      }
    }]
  }
}]

تستخدم الحلقة المتداخلة الدالة range() لإنشاء شبكتين فرعيتين.

عندما تقوم بنشر القالب، ستحصل على الشبكات الظاهرية والشبكات الفرعية التالية:

اسم الشبكة الظاهرية الموقع بادئة العنوان الشبكات الفرعية
vnet-westeurope westeurope 10.0.0.0/16 10.0.1.0/24, 10.0.2.0/24
vnet-eastus2 eastus2 10.1.0.0/16 10.1.1.0/24, 10.1.2.0/24
vnet-eastasia eastasia 10.2.0.0/16 10.2.1.0/24, 10.2.2.0/24