רגע! לפני שהולכים... 👋
אל תפספסו! מסלולי לימוד נפתחים בקרוב - מקומות מוגבלים
| מסלול RT Embedded Linux | 09/11 |
| מסלול Machine Learning | 16/11 |
| מסלול Computer Vision | 16/11 |
| מסלול Full Stack | 16/11 |
| מסלול Cyber | 25/11 |
✓ ייעוץ אישי ללא התחייבות | תשובה תוך 24 שעות

עודכן לאחרונה: 13 אוקטובר, 2026
Terraform: Infrastructure as Code בלב DevOps
Terraform הוא כלי מוביל ל-Infrastructure as Code (IaC) – גישה שבה תשתיות IT (שרתים, רשתות, Kubernetes, מסדי נתונים) מוגדרות כקוד מוצהר שנשמר ב-Git ומבוצע אוטומטית. בתוך תהליך DevOps, Terraform נכנס בשלבי תשתית ואוטומציה – בין CI/CD לבניית סביבות, ומאפשר למהנדסי DevOps להקים, לעדכן ולנהל תשתיות ענן מורכבות בצורה שחזורית ומבוקרת.
למה דווקא Terraform? הוא מבטיח עקביות בין סביבות (אותו קוד = אותה תשתית ב-dev/staging/prod), סקייל לניהול מאות משאבים מרובי עננים, ואוטומציה מלאה שמחליפה לחיצות ידניות בקונסול. מול ניהול ידני ("לחיצות באוויר"), Terraform מביא שקיפות, גרסאות ושיתוף ידע.
Terraform מול כלים אחרים: פשוט יותר מ-AnsiBle (פחות agent-based), מוכוון תשתית יותר מ-Pulumi (לא דורש שפת תכנות), ובעל community ענק יותר מ-Pulumi או CloudFormation. בגובה העיניים – אם אתה ב-DevOps, Terraform הוא ה"שפה המשותפת" שכולם מכירים.
הבסיס של המערכת, כדאי להכיר אותם
Terraform פועל על קבצי קונפיגורציה עם סיומת .tf (או .tf.json), שנכתבים בשפת HCL (HashiCorp Configuration Language) – שפה מוצהרת, קריאה ודומה ל-JSON אך ידידותית יותר למפתחים. הקבצים מגדירים את התשתית הרצויה בצורה declarative: אתה מצהיר "מה" אתה רוצה (למשל, שרת עם 4GB RAM), ו-Terraform דואג "איך" ליישם את זה.
Providers: "מתווכים" שמחברים את Terraform לספקי ענן (כמו AWS, Azure, GCP) או שירותים אחרים. דוגמה: provider "aws" { region = "us-east-1" }.
Resources: המשאבים עצמם – ה"לב" של הקוד. מגדירים VM, רשת או DB: resource "aws_instance" "web" { ami = "ami-123" instance_type = "t3.micro" }.
Data Sources: מאפשרים לשלוף מידע קיים מהתשתית (ללא יצירה), כמו AMI זמין או VPC קיים: data "aws_ami" "latest" { ... }.
Desired State: המצב הרצוי שכתבת בקוד – Terraform משווה אותו למציאות.
Plan: terraform plan מציג preview של שינויים (מה ייווצר/ישתנה/יימחק) בלי לבצע.
Apply: terraform apply מבצע את השינויים בפועל, מעדכן את התשתית.
State File: קובץ terraform.tfstate ששומר את המצב הנוכחי של התשתית (local או remote). חיוני לשינויים עתידיים, ולכן צריך להגן עליו (remote state מומלץ בפרודקשן).
Provider – מתווך שמחבר את Terraform לספק ענן (AWS, Azure, GCP). מגדיר אישורים, אזור ותצורה בסיסית.
Resource – היחידה המרכזית: משאב כמו VM, רשת או DB ש-Terraform יוצר/מנהל בתשתית.
State File – קובץ terraform.tfstate ששומר את המצב הנוכחי של כל המשאבים; חיוני לתכנון שינויים.
Plan – פקודת terraform plan שמציגה preview של שינויים לפני ביצוע (מה ייווצר/ישתנה).
Apply – פקודת terraform apply שבונה/מעדכנת את התשתית לפי הקוד המוצהר.
Terraform פועל בלולאה מובנית של 4 פקודות עיקריות שיוצרות זרימה declarative:
terraform init – אתחול הפרויקט: הורדת providers, מודולים, הגדרת backend ל-state. רץ פעם אחת או אחרי שינויי providers.
terraform plan – תכנון: משווה את הקוד (desired state) למציאות, מציג preview צבעוני של שינויים (+ יצירה, ~ שינוי, - מחיקה).
terraform apply – ביצוע: מממש את התוכנית, מבקש אישור ומעדכן את התשתית + state file.
terraform destroy – הרס: מוחק את כל המשאבים (זהיר! דורש אישור מפורש).
בוקר: git pull, terraform plan לבדיקת drift (שינויים ידניים שקורים לפעמים).
פיתוח: כותבים/משנים .tf, plan מקומי לבדיקה, commit + PR.
CI/CD: pipeline אוטומטי מריץ init/plan בכל push, מייצר plan file כ-artifact.
פרודקשן: approve ב-Slack/UI, pipeline מריץ apply עם locking על state.
תחזוקה: terraform state list לבדיקת משאבים, refresh לעדכון state.
Provider לא מותקן: שכחו init → שגיאה "provider not found".
State קיים ולא תואם: מחקו state ידנית → terraform refresh או import.
הרשאות חסרות: API keys שגויים → apply נכשל באמצע.
Dependencies מעגליים: resource A תלוי ב-B ולהיפך → שינוי סדר/שימוש ב-data sources.
Version drift: שדרגו Terraform → init -upgrade לפני plan.
הורד Terraform מהאתר הרשמי של HashiCorp (בחר גרסה יציבה).
חלץ והוסף ל-PATH: export PATH=$PATH:$HOME/.terraform (Linux/Mac).
בדוק: terraform version – צריך להציג גרסה.
התקן editor תוסף: VS Code + HashiCorp Terraform extension.
צור תיקייה my-first-tf, כתוב 3 קבצים:
main.tf:
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = "us-east-1"
}
resource "aws_instance" "web" {
ami = "ami-0c02fb55956c7d316" # Amazon Linux 2023
instance_type = "t3.micro"
tags = {
Name = "MyFirstTerraformServer"
}
}
variables.tf (אופציונלי):
variable "aws_region" {
default = "us-east-1"
}
outputs.tf:
output "instance_ip" {
value = aws_instance.web.public_ip
}
# 1. אתחול (פעם ראשונה בלבד)
terraform init
# 2. תכנון (תמיד!)
terraform plan
# 3. ביצוע (אישור ידני)
terraform apply
# 4. בדיקת תוצאות
terraform output
# 5. הרס (זהיר!)
terraform destroy
| פקודה | מה עושה | מתי להריץ |
|---|---|---|
init |
הורדת providers, backend setup | פעם ראשונה / שינוי providers |
plan |
Preview שינויים (+ יצירה, ~ שינוי, - מחיקה) | לפני כל apply |
apply |
בונה/מעדכן תשתית | אחרי plan מאושר |
destroy |
מוחק הכל | סיום ניסוי / cleanup |
שגיאה: "provider not found"
פתרון: `terraform init`
שגיאה: "NoCredentialProviders"
פתרון: הגדר AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY
שגיאה: "state already locked"
פתרון: `terraform force-unlock <lock-id>`
תשתית קיימת?
פתרון: `terraform import aws_instance.web i-1234567890abcdef0`
נסה את הדוגמה ב-AWS Free Tier
למד variables + מודולים (terraform-docs ל-documentation)
שדרג ל-remote state (S3 + DynamoDB)
הוסף ל-Git + GitHub Actions pipeline
טיפ זהב: תמיד plan לפני apply. תמיד backup ל-state file!
פרויקט Terraform מאורגן בקבצי .tf נפרדים לאחריות ברורה:
my-terraform-project/
├── main.tf # providers, resources מרכזיים, מודולים
├── variables.tf # משתנים ניתנים להתאמה (region, instance_type)
├── terraform.tfvars # ערכי משתנים לסביבה ספציפית (לא ב-Git!)
├── outputs.tf # פלטים חשובים (IP, ARN, endpoints)
├── versions.tf # required_version, required_providers
└── README.md # תיעוד + `terraform-docs`
דוגמה:
# main.tf
module "vpc" {
source = "./modules/vpc"
cidr_block = var.vpc_cidr
}
# variables.tf
variable "vpc_cidr" {
description = "VPC CIDR block"
type = string
default = "10.0.0.0/16"
}
מודולים הם "חבילות קוד" שניתן לשחזר. השתמש כש:
קוד חוזר (VPC בכל סביבה)
הפרדה לאחריות (רשת, DB, app)
שיתוף בין צוותים/פרויקטים
מתי לא: פרויקט זעיר (<50 שורות).
terraform-org/
├── environments/
│ ├── dev/
│ │ ├── terraform.tfvars (instance_type = "t3.micro")
│ │ └── backend.tf (S3 bucket: dev-terraform-state)
│ ├── stage/
│ └── prod/
├── modules/
│ ├── vpc/
│ ├── ec2/
│ └── rds/
└── global/ # shared resources (DNS, IAM roles)
זרימת עבודה בצוות:
Branch per feature: git checkout -b vpc-ha
Local plan + terraform fmt/validate
PR → CI/CD: plan כ-artifact
Merge → auto-apply (dev) / manual approve (prod)
| מודול | תיאור | דוגמת שימוש |
|---|---|---|
| vpc | Virtual Private Cloud + subnets | module "vpc" { source = "terraform-aws-modules/vpc/aws" } |
| ec2 | EC2 instances + security groups | Auto Scaling Group + Load Balancer |
| rds | Relational Database Service | Multi-AZ PostgreSQL/MySQL |
| eks | Elastic Kubernetes Service | Managed K8s cluster + node groups |
| s3 | S3 buckets + policies | Static website + private data |
| cloudwatch | Monitoring + alarms + dashboards | CPU>80%, error rate, latency |
טיפ זהב: השתמש ב-Terraform Registry למודולים מוכנים (community-tested). תמיד pin גרסאות: version = "~> 3.0".
מהנדסי DevOps משתמשים ב-Terraform להקמת תשתית מלאה מאפס – מרשתות ועד אפליקציה:
VPC (רשת) → Subnets → Security Groups →
EC2/RDS (שרתים+DB) → Load Balancer → Auto Scaling
דוגמה פשוטה (main.tf):
module "vpc" { source = "terraform-aws-modules/vpc/aws" version = "~> 5.0" }
module "web_servers" {
source = "terraform-aws-modules/ec2-instance/aws"
instances = 2
}
module "db" { source = "terraform-aws-modules/rds/aws" }
Kubernetes: EKS/GKE/AKS cluster + node groups + IRSA (IAM Roles for Service Accounts)
Serverless: Lambda functions + API Gateway + DynamoDB/EventBridge
ניטור: CloudWatch/Grafana dashboards, alarms על CPU>80%, error rate
דוגמה K8s:
module "eks" {
source = "terraform-aws-modules/eks/aws"
cluster_name = "my-cluster"
cluster_version = "1.30"
}
| סטאק | רכיבים עיקריים | מתאים ל... |
|---|---|---|
| Web App בסיסי | VPC + ALB + EC2 ASG + RDS | אפליקציות מסורתיות |
| Stateless Microservices | EKS + ALB Ingress + RDS Aurora | K8s מודרני |
| Serverless API | API Gateway + Lambda + DynamoDB + S3 | APIs ללא שרתים |
1. EKS Production Stack
├── VPC (public/private subnets)
├── EKS Control Plane (3 AZs)
├── Managed Node Groups (Spot + On-Demand)
├── RDS Aurora PostgreSQL (Multi-AZ)
└── CloudWatch Container Insights
2. Data Lake Stack
├── S3 Data Lake Buckets
├── Glue Crawlers + Catalog
├── Athena Workgroups
├── Lambda ETL Jobs
└── QuickSight Dashboards
1. GKE Autopilot Stack
├── VPC (Shared VPC)
├── GKE Autopilot Cluster
├── Cloud SQL PostgreSQL HA
├── Cloud Load Balancing
└── Cloud Monitoring + Logging
2. BigQuery Data Warehouse
├── BigQuery Datasets + Views
├── Cloud Storage Staging
├── Cloud Functions Pipelines
├── Cloud Composer (Airflow)
└── Data Catalog
טיפ DevOps: התחל עם terraform-aws-modules/vpc/aws ו-terraform-aws-modules/eks/aws – מודולים בוגרים ומבדוקים. כל סטאק צריך remote state + workspaces לסביבות שונות.
Terraform משתלב ב-CI/CD כשלב Infrastructure Pipeline נפרד (או בתוך app pipeline), עם זרימה אוטומטית:
Git Push → CI: fmt/validate/plan → Artifact →
Manual Approve (prod) → CD: apply → Slack notify
דוגמה GitHub Actions (terraform-plan.yml):
jobs:
plan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: hashicorp/setup-terraform@v3
- run: terraform init
- run: terraform fmt -check
- run: terraform validate
- run: terraform plan -out=tfplan
- uses: actions/upload-artifact@v4
with: { name: tfplan, path: tfplan }
| שלב CI | פקודה | תוצאה |
|---|---|---|
| Format | terraform fmt -check |
בודק פורמט, block ב-PR |
| Validate | terraform validate |
syntax + dependencies |
| Security | tfsec / checkov |
סריקת אבטחה (open ports) |
| Plan | terraform plan -out=tfplan |
artifact ל-review |
| CD Apply | terraform apply tfplan |
רק אחרי approve |
דוגמה CD:
apply:
needs: plan
if: github.ref == 'refs/heads/main'
permissions: write-all
steps:
- run: terraform apply -auto-approve tfplan
GitOps = Infrastructure as Code + Git as Source of Truth:
כל שינוי .tf → PR → CI plan ב-comment
Merge → auto-deploy ל-dev
Prod: manual approve ב-Slack/Teams + audit log
Drift Detection: cron job יומי plan → alert אם שינויים ידניים
כלים מומלצים:
- GitHub Actions / GitLab CI / Jenkins
- Atlantis / Terragrunt (multi-env)
- Terraform Cloud / Spacelift (enterprise)
- Backstage (self-service portal)
טיפ זהב: עולם ללא terraform apply ידני. הכל דרך PRs + auto-plan. State ב-remote (S3+DynamoDB) עם locking. Prod דורש 2 approvals מינימום.
Terraform הופך תשתית מ"אמנות ידנית" ל"תהליך תוכנה" – בדיוק כמו CI/CD לאפליקציות. ההיגיון המרכזי הוא שליטה, בטיחות ושקיפות:
במקום apply מקומי שמישהו מריץ מחשב הנייד:
PR → CI plan → comment עם preview → merge → auto-deploy.
אין "לחיצות בקונסול" בפרודקשן – הכל מתועד ומאושר.
fmt → validate → security scan (tfsec) → plan
אם משהו נשבר – PR נחסם. אין deploy מלוכלך לפרודקשן.
State ב-S3/DynamoDB – לא בלוקאלי של מישהו
Locking: שני מהנדסים לא יכולים apply בו זמנית
Drift Detection: cron יומי שמתריע על שינויים ידניים
dev: auto-apply בכל merge
stage: manual approve
prod: 2 approvals + Slack notification
כל שינוי מתועד ב-Git + CI logs – אפשר לבדוק "מי שינה מה ומתי".
100 מהנדסים לא יכולים לנהל תשתית ידנית
Pipeline מטפל ב-עשרות סביבות במקביל
Rollback פשוט: revert commit → auto-rollback תשתית
במילים פשוטות: Terraform ב-CI/CD הופך תשתית מ"מי יודע מה קורה פה" ל"תהליך תוכנה עם בדיקות, review ושליטה". זה DevOps אמיתי – לא רק buzzword, להרחבה, ראו את המדריך של Spacelift על Terraform ב-CI/CD
Local state (terraform.tfstate): קובץ מקומי שמתעדכן אחרי כל apply. מתאים לניסויים ולפרויקטים אישיים, אבל מסוכן בצוותים – ניתן למחוק אותו בטעות, ואין הגנה מפני apply מקבילי.
Remote state: שמירה בענן (S3 + DynamoDB ב-AWS, GCS ב-GCP, Terraform Cloud). חובה בפרודקשן כי הוא תומך versioning, encryption וגיבויים אוטומטיים.
דוגמת הגדרת backend (versions.tf):
terraform {
backend "s3" {
bucket = "prod-terraform-state"
key = "env/dev/vpc.tfstate"
region = "us-east-1"
dynamodb_table = "terraform-state-locks"
}
}
רץ terraform init אחרי הוספת backend כדי להעביר state.
Locking: מנגנון מובנה שמונע שני apply בו-זמנית. Remote backends (כמו S3 + DynamoDB) מספקים lock אוטומטי – אם מישהו ננעל, CI/CD יחכה או יתריע.
הרשאות: הגדר least privilege ב-IAM roles – provider מקבל רק ec2:Describe*, ec2:Create* (לא ec2:Terminate*).
אבטחת state:
הצפנה (SSE-KMS/SSE-S3)
Bucket policy: private בלבד, MFA delete
גישה דרך IAM roles (לא access keys בקוד)
פרויקט גדול = מבנה מודולרי עם הפרדה ברורה:
terraform-project/
├── environments/
│ ├── dev/terraform.tfvars
│ └── prod/terraform.tfvars
├── modules/
│ ├── vpc/ # רק רשתות
│ ├── app-servers/ # רק EC2/ASG
│ └── database/ # רק RDS
└── shared/ # IAM roles גלובליים
Naming conventions:
resource "aws_vpc" "prod_app_vpc" { ... } # env + service + resource
module "dev_vpc_eu_west_1" { ... } # env + module + region
variable "instance_type" { default = "t3.micro" } # תיאורי ברור
עקרון: 1 מודול = 1 אחריות. מקסימום 200 שורות לקובץ. השתמש ב-terraform-docs ליצירת README אוטומטי.
טיפ זהב: מעבר ל-remote state הוא הצעד החשוב ביותר. תמיד terraform plan לפני apply. Pin גרסאות: version = "~> 5.0".
הסימפטום: terraform plan חושב שכל התשתית צריכה להימחק.
למה קורה: מישהו מחק terraform.tfstate או שכח לגבות.
פתרון מונע:
Remote state תמיד (S3 + DynamoDB) עם versioning
גיבוי יומי של state file
terraform state pull > backup.tfstate לפני שינויים גדולים
הסימפטום: Error: Error locking state: ... already locked
למה קורה: CI/CD נתקע באמצע apply, lock לא שוחרר.
פתרון מיידי: terraform force-unlock <lock-id>
פתרון מונע: Timeout קצר ב-CI/CD (10 דקות), monitoring על locks
הסימפטום: terraform plan מראה מחיקות/שינויים לא צפויים.
למה קורה: מישהו שינה AMI/EC2 type דרך קונסול.
פתרון:
# Drift detection יומי
terraform plan -detailed-exitcode > /dev/null
if [ $? -eq 2 ]; then echo "Drift detected!"; fi
מדיניות: "אסור לשנות קונסול, רק דרך Terraform"
הסימפטום: apply תקוע לנצח, cycle error.
למה קורה: VPC תלוי ב-Security Group ולהיפך.
פתרון:
# במקום circular dep
data "aws_security_group" "existing" { ... }
# או explicit depends_on
resource "aws_instance" "web" {
depends_on = [aws_security_group.sg]
}
הסימפטום: AWS keys חשופים ב-GitHub.
פתרון:
variable "db_password" { sensitive = true }
# ב-terraform.tfvars (לא commit!)
db_password = "supersecret123"
כלים: git-secrets, truffleHog ב-CI
הסימפטום: הפתעות בפרודקשן (שרתים נמחקים).
פתרון מונע:
# GitHub Actions - plan חובה
- run: terraform plan -out=tfplan
- uses: actions/upload-artifact@v4
- run: terraform apply tfplan # רק אחרי approve
הסימפטום: terraform init שובר תאימות.
פתרון:
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.40.0" # Pin גרסאות!
}
}
required_version = ">= 1.5.0"
}
הסימפטום: קשה לתחזק, אי אפשר להבין מה קורה.
פתרון: מבנה מודולרי:
modules/
├── vpc/
├── app/
├── db/
└── monitoring/
| טעות קלאסית | תוצאה | מניעה |
|---|---|---|
| Local state בצוות | Apply מקבילי | Remote state + locking |
| Apply בלי plan | שרתים נמחקים | CI/CD policy |
| Drift ידני | Plan מלוכלך | Drift detection cron |
| Secrets ב-Git | חשבון פרוץ | sensitive vars + scans |
טיפ זהב: terraform plan -destroy פעם בחודש לבדיקת destroy בטוח. terrascan ל-security. תמיד backup state.
מה ההבדל בין Terraform ל-Ansible?
Terraform מקים תשתית: שרתים, רשתות, מסדי נתונים. Ansible מגדיר את מה שרץ על השרתים: התקנות, קבצי תצורה, שירותים. Terraform עובד בגישה מוצהרת ושומר state. Ansible מריץ משימות לפי סדר, ולא דורש סוכן על השרתים. בארגונים רבים משתמשים בשניהם יחד: Terraform מקים, Ansible מגדיר.
האם Terraform חינמי?
כן, לשימוש רגיל. מאז 2023 הוא מופץ תחת רישיון BSL, ולא כקוד פתוח מלא. הרישיון מגביל בעיקר חברות שמוכרות שירות מתחרה. לארגון שמשתמש בו לתשתית שלו, אין עלות. מי שמעדיף קוד פתוח מלא יכול להשתמש ב-OpenTofu, גרסה קהילתית תואמת.
האם Terraform עובד רק עם AWS?
לא. Terraform עובד עם מאות ספקים דרך Providers. ביניהם AWS, Azure, Google Cloud, Kubernetes, Cloudflare ו-GitHub. אפשר לנהל כמה עננים באותו פרויקט, עם אותה שפה.
מה זה State File ולמה לא לשמור אותו מקומית?
ה-State File הוא קובץ שבו Terraform זוכר מה הוא כבר הקים. בלעדיו, הוא לא יודע מה קיים בענן. שמירה מקומית מסוכנת בצוות: הקובץ עלול להימחק, ושני אנשים עלולים לשנות תשתית בו זמנית. לכן בפרודקשן שומרים אותו מרחוק, למשל ב-S3, עם נעילה וגיבוי.
כמה זמן לוקח ללמוד Terraform?
את הבסיס אפשר ללמוד תוך כמה שבועות של תרגול. זה כולל HCL, הפקודות המרכזיות ופרויקט ראשון בענן. שליטה במודולים, remote state ו-CI/CD לוקחת כמה חודשים. כדאי להגיע עם היכרות בסיסית עם לינוקס, רשתות וענן.