مقدمه
یکی از مهمترین مزایای Infrastructure as Code یا IAC، قابلیت استفاده مجدد از بخشهای مختلف زیرساخت است. در Terraform میتوانید با استفاده از ماژولها، اجزای مرتبط را در قالب یک واحد مستقل مدیریت کرده و با کمک متغیرهای ورودی، آنها را شخصیسازی کنید.
استفاده از ماژولها به شما این امکان را میدهد که محیطهای مختلف مانند توسعه (Development)، تست (Staging) و تولید (Production) را تنها با ارسال مقادیر متفاوت به یک ماژول مشترک مدیریت کنید. این کار باعث کاهش تکرار کد و افزایش خوانایی و سادگی پروژه میشود.
در Terraform فقط محدود به استفاده از ماژولهای اختصاصی خودتان نیستید. سرویس Terraform Registry به صورت داخلی با Terraform یکپارچه شده و مجموعهای از ماژولها و Providerهای آماده را ارائه میدهد که میتوانید آنها را مستقیماً در پروژه استفاده کنید. استفاده از ماژولهای عمومی میتواند سرعت توسعه را افزایش داده و از تکرار کدنویسی جلوگیری کند. همچنین اگر ماژول کاربردیای ایجاد کنید، میتوانید آن را در Registry منتشر کنید تا سایر توسعهدهندگان نیز از آن استفاده کنند.
در این آموزش با روشهای مختلف تعریف و استفاده مجدد از کد در پروژههای Terraform آشنا میشوید. همچنین نحوه استفاده از ماژولهای Terraform Registry، جداسازی محیطهای توسعه و تولید، استفاده از Templateها و تعریف وابستگی منابع با استفاده از depends_on را بررسی خواهید کرد.
پیشنیازها
برای انجام این آموزش به موارد زیر نیاز دارید:
یک Personal Access Token از پارمین کلود که میتوانید آن را از پنل مدیریتی Parmin Cloud ایجاد کنید.
نصب Terraform روی سیستم محلی و راهاندازی پروژه با Provider پارمین کلود.
وجود ماژول server-lb در مسیر modules داخل پروژه terraform-reusability.
آشنایی اولیه با ساختار پروژههای Terraform.
(اختیاری) دو دامنه مجزا که Name Serverهای آنها به پارمین کلود متصل شده باشند.
نکته: این آموزش با Terraform نسخه 1.0.2 تست شده است.
جداسازی محیطهای توسعه و تولید
در این بخش با استفاده از ماژولها، محیطهای مختلف استقرار را از یکدیگر جدا میکنید. ساختار پروژه شامل دو ماژول خواهد بود:
ماژول مربوط به سرورها و Load Balancer
ماژول مربوط به رکوردهای DNS
در نهایت دو محیط مجزا با نامهای dev و prod ایجاد خواهید کرد که هر دو از ماژولهای یکسان اما با تنظیمات متفاوت استفاده میکنند.
ایجاد ماژول dns-records
ابتدا وارد پوشه پروژه شوید و ماژول جدید را ایجاد کنید:
mkdir modules/dns-records
سپس وارد آن شوید:
cd modules/dns-records
این ماژول شامل تنظیمات دامنه و رکوردهای DNS خواهد بود.
تعریف متغیرها
فایل variables.tf را ایجاد کنید:
nano variables.tf
محتوای زیر را داخل آن قرار دهید:
variable “domain_name” {}variable “ipv4_address” {}
تعریف رکوردهای DNS
فایل records.tf را ایجاد کنید:
nano records.tf
کد زیر را وارد کنید:
resource “digitalocean_domain” “domain” { name = var.domain_name}resource “digitalocean_record” “domain_A” { domain = digitalocean_domain.domain.name type = “A” name = “@” value = var.ipv4_address}resource “digitalocean_record” “domain_CNAME” { domain = digitalocean_domain.domain.name type = “CNAME” name = “www” value = “@”}
در این بخش:
دامنه به حساب Parmin Cloud اضافه میشود.
رکورد A دامنه به IP موردنظر متصل میشود.
رکورد CNAME برای زیر دامنه www تعریف میشود.
تعریف خروجیها
فایل outputs.tf را ایجاد کنید:
nano outputs.tf
محتوا:
output “A_fqdn” { value = digitalocean_record.domain_A.fqdn}output “CNAME_fqdn” { value = digitalocean_record.domain_CNAME.fqdn}
تعریف Provider
فایل provider.tf را ایجاد کنید:
nano provider.tf
سپس کد زیر را وارد کنید:
terraform { required_providers { digitalocean = { source = “digitalocean/digitalocean” version = “~> 2.0” } }}
اکنون ماژول dns-records آماده استفاده است.
ایجاد محیطهای مختلف
ساختار فعلی پروژه به شکل زیر خواهد بود:
terraform-reusability/├─ modules/│ ├─ dns-records/│ ├─ server-lb/├─ provider.tf
اکنون پوشههای مربوط به محیطهای مختلف را ایجاد کنید:
mkdir -p environments/dev && mkdir environments/prod
پیکربندی محیط توسعه (dev)
وارد پوشه dev شوید:
cd environments/dev
فایل main.tf را ایجاد کنید:
nano main.tf
کد زیر را وارد کنید:
module “servers” { source = “../../modules/server-lb” droplet_count = 2 group_name = “dev”}module “dns” { source = “../../modules/dns-records” domain_name = “your_dev_domain” ipv4_address = module.servers.lb_ip}
در این تنظیمات:
دو سرور ایجاد میشود.
یک Load Balancer در جلوی آنها قرار میگیرد.
رکوردهای DNS دامنه به Load Balancer متصل میشوند.
تنظیم Provider
فایل provider.tf را ایجاد کنید:
nano provider.tf
محتوا:
terraform { required_providers { digitalocean = { source = “digitalocean/digitalocean” version = “~> 2.0” } }}variable “do_token” {}provider “digitalocean” { token = var.do_token}
مقداردهی اولیه Terraform
terraform init
در صورت موفقیت، Terraform ماژولها و Providerها را دانلود و آماده استفاده میکند.
پیکربندی محیط Production
وارد پوشه prod شوید:
cd ../prod
فایل main.tf را ایجاد کنید:
module “servers” { source = “../../modules/server-lb” droplet_count = 5 group_name = “prod”}module “dns” { source = “../../modules/dns-records” domain_name = “your_prod_domain” ipv4_address = module.servers.lb_ip}
تفاوت این بخش با محیط dev در تعداد سرورها و دامنه مورد استفاده است.
سپس فایل provider.tf را کپی کنید:
cp ../dev/provider.tf .
و مجدداً Terraform را مقداردهی اولیه کنید:
terraform init
مشاهده Plan پروژه
برای مشاهده منابعی که Terraform ایجاد خواهد کرد:
terraform plan -var “do_token=${DO_PAT}”
در محیط production:
پنج سرور ایجاد میشود.
یک Load Balancer ساخته میشود.
رکوردهای DNS دامنه تنظیم خواهند شد.
اجرای پروژه
برای اعمال تنظیمات:
terraform apply -var “do_token=${DO_PAT}”
برای حذف کامل زیرساخت:
terraform destroy -var “do_token=${DO_PAT}”
مدیریت وابستگیها با depends_on
Terraform معمولاً وابستگی منابع را به صورت خودکار تشخیص میدهد. اما در برخی مواقع وابستگیها به شکل مستقیم در کد قابل تشخیص نیستند. در چنین شرایطی میتوانید از depends_on استفاده کنید.
نمونه:
resource “resource_type” “res” { depends_on = […] # Parameters…}
استفاده از depends_on باعث میشود Terraform ابتدا منابع مشخصشده را ایجاد کند و سپس سراغ منبع فعلی برود.
استفاده از Templateها در Terraform
در Terraform میتوانید با استفاده از Templateها مقادیر را به صورت داینامیک تولید کنید.
نمونه فایل Template:
%{ for address in addresses ~}${address}:80%{ endfor ~}
نمونه استفاده:
templatefile(“${path.module}/servers.tmpl”, { addresses = [“192.168.0.1”, “192.168.1.1”]})
خروجی:
192.168.0.1:80192.168.1.1:80
Templateها زمانی مفید هستند که بخواهید فایلهای تنظیمات را به صورت داینامیک تولید کنید.
جمعبندی
در این آموزش یاد گرفتید چگونه با استفاده از ماژولها در Terraform، زیرساختی قابل استفاده مجدد ایجاد کنید.
مزیت اصلی این روش:
کاهش تکرار کد
مدیریت سادهتر محیطها
توسعه سریعتر
نگهداری آسانتر پروژهها
همچنین با مفاهیمی مانند:
ماژولها
محیطهای مجزا
depends_on
Templateها
آشنا شدید که در پروژههای حرفهای Terraform بسیار کاربردی هستند.
از همراهی شما با پارمین کلود سپاسگزاریم.
نظرات کاربران