المستوى: متوسط. الشرح يفترض إنك تعرف يعني إيه سيرفر و SSH، لكن معملتش Infrastructure as Code قبل كده. الافتراض كمان إن بنيتك على مزوّد سحابي بيدعمه Terraform (AWS أو GCP أو Azure أو DigitalOcean) وإن عندك أقل من بضع مئات من الموارد.
البنية التحتية ككود: يعني إيه، وليه Terraform؟
لو بتظبط كل سيرفر بإيدك من كونسول المزوّد، إنت بتضيّع وقت وبتراكم أخطاء متنسهاش. الكلام اللي جاي هيخلّيك تكتب بنيتك مرة واحدة في ملف نصّي، وتعيد إنشاءها بنفس النتيجة بالظبط في أقل من دقيقتين.
المشكلة باختصار
الضبط اليدوي بيفشل في حاجتين: التكرار والتوثيق. لو حبيت تعمل بيئة staging مطابقة للـ production، هتفضل تدوّس أزرار في الكونسول وتنسى إعداد أو اتنين. وبعد 6 شهور محدش هيفتكر ليه الـ security group مفتوح على بورت معيّن. النتيجة: بيئات مختلفة بشكل غامض، و«بيشتغل عندي مش عندك».
مثال يقرّب الفكرة
تخيّل إنك بتفرش شقة. الطريقة اليدوية: تروح المحل، تختار كل قطعة، وتركّبها بإيدك. لو حبيت تفرش شقة تانية بالظبط زيها، هتعيد كل الخطوات من الأول، وأكيد هتنسى تفصيلة. الطريقة التانية: تكتب «قايمة تجهيز» فيها كل قطعة ومكانها، وتدّي القايمة لشركة تفرشلك أي عدد شقق متطابقة. لو غيّرت سطر في القايمة، الفرش يتعدّل من غير ما تلمس حاجة بإيدك.
الـ Infrastructure as Code هي «القايمة» دي، بس للسيرفرات والشبكات وقواعد البيانات.
التعريف العلمي
الـ Infrastructure as Code هي وصف موارد البنية التحتية في ملفات نصّية تُدار بنظام إصدارات (زي Git)، بحيث تبقى البنية قابلة للمراجعة والتكرار والتراجع. Terraform أداة مفتوحة من HashiCorp بتقرأ الملفات دي وتخلّي الواقع مطابق للمطلوب. هي تصريحية (declarative): إنت بتوصف «الحالة النهائية» اللي عايزها، وهي بتحسب الخطوات اللازمة توصلها، مش إنت اللي بتكتب الخطوات.
مثال تنفيذي: 3 سيرفرات في ملف واحد
الملف ده بيوصف مزوّد AWS وثلاث نسخ EC2 متطابقة. احفظه باسم main.tf.
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = "eu-central-1"
}
resource "aws_instance" "web" {
count = 3
ami = "ami-0abc12345example"
instance_type = "t3.micro"
tags = {
Name = "web-${count.index}"
}
}
بعدها تشغّل ثلاث أوامر بالترتيب:
# 1) تنزيل المزوّد وتجهيز المجلد
terraform init
# 2) معاينة اللي هيحصل — من غير ما يلمس أي مورد
terraform plan
# 3) تنفيذ التغييرات فعليًا على السحابة
terraform apply