تخطَّ إلى المحتوى

دليل Terragrunt السريع

دليل Terragrunt السريع

التثبيت

منصةأمر
macOS (Homebrew)brew install terragrunt
Linux (Binary)wget https://github.com/gruntwork-io/terragrunt/releases/download/v0.54.0/terragrunt_linux_amd64 && chmod +x terragrunt_linux_amd64 && sudo mv terragrunt_linux_amd64 /usr/local/bin/terragrunt
Windows (Chocolatey)choco install terragrunt
Windows (Scoop)scoop install terragrunt
Dockerdocker pull alpine/terragrunt:latest
Version Manager (tgenv)git clone https://github.com/cunymatthieu/tgenv.git ~/.tgenv && tgenv install latest
From Source (Go 1.21+)git clone https://github.com/gruntwork-io/terragrunt.git && cd terragrunt && go install
Verify Installationterragrunt --version

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

أمروصف
terragrunt initقم بتهيئة Terraform مع تكوين الخلفية المُدار تلقائيًا
terragrunt planقم بإنشاء وعرض خطة التنفيذ للتغييرات البنية التحتية
terragrunt applyقم بتطبيق التغييرات على البنية التحتية (مع طلب التأكيد)
terragrunt apply -auto-approveتطبيق التغييرات دون تأكيد تفاعلي
terragrunt destroyتدمير جميع موارد البنية التحتية المُدارة
terragrunt destroy -auto-approveتدمير الموارد بدون مطالبة تأكيد
terragrunt validateتحقق من صحة بناء جملة تكوين Terragrunt و Terraform
terragrunt fmtقم بتنسيق ملفات تكوين Terraform إلى النمط القانوني
terragrunt fmt -recursiveRecursively format all .tf files in subdirectories
terragrunt outputعرض جميع قيم المخرجات من الحالة
terragrunt output <name>Display specific output value (e.g., terragrunt output vpc_id)
terragrunt output -jsonعرض المخرجات بتنسيق JSON للتحليل
terragrunt showعرض الحالة الحالية أو الخطة المحفوظة بتنسيق يمكن قراءته بواسطة الإنسان
terragrunt consoleافتح وحدة التحكم التفاعلية لاختبار التعبيرات
terragrunt refreshقم بتحديث ملف الحالة مع الحالة الفعلية للبنية التحتية
terragrunt state listقم بسرد جميع الموارد المتتبعة في ملف الحالة
terragrunt state show <resource>عرض معلومات الحالة التفصيلية للمورد المحدد
terragrunt workspace listقائمة جميع مساحات العمل المتاحة
terragrunt workspace select <name>التبديل إلى مساحة العمل المحددة
terragrunt workspace new <name>إنشاء والتبديل إلى مساحة عمل جديدة

الاستخدام المتقدم

أمروصف
terragrunt run-all planنفذ الخطة عبر جميع الوحدات حسب ترتيب الاعتمادية
terragrunt run-all applyقم بتطبيق التغييرات على جميع الوحدات مع مراعاة التبعيات
terragrunt run-all destroyدمر جميع الوحدات بترتيب التبعية العكسي
terragrunt run-all initقم بتهيئة جميع الوحدات في شجرة الدليل
terragrunt run-all validateتحقق من جميع إعدادات الوحدة
terragrunt run-all outputعرض المخرجات من جميع الوحدات
terragrunt graph-dependenciesإنشاء وعرض مخطط اعتماديات الوحدة
terragrunt render-jsonقم بتحويل التكوين النهائي إلى JSON للفحص
terragrunt hclfmtFormat terragrunt.hcl configuration files
terragrunt state mv <source> <dest>نقل المورد إلى عنوان مختلف في الحالة
terragrunt state rm <resource>قم بإزالة المورد من الحالة دون تدميره
terragrunt import <address> <id>استيراد البنية التحتية الموجودة إلى حالة Terraform
terragrunt taint <resource>علّم المورد للترفيه عند التطبيق التالي
terragrunt untaint <resource>إزالة علامة التلوث من المورد
terragrunt plan -out=tfplanاحفظ خطة التنفيذ في ملف للتطبيق لاحقًا
terragrunt apply tfplanتطبيق ملف الخطة المحفوظ مسبقًا
terragrunt plan --terragrunt-log-level debugقم بتشغيل الخطة مع تسجيل تفصيلي للتصحيح
terragrunt run-all apply --terragrunt-parallelism 3قيّد تنفيذ الوحدات المتوازية إلى 3 عمليات متزامنة
terragrunt apply --terragrunt-source ../local-moduleتجاوز مصدر الوحدة للتطوير/الاختبار المحلي
terragrunt run-all apply --terragrunt-include-dir vpcنفّذ فقط على مجلدات وحدات محددة
terragrunt run-all apply --terragrunt-exclude-dir legacyاستبعاد دلائل محددة من التنفيذ
terragrunt apply --terragrunt-include-external-dependenciesقم بتضمين التبعيات الخارجية في التنفيذ
terragrunt init -reconfigureإعادة تكوين backend، مع تجاهل التكوين الحالي
terragrunt init -upgradeقم بترقية إضافات المزود إلى أحدث الإصدارات المسموح بها
terragrunt state pull > terraform.tfstateقم بتنزيل وحفظ الحالة البعيدة محليًا

