Terraform و Infrastructure as Code: مدیریت زیرساخت سرور بهصورت کد
در تیمهایی که چند سرور، پایگاهداده و شبکه را بهصورت دستی از طریق پنل مدیریتی یا کلیکهای متوالی میسازند، پس از مدتی یک سؤال ساده جواب سختی پیدا میکند: «الان دقیقاً چه زیرساختی داریم و با چه تنظیماتی ساخته شده؟» Infrastructure as Code دقیقاً همین مشکل را حل میکند.
Infrastructure as Code چیست؟
Infrastructure as Code (بهاختصار IaC) یعنی تعریف زیرساخت (سرور، شبکه، دیتابیس و...) در قالب فایلهای متنی بهجای کلیک دستی در پنل. این فایلها مثل کد برنامه در Git نگهداری میشوند، قابل مرور (Code Review)، قابل بازگشت به نسخهٔ قبلی و قابل اجرای مجدد و یکسان روی محیطهای مختلف هستند.
Terraform چطور کار میکند؟
| مفهوم | توضیح |
|---|---|
| Provider | افزونهای که Terraform را به یک سرویس (مثل یک ارائهدهندهٔ ابری) متصل میکند |
| Resource | یک واحد زیرساخت مشخص مثل سرور، دیسک یا رکورد DNS |
| State | فایلی که وضعیت فعلی زیرساخت ساختهشده را ثبت میکند |
نصب Terraform
sudo apt update
sudo apt install -y gnupg software-properties-common
wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor | sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install terraform -y
terraform -versionنوشتن اولین فایل .tf
یک فایل ساده به نام main.tf برای تعریف یک سرور:
terraform {
required_providers {
example = {
source = "example/example"
version = "~> 1.0"
}
}
}
resource "example_server" "web" {
name = "web-01"
size = "2vcpu-4gb"
image = "ubuntu-22-04"
}سه فرمان اصلی Terraform
terraform init # دانلود Providerها و آمادهسازی پروژه
terraform plan # نمایش تغییراتی که قرار است اعمال شود، بدون اجرا
terraform apply # اجرای واقعی تغییرات و ساخت زیرساختخروجی terraform plan پیش از هر اجرا نشان میدهد دقیقاً چه چیزی ساخته، تغییر یا حذف خواهد شد؛ همین ویژگی باعث میشود IaC بسیار امنتر از تغییرات دستی باشد.
مدیریت State و نکات امنیتی
فایل State ممکن است اطلاعات حساس (مثل IP یا شناسههای داخلی) را در خود نگه دارد؛ به همین دلیل هرگز نباید آن را مستقیم در Git عمومی commit کرد. برای کار تیمی، بهتر است State در یک Backend امن (مثل فضای ذخیرهسازی ابری با دسترسی محدود) نگهداری شود تا چند نفر بدون تداخل روی یک زیرساخت کار کنند.
جمعبندی
Terraform با تعریف زیرساخت در قالب کد، امکان بازتولید دقیق محیطهای تست و تولید، مرور تغییرات پیش از اعمال و همکاری تیمی امنتر را فراهم میکند. این رویکرد مکمل خوبی برای ابزارهایی مثل Kubernetes است؛ در حالی که Kubernetes اجرای کانتینرها را مدیریت میکند، Terraform میتواند خودِ زیرساخت زیرین (سرورها، شبکه) را بسازد. اگر با Docker Compose هم آشنا باشید، تفاوت این دو لایه (زیرساخت در برابر اپلیکیشن) روشنتر خواهد بود.
Terraform در کنار ابزارهای مدیریت پیکربندی
Terraform برای Provisioning زیرساخت (ایجاد سرور، شبکه و منابع ابری) استفاده میشود، اما برای پیکربندی داخلی سرورها پس از ایجاد، معمولاً از ابزارهای مدیریت پیکربندی مانند Ansible استفاده میشود. این دو ابزار مکمل یکدیگرند و جزئیات Ansible در مقاله Ansible: اتوماسیون نصب و پیکربندی سرورها آمده است.