Terragrunt وخطوط أنابيب DRY
Terragrunt وخطوط أنابيب DRY
Terraform محرك قوي لـ IaC، لكنه يعاني من ثغرة هيكلية: لا يوفر آلية أصيلة للحفاظ على إعدادات استدعاء الوحدات جافة من التكرار. بمجرد إدارة ثلاثة بيئات (dev, staging, prod) عبر منطقتين، تجد نفسك تنسخ نفس كتلة backend، ونفس إصدار الموفّر، ونفس مصدر الوحدة في عشرات الملفات. Terragrunt هو الغلاف التنسيقي الخفيف الذي يحل هذه المشكلة تحديداً: يحتفظ بالإعداد الجذري في مكان واحد، ويوصّل الحالة البعيدة تلقائياً، ويعبّر عن تبعيات المكدسات بصورة تصريحية، ويتيح تشغيل run-all apply لتقارب بيئة كاملة بترتيب طوبولوجي. على نطاق الشركات الكبرى، هذا هو الفرق بين مستودع بنية تحتية من خمسة ملفات وكارثة من 3,000 ملف متكرر.
ما هو Terragrunt فعلياً
Terragrunt ثنائي Go يلتف حول terraform. كل أمر Terragrunt يُنشئ دليلاً مؤقتاً، يكتب فيه إعدادات الواجهة الخلفية والموفّر، ثم يفوّض التنفيذ إلى terraform. فريقك لا يكتب Terraform بشكل مختلف — بل يتوقف فقط عن كتابة الشيفرة النمطية المتكررة. يقرأ Terragrunt ملفات terragrunt.hcl التي تستخدم HCL2 مع كتل خاصة بـ Terragrunt: remote_state، dependency، inputs، generate، وinclude.
هيكل المستودع المعياري
يفصل مستودع Terragrunt القياسي بين الماذا (وحدات Terraform) والأين والكيف (إعدادات Terragrunt الحية). هيكل نموذجي لمنصة AWS بثلاث بيئات:
يكمن السحر في ملف terragrunt.hcl الجذري. كل مكدس ورقي يُضمّنه عبر include، مما يعني كتابة إعداد الواجهة الخلفية والموفّرات المطلوبة مرة واحدة بالضبط.
ملف terragrunt.hcl الجذري — المصدر الوحيد للحقيقة
الدالة الأساسية هي path_relative_to_include(). للمكدس الموجود في prod/eks/terragrunt.hcl تُعيد prod/eks، فيصبح مفتاح S3 prod/eks/terraform.tfstate — فريد لكل مكدس، دون تسمية يدوية، ودون خطر التصادم.
ملف terragrunt.hcl للمكدسات الورقية — استدعاء الوحدات دون شيفرة نمطية
لا يوجد backend.tf، ولا provider.tf، ولا versions.tf. يُولّدها Terragrunt الثلاثة عند التشغيل من الإعداد الجذري. يحتوي الملف الورقي فقط على ما هو فريد لهذا المكدس: مصدر الوحدة، وتثبيت الإصدار، والمدخلات.
ربط التبعيات وأمر run-all
كتلة dependency هي الميزة الأقوى في Terragrunt. تقرأ حالة مكدس آخر (config_path) وتعرض مخرجاته ككائن منظّم. هذا يحل محل مصادر بيانات terraform_remote_state المتناثرة ويجعل رسم بياني التبعية صريحاً وقابلاً للقراءة آلياً.
مع إعلان التبعيات، يمكنك تقارب بيئة كاملة بأمر واحد:
ينشئ run-all رسماً بيانياً موجّهاً لا دوري (DAG) من جميع كتل dependency التي يجدها في شجرة الدليل المستهدف. المكدسات المستقلة تعمل بالتوازي؛ المعتمدة تنتظر. يقلص هذا عادةً وقت التطبيق على مستوى البيئة بنسبة 60–80% مقارنة بالتنفيذ المتسلسل.
الإعداد الجاف مع account.hcl
يمتلك مستودع Terragrunt الإنتاجي عادةً مستويين أو ثلاثة من ملفات الإعداد المشتركة التي يقرأها Terragrunt عبر read_terragrunt_config():
account.hcl— على مستوى دليل البيئة. يحتوي على معرّف حساب AWS والمنطقة واسم البيئة لهذا الفرع.region.hcl— على مستوى دليل المنطقة في بنيات متعددة المناطق.- ملف
terragrunt.hclالجذري — يقرأ كليهما، ويُولّد الموفّر والواجهة الخلفية لكل فرع تلقائياً.
هذا يعني إضافة بيئة رابعة (مثل perf) تتطلب فقط إنشاء دليل واحد، وملف account.hcl بثلاث قيم، ونسخ ملفات terragrunt.hcl الورقية. لا حاجة للمساس بأي كتل backend أو provider أو versions.
run-all apply على بيئة الإنتاج دون مراجعة مسبقة لـ run-all plan في CI. التنفيذ بالرسم البياني DAG سريع بالضبط لأنه متوازٍ — تغيير خاطئ يمكن أن يكتمل عبر مكدسات متعددة قبل أن تتمكن من إيقافه. يجب دائماً أن تكون تطبيقات الإنتاج مشروطة بخطة معتمدة من إنسان محفوظة كأداة CI.
Terragrunt في خطوط أنابيب CI/CD
يستخدم نمط خط الأنابيب الموصى به run-all plan عند فتح طلب السحب وrun-all apply عند الدمج في main، مقيّداً بدليل البيئة المتغيرة:
tf_version وtg_version في CI. إصدارات Terragrunt متكررة وتُدخل أحياناً تغييرات سلوكية. انجراف الإصدارات غير المنضبط بين المطورين وCI هو مصدر شهير لتباين "يعمل على جهازي". استخدم ملف .terraform-version وملف .terragrunt-version في جذر المستودع واقرأهما في خط أنابيبك.
أنماط الفشل الشائعة في بيئة الإنتاج
- المخرجات الوهمية القديمة في plan. إذا لم تتطابق mock_outputs مع المخرجات الفعلية، تبدو الخطط سليمة لكن التطبيق يفشل. راجع المخرجات الوهمية في كل مرة تتغير فيها شكل مخرجات الوحدة الأصلية.
- تنازع القفل في run-all apply. المكدسات المتوازية التي تشترك في جدول DynamoDB للقفل قد تصطدم بالتقنين عند التوازي الشديد. اضبط
--terragrunt-parallelism 4لتحديد التزامن في البيئات ذات المكدسات الكثيرة. - تصادم مسار الحالة بعد إعادة تسمية الدليل. إذا أعدت تسمية
dev/rds/إلىdev/aurora/، يُولّد Terragrunt مفتاح S3 جديداً. الحالة القديمة مهجورة؛ المسار الجديد يبدأ فارغاً ويحاول إنشاء كل شيء من جديد. نفّذ دائماًterraform state mvأو أعد تسمية مفتاح S3 فعلياً قبل دخول تغيير اسم الدليل. - الملفات المولّدة محفوظة في git. يكتب Terragrunt
provider.tfوbackend.tfفي أدلة العمل. أضف.terragrunt-cache/وأي ملفاتgenerated*.tfإلى.gitignore— حفظها يكسر نموذج DRY.
إتقان Terragrunt يحوّل مجموعة هشة من أدلة Terraform الخاصة بكل بيئة إلى منصة بنية تحتية متماسكة وقابلة للتدقيق وسريعة. الاستثمار في الإعداد الجذري يؤتي ثماره منذ اليوم الأول بمجرد انضمام المهندس الثاني إلى الفريق.