بنية HCL وأول الموارد
بنية HCL وأول الموارد
يعتمد Terraform كلياً على لغة HashiCorp للإعداد (HCL) — لغة تصريحية وسهلة القراءة، مُصمَّمة خصيصاً للبنية التحتية. قبل أن تكتب أي كود بنية تحتية ذي معنى، عليك استيعاب ثلاثة مفاهيم أساسية في HCL: الكتل (Blocks)، والوسيطات (Arguments)، والتعبيرات (Expressions). بمجرد فهم هذه المفاهيم، ستحتاج أيضاً إلى إتقان الأوامر الأربعة التي تشكّل سير عمل Terraform الجوهري: init، وplan، وapply، وdestroy. كل إجراء تتخذه في Terraform بالإنتاج هو تنويع على هذه الأساسيات.
الكتل والوسيطات والتعبيرات
كل شيء في ملف HCL هو كتلة (Block). تمتلك الكتلة نوعاً، وصفراً أو أكثر من التسميات، وجسماً محاطاً بقوسين معقوفين. داخل الجسم، تُسند قيماً إلى وسيطات (Arguments) مُسمّاة. يمكن أن تكون هذه القيم سلاسل نصية حرفية، أو أعداداً، أو قيماً منطقية، أو قوائم، أو خرائط، أو تعبيرات (Expressions) كاملة — مراجع لقيم أخرى، أو استدعاءات دوال، أو منطق شرطي.
أنواع الكتل الأساسية التي ستستخدمها يومياً: terraform (قيود الإصدار وإعداد الـ backend)، وprovider (إعداد واجهة API السحابية)، وresource (الإعلان عن كائن بنية تحتية حقيقي)، وdata (قراءة بنية تحتية موجودة)، وvariable (قبول مُدخلات)، وoutput (كشف القيم)، وlocals (الحسابات الوسيطة)، وmodule (استدعاء وحدات قابلة لإعادة الاستخدام).
التعبيرات بالتفصيل
تعبيرات HCL أكثر قوة مما تبدو عليه. يمكنك الإشارة إلى أي سمة مورد، واستدعاء الدوال المدمجة، واستخدام الشرطية، والتكرار بتعبيرات for — كل ذلك داخل قيمة وسيطة.
type.name.attribute. مرجع مورد مثل aws_s3_bucket.app_artifacts.arn يُخبر Terraform بالبحث عن سمة arn لمورد aws_s3_bucket المُسمّى app_artifacts. هذا المرجع يُشفّر أيضاً تبعية ضمنية: لن ينشئ Terraform أي شيء يُشير إلى هذا الـ bucket حتى يتواجد الـ bucket نفسه. فهم هذا هو أساس الترتيب الصحيح للموارد.
سير العمل الجوهري: init، plan، apply، destroy
عمليات Terraform دائماً حتمية ويمكن التنبؤ بها عند اتباع سير العمل الرباعي. هذه ليست مجرد اقتراح — في الإنتاج، يجب ألا تشغّل apply أبداً دون مراجعة plan أولاً.
plan قبل apply؛ لا تتخطَّ هذه الخطوة أبداً في الإنتاج.إليك شرحاً تطبيقياً كاملاً. أنشئ مجلداً، واكتب مورداً أول، وشغّل الأوامر الأربعة:
ما الذي يفعله init فعلياً
ينفّذ terraform init ثلاث مهام: يُحمّل إضافات المزود إلى .terraform/providers/، ويُهيئ الـ backend المُعدّ (محلي بشكل افتراضي — مجرد ملف terraform.tfstate)، ويُثبّت أي مصادر وحدات. يجب إعادة تشغيل init في أي وقت تُغيّر فيه إصدارات المزود، أو تُضيف مزوداً جديداً، أو تُغيّر إعداد الـ backend. ملف .terraform.lock.hcl الذي يُنشئه يُثبّت مجاميع اختبارية دقيقة للمزود — احفظ هذا الملف في Git حتى يستخدم كل عضو في الفريق وكل تشغيل CI إصدارات مزود متطابقة.
terraform apply -auto-approve على خطة محسوبة حديثاً. النمط الصحيح هو: terraform plan -out=tfplan في مرحلة الخطة، احفظ أثر tfplan، ثم terraform apply tfplan في مرحلة التطبيق (محاطة بخطوة موافقة يدوية). هذا يضمن أن ما راجعته في الخطة هو بالضبط ما سيُطبَّق — لا ظروف تسابق إذا تغيّرت البنية التحتية بين المرحلتين.
قراءة ناتج Plan
ناتج plan هو أهم ناتج في كل Terraform. كل مهندس أول يقرأه كلمة بكلمة قبل الموافقة على apply. يُخبرك سطر الملخص بعدد الإجراءات (Plan: 3 to add, 1 to change, 0 to destroy)، لكن كتلة التفاصيل تُخبرك بما يتغيّر على كل سمة. الرمز ~ (تحديث) على سمة مورد آمن؛ أما -/+ (استبدال) فيعني أن المورد سيُحذف ويُعاد إنشاؤه، مما يُسبّب في الغالب توقفاً عن العمل إذا لم تكن حذراً.
-/+ resource "aws_db_instance" "main" (forces replacement)، سيحذف Terraform قاعدة البيانات ويُنشئ واحدة جديدة. البيانات القديمة ستختفي ما لم يكن لديك لقطة (snapshot). عدة تغييرات تفرض الاستبدال على الموارد الحيوية: إعادة تسمية نسخة RDS، أو تغيير إصدار المحرك لكلاستر ElastiCache، أو تعديل subnet_ids لكلاستر EKS. قبل تطبيق أي خطة تحتوي على استبدال، تحقق من وجود نسخة احتياطية وإجراء استعادة مُختبَر. في الإنتاج، استخدم lifecycle { prevent_destroy = true } على الموارد ذات الحالة لجعل Terraform يُصدر خطأً بدلاً من استبدالها بصمت.
اتفاقيات تنظيم الملفات
يقوم Terraform بتحميل جميع ملفات *.tf في المجلد كإعداد واحد. الاتفاقية المجتمعية — وما ستراه في كل وحدة مفتوحة المصدر — هي تقسيم الاهتمامات عبر ملفات مُسمّاة: main.tf للموارد، وvariables.tf لإعلانات المُدخلات، وoutputs.tf لإعلانات المُخرجات، وproviders.tf لكتل المزود و terraform، وlocals.tf لكتل القيم المحلية. لا يُفرض هذا من قِبَل الأداة، لكن مخالفة الاتفاقية ستجعل كودك غير مقروء لكل مبرمج Terraform آخر في فريقك.
في الدرس التالي، ستتعمق في المزودين والإصدارات — كيف يعمل الـ registry، وكيف تُثبّت إصدارات المزود وتُرقّيها بأمان، وكيف تُعدّ نسخاً متعددة من المزود (مناطق AWS متعددة، حسابات متعددة) في وحدة جذر واحدة.