الإعدادات

الهيكل الأساسي لـ terragrunt.hcl

# Include root configuration
include "root" {
  path = find_in_parent_folders()
}

# Configure Terraform source
terraform {
  source = "git::https://github.com/org/terraform-modules.git//vpc?ref=v1.0.0"
}

# Define inputs (variables)
inputs = {
  environment    = "production"
  vpc_cidr       = "10.0.0.0/16"
  instance_type  = "t3.medium"
}

إعداد الحالة البعيدة (الجذر terragrunt.hcl)

# Configure remote state backend
remote_state {
  backend = "s3"
  
  generate = {
    path      = "backend.tf"
    if_exists = "overwrite_terragrunt"
  }
  
  config = {
    bucket         = "my-terraform-state-${get_aws_account_id()}"
    key            = "${path_relative_to_include()}/terraform.tfstate"
    region         = "us-east-1"
    encrypt        = true
    dynamodb_table = "terraform-locks"
  }
}

إعداد التبعيات

# Define dependencies between modules
dependency "vpc" {
  config_path = "../vpc"
  
  # Mock outputs for validation without dependencies applied
  mock_outputs = {
    vpc_id = "vpc-temporary-id"
  }
  
  mock_outputs_allowed_terraform_commands = ["validate", "plan"]
}

# Use dependency outputs
inputs = {
  vpc_id = dependency.vpc.outputs.vpc_id
  subnet_ids = dependency.vpc.outputs.private_subnet_ids
}

توليد إعدادات المزود

# Auto-generate provider configuration
generate "provider" {
  path      = "provider.tf"
  if_exists = "overwrite_terragrunt"
  
  contents = <<EOF
provider "aws" {
  region = "us-east-1"
  
  default_tags {
    tags = {
      Environment = "${local.environment}"
      ManagedBy   = "Terragrunt"
    }
  }
}
EOF
}

المحليات والدوال

# Define local variables
locals {
  environment = "production"
  region      = "us-east-1"
  
  # Parse environment from path
  parsed_path = regex(".*/environments/(?P<env>.*?)/.*", get_terragrunt_dir())
  env_name    = local.parsed_path.env
  
  # Common tags
  common_tags = {
    Environment = local.environment
    ManagedBy   = "Terragrunt"
    Project     = "MyProject"
  }
}

# Use locals in inputs
inputs = merge(
  local.common_tags,
  {
    region = local.region
  }
)

إعدادات الخطافات

# Execute commands before/after Terraform operations
terraform {
  before_hook "before_init" {
    commands = ["init"]
    execute  = ["echo", "Initializing Terraform..."]
  }
  
  after_hook "after_apply" {
    commands     = ["apply"]
    execute      = ["./scripts/notify-slack.sh"]
    run_on_error = false
  }
}

حالات الاستخدام الشائعة

حالة الاستخدام 1: إعداد البنية التحتية متعددة البيئات

# Directory structure:
# └── environments/
#     ├── terragrunt.hcl (root config)
#     ├── dev/
#     │   ├── vpc/terragrunt.hcl
#     │   └── app/terragrunt.hcl
#     └── prod/
#         ├── vpc/terragrunt.hcl
#         └── app/terragrunt.hcl

# Deploy entire dev environment
cd environments/dev
terragrunt run-all apply

# Deploy only VPC in production
cd environments/prod/vpc
terragrunt apply

# Plan all production changes
cd environments/prod
terragrunt run-all plan

حالة الاستخدام 2: إدارة تبعيات الوحدات

# In app/terragrunt.hcl, reference VPC dependency:
# dependency "vpc" {
#   config_path = "../vpc"
# }

# Apply app module (automatically applies VPC first if needed)
cd environments/dev/app
terragrunt apply --terragrunt-include-external-dependencies

# View dependency graph
cd environments/dev
terragrunt graph-dependencies | dot -Tpng > dependencies.png

حالة الاستخدام 3: تطوير الوحدات المحلية

# Override module source to test local changes
cd environments/dev/vpc
terragrunt plan --terragrunt-source ../../../modules/vpc-local

# Apply with local module
terragrunt apply --terragrunt-source ../../../modules/vpc-local

# Reset to remote source
terragrunt plan --terragrunt-source-update

حالة الاستخدام 4: إدارة الحالة والترحيل

# List all resources in state
terragrunt state list

# Move resource to new address
terragrunt state mv aws_instance.old aws_instance.new

