مقدمه
ماژولهای Terraform سنگ بنای infrastructure-as-code قابل استفاده مجدد و قابل نگهداری هستند. بدون ماژولها، کد Terraform را در پروژهها کپی-پیست میکنید که تغییرات گلوبال را کابوس میکند. با ماژولهای طراحیشده خوب، الگوهای زیرساخت را یک بار تعریف کرده و با پارامترهای مختلف مجدداً استفاده میکنید.
ساختار ماژول
TEXT
project/
├── main.tf ← ماژول root
└── modules/
└── security-group/
├── main.tf
├── variables.tf
└── outputs.tfنوشتن ماژول
HCL
# modules/security-group/variables.tf
variable "name" {
type = string
}
variable "vpc_id" {
type = string
}
variable "ingress_rules" {
type = list(object({
from_port = number
to_port = number
protocol = string
cidr_blocks = list(string)
description = string
}))
default = []
}HCL
# modules/security-group/main.tf
resource "aws_security_group" "this" {
name = var.name
vpc_id = var.vpc_id
}
resource "aws_security_group_rule" "ingress" {
for_each = { for i, rule in var.ingress_rules : i => rule }
type = "ingress"
security_group_id = aws_security_group.this.id
from_port = each.value.from_port
to_port = each.value.to_port
protocol = each.value.protocol
cidr_blocks = each.value.cidr_blocks
}استفاده از ماژول
HCL
module "web_sg" {
source = "./modules/security-group"
name = "web-tier-sg"
vpc_id = module.vpc.vpc_id
ingress_rules = [
{
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
description = "HTTPS"
}
]
}نسخهبندی ماژول
BASH
# تگگذاری نسخه
git tag v1.0.0
git push origin v1.0.0
# استفاده از نسخه خاص
module "security_group" {
source = "git::https://github.com/company/tf-modules.git//security-group?ref=v1.0.0"
}ماژولهای قابل استفاده مجدد کلید نگهداری زیرساخت در مقیاس هستند. با ماژولها برای الگوهای تکراریترتان شروع کنید، آنها را بهدقت نسخهبندی کنید، و همیشه مثالهایی بنویسید که هم به عنوان مستندات و هم تست یکپارچهسازی عمل کنند.
