استخدام الحلقات مع `for_each` و`count`
تعلّم إنشاء نسخ متعددة من مورد أو وحدة باستخدام `count` و`for_each` للتعامل مع المجموعات والخرائط بكفاءة.
استخدام الحلقات مع `for_each` و`count` درس مجاني في Terraform Infrastructure as Code على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Terraform Infrastructure as Code، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Terraform Infrastructure as Code 4 دروس في المجموع.
مقدمة إلى الحلقات
عند إدارة البنية التحتية باستخدام Terraform، غالبًا ما تحتاجون إلى إنشاء موارد متعددة متشابهة. تخيلوا أنكم تحتاجون إلى 10 خوادم ويب أو 5 مثيلات لقواعد البيانات. ستكون كتابة كتلة التعليمات البرمجية نفسها مرارًا وتكرارًا أمرًا شاقًا ومعرضًا للأخطاء!
يقدّم هذا الدرس ميزتين قويتين في Terraform: count وfor_each. وهما تساعدانكم على توفير موارد متعددة بكفاءة، مع الحفاظ على نظافة إعداداتكم وقابليتها للتوسع.
لماذا نستخدم `count` و`for_each`؟
يوفر استخدام حلقات مثل count وfor_each فوائد مهمة:
- تقليل التكرار: اكتبوا كود البنية التحتية مرة واحدة وأعيدوا استخدامه.
- تحسين قابلية القراءة: تصبح إعداداتكم أكثر نظافة وأسهل فهمًا.
- قابلية التوسع: عدّلوا عدد الموارد بسهولة عبر تغيير قيمة أو مجموعة واحدة.
- الاتساق: اضمنوا إعداد جميع الموارد المتشابهة بالطريقة نفسها.
`count` للتكرار البسيط
تُعدّ الوسيطة الوصفية count مثالية عندما تحتاجون إلى إنشاء مثيلات متطابقة تقريبًا متعددة من مورد أو وحدة. تقدّمون قيمة صحيحة، وينشئ Terraform هذا العدد من المثيلات.
تحصل كل مثيلة ينشئها count على فهرس يبدأ من 0 وينتهي عند count - 1. ويمكنكم الوصول إلى هذا الفهرس باستخدام count.index.
مثال: مثيلات EC2 متعددة باستخدام `count`
لنوفّر ثلاث مثيلات AWS EC2 متطابقة. لاحظوا كيفية استخدام count.index لمنح كل خادم اسمًا فريدًا.
provider "aws" {
region = "us-east-1"
}
resource "aws_instance" "web_server" {
count = 3
ami = "ami-053b0dcd10dcf2f56" # Ubuntu Server 20.04 LTS
instance_type = "t2.micro"
tags = {
Name = "WebServer-${count.index}"
}
}فهم `count.index`
في المثال السابق، تحولت ${count.index} تلقائيًا إلى 0 و1 و2 لكل مثيلة. ويتيح لكم ذلك إنشاء معرّفات فريدة أو تعديل خصائص كل مثيلة.
من دون count.index، كانت الخوادم الثلاثة ستحمل وسم 'Name' نفسه تمامًا، مما قد يؤدي إلى الالتباس أو حدوث مشكلات في AWS.
مقدمة إلى `for_each`
رغم أن count مناسب جدًا للتكرار البسيط، فإن for_each يوفر مرونة أكبر. فهو يتكرر على مجموعة من السلاسل أو خريطة من السلاسل، وينشئ مثيلة لكل عنصر.
يكون for_each مثاليًا عندما تحتاجون إلى إدارة موارد ذات إعدادات مميزة، أو عندما يتحدد عدد الموارد بواسطة مجموعة غير رقمية، مثل قائمة بأسماء البيئات أو خريطة بإعدادات المستخدمين.
مثال: `for_each` مع مجموعة
ننشيء هنا ثلاث حاويات S3، وتُسمّى كل منها باسم عنصر في مجموعة for_each لدينا. ونستخدم each.value للوصول إلى العنصر الحالي في التكرار.
provider "aws" {
region = "us-east-1"
}
resource "aws_s3_bucket" "app_buckets" {
for_each = toset(["prod-app-data", "dev-app-logs", "test-app-assets"])
bucket = each.value
acl = "private"
tags = {
Environment = split("-", each.value)[0]
}
}مثال: `for_each` مع خريطة
تتيح لكم الخريطة تعريف إعدادات أكثر تعقيدًا وفريدة لكل مورد. ننشئ هنا حاويات S3 بإعدادات مختلفة للإصدارات استنادًا إلى مفاتيح البيئة.
يمكنكم الوصول إلى المفتاح باستخدام each.key وإلى القيمة باستخدام each.value.
provider "aws" {
region = "us-east-1"
}
resource "aws_s3_bucket" "configured_bucket" {
for_each = {
production = { name = "prod-data-bucket", versioning = true }
development = { name = "dev-logs-bucket", versioning = false }
}
bucket = each.value.name
acl = "private"
versioning {
enabled = each.value.versioning
}
tags = {
Environment = each.key
}
}`count` مقابل `for_each`: الاختيار بحكمة
متى ينبغي استخدام كل منهما؟
- استخدموا
count: للتكرار الرقمي البسيط، وإنشاء موارد متطابقة يكون عددها هو العامل الأساسي. ويكون مناسبًا عندما تحتاجون فقط إلى فهرس للتمييز بينها. - استخدموا
for_each: للتكرار على مجموعات معقدة، مثل المجموعات أو الخرائط، عندما تحتاج الموارد إلى معرّفات فريدة أو خصائص مشتقة من عناصر المجموعة. ويُفضّل عمومًا عندما تكون لكل مثيلة هوية منطقية واضحة وفريدة.
تحقق سريع: الحلقات
تأملوا سيناريو تحتاجون فيه إلى إنشاء حاوية S3 لكل فريق في مؤسستكم، على أن تحتاج كل حاوية إلى سياسة احتفاظ محددة يعرّفها ذلك الفريق.
مراجعة: إنشاء الموارد بكفاءة
أحسنتم! لقد تعلمتم كيفية الاستفادة من count وfor_each لجعل إعدادات Terraform أكثر ديناميكية وكفاءة.
countمخصص للتكرار الرقمي البسيط للموارد المتطابقة، مع استخدامcount.indexللتمييز بينها.for_eachمخصص للتكرار على المجموعات أو الخرائط، وإنشاء موارد مميزة ذات خصائص فريدة باستخدامeach.keyوeach.value.
تُعدّ هذه البنى أساسية لإدارة بنية تحتية قابلة للتوسع وسهلة الصيانة باعتبارها كودًا!
الأسئلة الشائعة
هل درس «استخدام الحلقات مع `for_each` و`count`» مجاني؟
نعم — نص درس «استخدام الحلقات مع `for_each` و`count`» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Terraform Infrastructure as Code، انتقل إلى CoddyKit PRO. تتضمن دورة Terraform Infrastructure as Code 4 دروس في المجموع.
ماذا ستتعلم في «استخدام الحلقات مع `for_each` و`count`»؟
تعلّم إنشاء نسخ متعددة من مورد أو وحدة باستخدام `count` و`for_each` للتعامل مع المجموعات والخرائط بكفاءة. تتمرن على Terraform Infrastructure as Code مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Terraform Infrastructure as Code؟
لا تُشترط خبرة سابقة. Terraform Infrastructure as Code على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «استخدام الحلقات مع `for_each` و`count`»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Terraform Infrastructure as Code هذا؟
نعم. كل درس في Terraform Infrastructure as Code يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- استخدام الحلقات مع `for_each` و`count`
- الدوال المضمّنة في Terraform
- التعبيرات الشرطية وتعبيرات Splat
- الكتل الديناميكية للإعدادات المتداخلة