نحوه ساخت یک ماژول سفارشی در Terraform

مقدمه

ماژول‌های Terraform به شما اجازه می‌دهند منابع مختلف زیرساخت‌تان را در قالب یک واحد یکپارچه گروه‌بندی کنید. این ماژول‌ها قابل استفاده مجدد هستند و می‌توانید آن‌ها را با تنظیمات دلخواه (customization) دوباره به‌کار ببرید، بدون اینکه هر بار همه منابع را از ابتدا تعریف کنید. این موضوع مخصوصاً در پروژه‌های بزرگ و پیچیده بسیار مهم است.

شما می‌توانید با استفاده از ورودی‌ها (inputs) ماژول‌ها را شخصی‌سازی کنید و با خروجی‌ها (outputs) اطلاعات موردنیاز را از آن‌ها استخراج کنید. علاوه بر ساخت ماژول‌های شخصی، می‌توانید از ماژول‌های آماده موجود در Terraform Registry هم استفاده کنید.

در این آموزش، شما یک ماژول Terraform می‌سازید که چند Droplet را پشت یک Load Balancer برای افزونگی (redundancy) ایجاد می‌کند. همچنین از قابلیت‌های count و for_each در HCL برای اجرای چند نمونه از ماژول استفاده خواهید کرد.


پیش‌نیازها

برای دنبال کردن این آموزش، به موارد زیر نیاز دارید:

  • یک توکن دسترسی DigitalOcean
  • نصب Terraform روی سیستم
  • آشنایی با:
    • متغیرها و حلقه‌ها در HCL
    • خروجی‌ها در Terraform

ساختار ماژول و مزایا

ماژول‌ها برای گروه‌بندی اجزای مرتبط استفاده می‌شوند و معمولاً در پروژه‌های بزرگ کاربرد دارند.

ویژگی‌های مهم:

  • خودکفا هستند (self-contained)
  • فقط شامل منابع، متغیرها و providerهای موردنیاز هستند
  • معمولاً در پوشه modules نگهداری می‌شوند
  • هر ماژول باید یک هدف مشخص داشته باشد

⚠️ نکته: در پروژه‌های کوچک استفاده از ماژول‌ها ضروری نیست.


ساخت ماژول

1. ایجاد ساختار پوشه

mkdir -p modules/droplet-lb
cd modules/droplet-lb

2. تعریف متغیرها (variables.tf)

variable "droplet_count" {}
variable "group_name" {}

3. تعریف Dropletها (droplets.tf)

resource "digitalocean_droplet" "droplets" {
  count  = var.droplet_count
  image  = "ubuntu-20-04-x64"
  name   = "${var.group_name}-${count.index}"
  region = "fra1"
  size   = "s-1vcpu-1gb"
}

4. تعریف Load Balancer (lb.tf)

resource "digitalocean_loadbalancer" "www-lb" {
  name   = "lb-${var.group_name}"
  region = "fra1"

  forwarding_rule {
    entry_port     = 80
    entry_protocol = "http"
    target_port     = 80
    target_protocol = "http"
  }

  healthcheck {
    port     = 22
    protocol = "tcp"
  }

  droplet_ids = [
    for droplet in digitalocean_droplet.droplets:
    droplet.id
  ]
}

5. تعریف provider (provider.tf)

terraform {
  required_providers {
    digitalocean = {
      source  = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }
}

6. تعریف خروجی (outputs.tf)

output "lb_ip" {
  value = digitalocean_loadbalancer.www-lb.ip
}

استفاده از ماژول

فایل main.tf

module "groups" {
  source = "./modules/droplet-lb"

  droplet_count = 3
  group_name    = "group1"
}

output "loadbalancer-ip" {
  value = module.groups.lb_ip
}

اجرای پروژه

terraform init
terraform plan
terraform apply

تغییر نام منابع بدون حذف (moved block)

اگر نام ماژول را تغییر دهید، Terraform منابع را حذف و دوباره ایجاد می‌کند ❌
برای جلوگیری از این مشکل:

moved {
  from = module.groups
  to   = module.groups_renamed
}

اجرای چند نمونه از ماژول

استفاده از count

module "groups" {
  source = "./modules/droplet-lb"

  count  = 3
  droplet_count = 3
  group_name    = "group1-${count.index}"
}

استفاده از for_each

variable "group_counts" {
  type = map
  default = {
    "group1" = 1
    "group2" = 3
  }
}

module "groups" {
  source   = "./modules/droplet-lb"
  for_each = var.group_counts

  droplet_count = each.value
  group_name    = each.key
}

جمع‌بندی

در این آموزش یاد گرفتید:

  • چگونه یک ماژول Terraform بسازید
  • چطور منابع را در قالب ماژول گروه‌بندی کنید
  • چگونه با استفاده از count و for_each چند نمونه از ماژول اجرا کنید
  • چطور خروجی‌ها را مدیریت کنید

 

 

از همراهی شما با پارمین کلود سپاسگزاریم.

Click to rate this post!
[Total: 0 Average: 0]

نظرات کاربران

دیدگاهی بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *