كلاود
أدلة

Terraform: أتمتة البنية التحتية ككود

كلاود|١٩ أبريل ٢٠٢٦|4 دقائق قراءة|٢٤٥ مشاهدة
Terraform: أتمتة البنية التحتية ككود

سيرفرات + شبكات + DNS = ملف كود واحد. Terraform يبني ويهدم بنيتك بأمر. نشرح الأساسيات والبداية.

أتمتة البنية التحتية مع Terraform

Terraform يحوّل البنية التحتية من مهمة يدوية لـ "كود". بدل النقر في لوحة التحكم لإنشاء كل سيرفر، تكتب ملف نصي وينشئ Terraform كل شيء تلقائياً — ويمكنك إعادة إنشائه في أي وقت بنفس الإعدادات.

المبدأ: Infrastructure as Code

المشكلة القديمة:
├── مطور A ينشئ سيرفر بطريقة
├── مطور B ينشئ سيرفر بطريقة مختلفة
├── لا أحد يتذكر الإعدادات الدقيقة
└── كل مرة تبدأ من الصفر

مع Terraform:
├── ملف واحد يصف البنية التحتية بالكامل
├── git commit = سجل كامل للتغييرات
├── terraform apply = إنشاء بيئة مطابقة في دقائق
└── يعمل على أي مزود سحابي

المفاهيم الأساسية

Providers، Resources، State

# Provider - يخبر Terraform بأي سحابة تعمل
terraform {
 required_providers {
 aws = {
 source = "hashicorp/aws"
 version = "~> 5.0"
 }
 # أو استضافة أوروبية, مزود أجنبي, مزود أجنبي...
 }
}

# Resource - الموارد التي تريد إنشاءها
resource "aws_instance" "web_server" {
 ami = "ami-0c55b159cbfafe1f0"
 instance_type = "t3.medium"
 
 tags = {
 Name = "web-server"
 Environment = "production"
 }
}

مثال عملي: بيئة ويب كاملة

# main.tf
# هذا المثال يصف خادم + قاعدة بيانات + Load Balancer

# --- Variables ---
variable "server_count" {
 description = "عدد خوادم التطبيق"
 type = number
 default = 2
}

variable "environment" {
 description = "بيئة النشر"
 type = string
 default = "production"
}

# --- Network ---
resource "aws_vpc" "main" {
 cidr_block = "10.0.0.0/16"
 
 tags = {
 Name = "${var.environment}-vpc"
 }
}

resource "aws_subnet" "public" {
 count = 2
 vpc_id = aws_vpc.main.id
 cidr_block = "10.0.${count.index}.0/24"
 availability_zone = data.aws_availability_zones.available.names[count.index]
}

# --- Security Groups ---
resource "aws_security_group" "web" {
 name = "${var.environment}-web-sg"
 vpc_id = aws_vpc.main.id
 
 ingress {
 from_port = 80
 to_port = 80
 protocol = "tcp"
 cidr_blocks = ["0.0.0.0/0"]
 }
 
 ingress {
 from_port = 443
 to_port = 443
 protocol = "tcp"
 cidr_blocks = ["0.0.0.0/0"]
 }
 
 egress {
 from_port = 0
 to_port = 0
 protocol = "-1"
 cidr_blocks = ["0.0.0.0/0"]
 }
}

# --- App Servers ---
resource "aws_instance" "app" {
 count = var.server_count
 ami = "ami-0c55b159cbfafe1f0"
 instance_type = "t3.xlarge" # 4 vCPU / 16 GB
 subnet_id = aws_subnet.public[count.index % 2].id
 
 user_data = <<-EOF
 #!/bin/bash
 apt update
 apt install -y nginx php8.3-fpm
 systemctl start nginx php8.3-fpm
 EOF
 
 tags = {
 Name = "${var.environment}-app-${count.index + 1}"
 }
}

الأوامر الأساسية

# تهيئة Terraform (تحميل الـ providers)
terraform init

# معاينة التغييرات قبل التطبيق
terraform plan

# تطبيق التغييرات
terraform apply

# إزالة كل الموارد (خطير — فقط في بيئة التطوير)
terraform destroy

# عرض حالة البنية التحتية الحالية
terraform show

# قائمة الموارد المُدارة
terraform state list

إدارة المتغيرات والأسرار

# variables.tf
variable "db_password" {
 description = "كلمة مرور قاعدة البيانات"
 type = string
 sensitive = true # لا يُظهرها في logs
}

variable "api_key" {
 description = "مفتاح API للمزود"
 type = string
 sensitive = true
}
# تمرير القيم عبر ملف .tfvars (لا ترفعه لـ git)
# terraform.tfvars
db_password = "SuperSecretPassword123!"
api_key = "your-provider-api-key"

# أو عبر Environment Variables
export TF_VAR_db_password="SuperSecretPassword123!"
terraform apply

Modules: إعادة استخدام الكود

# modules/web-server/main.tf
# Module قابل للإعادة لإنشاء خادم ويب

resource "aws_instance" "this" {
 ami = var.ami_id
 instance_type = var.instance_type
 
 tags = {
 Name = var.server_name
 }
}

output "public_ip" {
 value = aws_instance.this.public_ip
}
# main.tf — استخدام الـ module
module "web_server_1" {
 source = "./modules/web-server"
 server_name = "web-1"
 instance_type = "t3.large"
 ami_id = "ami-0c55b159cbfafe1f0"
}

module "web_server_2" {
 source = "./modules/web-server"
 server_name = "web-2"
 instance_type = "t3.large"
 ami_id = "ami-0c55b159cbfafe1f0"
}

Terraform State في بيئة الفريق

# backend.tf — تخزين الـ state في S3 أو Terraform Cloud
terraform {
 backend "s3" {
 bucket = "company-terraform-state"
 key = "production/terraform.tfstate"
 region = "eu-west-1"
 
 # منع التعديل المتزامن
 dynamodb_table = "terraform-locks"
 encrypt = true
 }
}

الخلاصة

Terraform يحوّل "كيف أنشأنا هذا السيرفر؟" من سؤال بلا إجابة لملف نصي واضح في git. كلاود (cloud.net.sa) توفر API وموارد قابلة للإدارة عبر أدوات Infrastructure as Code — تواصل معنا لمعرفة تفاصيل التكامل.


ابدأ الآن

جاهز تبني مشروعك؟ اختر خادمك السحابي بالمواصفات اللي يحتاجها تطبيقك، أو راجع الباقات والأسعار.

مشاركة