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

سيرفرات + شبكات + 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 — تواصل معنا لمعرفة تفاصيل التكامل.
ابدأ الآن
جاهز تبني مشروعك؟ اختر خادمك السحابي بالمواصفات اللي يحتاجها تطبيقك، أو راجع الباقات والأسعار.
مشاركة
