مقدمه
ماژولهای 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چند نمونه از ماژول اجرا کنید - چطور خروجیها را مدیریت کنید
از همراهی شما با پارمین کلود سپاسگزاریم.
نظرات کاربران