# Import existing AWS resource
terragrunt import aws_instance.web i-1234567890abcdef0

# Remove resource from state (keeps actual resource)
terragrunt state rm aws_instance.temporary

# Pull remote state for inspection
terragrunt state pull > backup.tfstate

حالة الاستخدام 5: التصحيح واستكشاف الأخطاء

# Enable debug logging
export TERRAGRUNT_LOG_LEVEL=debug
terragrunt plan

# Run with trace-level logging
terragrunt apply --terragrunt-log-level trace 2>&1 | tee debug.log

# Validate all configurations
terragrunt run-all validate

# Check formatting issues
terragrunt hclfmt --terragrunt-check

# Test configuration rendering
terragrunt render-json | jq '.'

أفضل الممارسات

  • استخدم مبدأ DRY: احتفظ بإعداد الخلفية في الجذرterragrunt.hclوقم بتضمينه في الوحدات الفرعية باستخدامincludeكتل لتجنب التكرار
  • قم بإصدار وحداتك: قم دائمًا بتثبيت مصادر الوحدات على إصدارات أو علامات محددة (مثل?ref=v1.0.0) لضمان نشر قابل للتكرار
  • نفذ إدارة التبعيات: استخدمdependencyكتل لتحديد العلاقات بين الوحدات بشكل صريح بدلاً من الاعتماد على ترتيب التنفيذ اليدوي
  • استفد من المحليات والدوال: استخدم الدوال المدمجة في Terragrunt مثلfind_in_parent_folders(), get_aws_account_id(), and path_relative_to_include() for dynamic configuration
  • Use mock outputs: Define mock_outputs in dependency blocks to enable validation and planning without requiring all dependencies to be applied first
  • Organize by environment: Structure directories by environment (dev/staging/prod) with shared configuration at the root level for consistency
  • Enable state locking: Always configure DynamoDB tables for state locking when using S3 backend to prevent concurrent modification conflicts
  • Use run-all carefully: Test with run-all plan before run-all apply and consider using --terragrunt-parallelism to control concurrent executions
  • Generate provider configs: Use generate blocks to create provider configurations dynamically, ensuring consistency across modules
  • Implement hooks for automation: Use before_hook and after_hook to automate tasks like validation, notifications, or compliance checks

Troubleshooting

مشكلةحل
Error: “No Terraform configuration files”Ensure terraform.source is correctly specified in terragrunt.hcl and the source path exists. Run terragrunt init to download modules.
Backend initialization failsCheck AWS credentials and permissions. Verify S3 bucket and DynamoDB table exist or set skip_bucket_creation = false in remote_state config.
Dependency outputs not foundEnsure dependency module is applied first. Use mock_outputs for planning without dependencies. Check config_path points to correct directory.
”Working directory already exists” errorClear Terragrunt cache: rm -rf .terragrunt-cache then run terragrunt init again. Or use --terragrunt-source-update flag.
Module source not updatingForce source update with terragrunt init --terragrunt-source-update or delete .terragrunt-cache directory to clear cached modules.
State lock acquisition timeoutعملية أخرى تحتفظ بالقفل. انتظر الإكمال أو قم بإطلاق القفل يدويًا في جدول DynamoDB. تحقق من العمليات المتعطلة.
”Module not found” with relative pathsUse find_in_parent_folders() to locate root config. Ensure relative paths account for Terragrunt’s working directory structure.
Run-all commands fail partiallyCheck individual module errors with --terragrunt-log-level debug. Verify dependencies are correctly defined. Use --terragrunt-ignore-dependency-errors cautiously.
Permission denied errors on AWSVerify IAM role/user has required permissions. Check if role_arn in provider config is correct. Ensure MFA token is valid if required.
Circular dependency detectedReview dependency blocks to identify circular references. Restructure modules to break the cycle. Use terragrunt graph-dependencies to visualize.
Variables not being passed correctlyCheck inputs block syntax in terragrunt.hcl. Verify variable names match module definitions. Use terragrunt render-json to inspect final config.
Performance issues with many modulesAdjust --terragrunt-parallelism to optimize concurrent executions. Consider splitting into smaller module groups. Use --terragrunt-include-dir for selective runs.

Quick Reference: Terragrunt vs Terraform Commands

أمر TerragruntTerraform مكافئالفرق الرئيسي
terragrunt initterraform initAuto-configures backend from terragrunt.hcl
terragrunt planterraform planيتضمن مدخلات واعتمادات يديرها Terragrunt
terragrunt applyterraform applyيعالج التبعيات ويولد التكوينات
terragrunt run-all applyI apologize, but there is no text provided to translate. Could you please share the specific English text you would like me to translate to Arabic?يُنفّذ عبر وحدات متعددة مع ترتيب الاعتمادية
terragrunt outputterraform outputيمكن تجميع المخرجات من وحدات متعددة