آشنایی با Terraform: مدیریت زیرساخت به عنوان کد (IaC)
ﺯﻣﺎﻥ ﻣﻄﺎﻟﻌﻪ: 14 دقیقه

آشنایی با Terraform: مدیریت زیرساخت به عنوان کد (IaC)

تحول در شیوه‌های استقرار و مدیریت زیرساخت باعث شده است که سازمان‌ها به‌دنبال راهکارهایی باشند که سرعت، دقت و قابلیت تکرارپذیری را در عملیات زیرساختی افزایش دهد. رویکرد «زیرساخت به‌عنوان کد» یا IaC پاسخی به همین نیاز است، رویکردی که امکان تعریف و مدیریت زیرساخت را با همان اصول نسخه‌سازی و کنترل تغییرات در توسعه نرم‌افزار فراهم می‌کند.

Terraform به‌عنوان یکی از ابزارهای برجسته در حوزه IaC، این امکان را ایجاد می‌کند که منابع زیرساختی در سرویس‌های ابری و محیط‌های مختلف به‌صورت خودکار، قابل پیش‌بینی و استاندارد مدیریت شوند. این ابزار با استفاده از یک زبان توصیفی ساده، فرآیند ایجاد، تغییر و حذف منابع را ساختارمند می‌کند و به تیم‌های فنی کمک می‌کند زیرساختی پایدار و قابل اتکا بسازند.

Terraform چیست؟

Terraform یکی از ابزارهای برجسته در حوزه «زیرساخت به‌عنوان کد» است که توسط شرکت HashiCorp توسعه یافته و با هدف ساده‌سازی و استانداردسازی مدیریت زیرساخت در محیط‌های مختلف طراحی شده است. این ابزار با استفاده از یک زبان توصیفی به نام HCL، امکان تعریف منابع زیرساختی را به‌صورت کد فراهم می‌کند و به تیم‌های فنی اجازه می‌دهد زیرساخت را دقیق، قابل تکرار و قابل نسخه‌برداری مدیریت کنند.

Terraform از طیف گسترده‌ای از سرویس‌ها و ارائه‌دهندگان ابری پشتیبانی می‌کند، از جمله AWS، آژور، گوگل کلود و بسیاری سرویس‌های دیگر. این گستردگی باعث شده است که Terraform به یک ابزار چندمنظوره و مستقل از پلتفرم تبدیل شود و بتواند در معماری‌های پیچیده و چندابری نیز نقش مؤثری ایفا کند.

ویژگی‌هایی مانند مدیریت خودکار تغییرات، ایجاد نقشه وابستگی منابع، امکان برنامه‌ریزی پیش از اعمال تغییرات و پشتیبانی از ماژول‌ها، Terraform را به یکی از انتخاب‌های اصلی در تیم‌های DevOps و عملیات زیرساختی تبدیل کرده است. این بخش مقدمه‌ای بر شناخت این ابزار و جایگاه آن در مدیریت مدرن زیرساخت است.

مفاهیم پایه در Terraform

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

Provider

Providerها رابط میان Terraform و سرویس‌های زیرساختی هستند. هر Provider مجموعه‌ای از منابع و قابلیت‌ها را برای مدیریت یک سرویس مشخص ارائه می‌دهد. برای مثال:

  • AWS Provider برای مدیریت منابع AWS
  • AzureRM Provider برای Azure
  • Kubernetes Provider برای مدیریت خوشه‌ها

Resource

Resource اصلی‌ترین واحد قابل مدیریت در Terraform است. هر منبع زیرساختی مانند ماشین مجازی، شبکه، دیتابیس یا Load Balancer به‌صورت یک Resource تعریف می‌شود. Terraform با استفاده از این تعریف‌ها منابع را ایجاد، تغییر یا حذف می‌کند.

Data Source

Data Sourceها امکان خواندن اطلاعات موجود در زیرساخت را فراهم می‌کنند بدون اینکه تغییری در آن ایجاد شود. این قابلیت برای استفاده از داده‌های موجود در سایر سرویس‌ها یا منابع بسیار کاربردی است.

Module

Module مجموعه‌ای از فایل‌ها و پیکربندی‌های Terraform است که یک بخش مشخص از زیرساخت را به‌صورت قابل استفاده مجدد تعریف می‌کند. استفاده از ماژول‌ها باعث ساختارمند شدن پروژه و کاهش تکرار کد می‌شود.

State

State فایل یا مخزنی است که Terraform وضعیت فعلی زیرساخت را در آن ذخیره می‌کند. این فایل نقش حیاتی در تشخیص تغییرات، مدیریت وابستگی‌ها و اجرای صحیح عملیات دارد. مدیریت درست State یکی از مهم‌ترین بخش‌های کار با Terraform است.

Input Variables

متغیرها امکان پیکربندی پویا و قابل انعطاف را فراهم می‌کنند. با استفاده از متغیرها می‌توان مقادیر مختلف را بدون تغییر مستقیم در فایل‌های اصلی تنظیم کرد.

Output Values

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

Backend

Backend تعیین می‌کند که فایل State در کجا ذخیره شود. این محل می‌تواند لوکال باشد یا در سرویس‌هایی مانند S3 ،Azure Blob یا Terraform Cloud نگهداری شود. انتخاب Backend مناسب برای پروژه‌های تیمی اهمیت ویژه‌ای دارد.

معماری Terraform چگونه کار می‌کند؟

Terraform بر پایه یک معماری شفاف و قابل پیش‌بینی طراحی شده است که هدف آن مدیریت خودکار چرخه عمر منابع زیرساختی است. این معماری مجموعه‌ای از مراحل و سازوکارها را شامل می‌شود که به Terraform امکان می‌دهد وضعیت فعلی زیرساخت را تحلیل کند، تغییرات مورد نیاز را تشخیص دهد و آن‌ها را به‌صورت ایمن و کنترل‌شده اعمال کند.

چرخه اجرای Terraform

Terraform برای مدیریت زیرساخت از یک چرخه مشخص استفاده می‌کند که شامل مراحل زیر است:

۱. Init

در این مرحله، Terraform محیط کاری را آماده می‌کند:

  • دانلود Providerها
  • مقداردهی Backend
  • آماده‌سازی ماژول‌ها

این مرحله پیش‌نیاز اجرای هر عملیات دیگری است.

۲. Plan

در مرحله Plan، Terraform تغییرات مورد نیاز را محاسبه و نمایش می‌دهد:

  • مقایسه وضعیت فعلی زیرساخت با فایل State
  • تحلیل فایل‌های پیکربندی
  • ارائه یک برنامه دقیق از تغییراتی که قرار است اعمال شود

این مرحله به تیم‌ها امکان می‌دهد پیش از اعمال تغییرات، اثرات آن را بررسی کنند.

۳. Apply

در این مرحله، Terraform برنامه محاسبه‌شده را اجرا می‌کند:

  • ایجاد منابع جدید
  • به‌روزرسانی منابع موجود
  • حذف منابع غیرضروری

پس از اجرای موفق، فایل State نیز به‌روزرسانی می‌شود.

۴. Destroy

این مرحله برای حذف کامل منابع تعریف‌شده در پیکربندی استفاده می‌شود. این قابلیت برای محیط‌های آزمایشی یا پاک‌سازی زیرساخت بسیار کاربردی است.

نقش State در معماری Terraform

State یکی از مهم‌ترین اجزای Terraform است و وظایف زیر را بر عهده دارد:

  • ذخیره وضعیت فعلی زیرساخت
  • تشخیص تغییرات مورد نیاز
  • مدیریت وابستگی میان منابع
  • جلوگیری از ایجاد منابع تکراری

بدون State، Terraform قادر به تحلیل صحیح وضعیت زیرساخت نخواهد بود.

تشخیص تغییرات (Drift Detection)

در بسیاری از موارد، ممکن است منابع خارج از Terraform تغییر کنند. Terraform با مقایسه State و وضعیت واقعی زیرساخت، این اختلاف‌ها را تشخیص می‌دهد. این قابلیت برای حفظ یکپارچگی زیرساخت اهمیت زیادی دارد.

نقشه وابستگی (Dependency Graph)

Terraform پیش از اجرای تغییرات، یک گراف وابستگی از منابع ایجاد می‌کند. این گراف مشخص می‌کند:

  • کدام منابع باید ابتدا ایجاد شوند
  • کدام منابع وابسته به دیگران هستند
  • کدام عملیات می‌تواند به‌صورت موازی انجام شود

این سازوکار باعث افزایش سرعت و کاهش خطا در اجرای عملیات می‌شود.

این بخش تصویری روشن از نحوه عملکرد Terraform ارائه می‌دهد و نشان می‌دهد که این ابزار چگونه با استفاده از یک معماری ساخت‌یافته، مدیریت زیرساخت را قابل اعتماد و قابل پیش‌بینی می‌کند.

نصب و راه‌اندازی Terraform

راه‌اندازی Terraform نخستین گام برای استفاده عملی از این ابزار در مدیریت زیرساخت است. فرآیند نصب و آماده‌سازی محیط کاری ساده و یکسان در سیستم‌عامل‌های مختلف طراحی شده تا کاربران بتوانند بدون پیچیدگی وارد مرحله توسعه و تعریف زیرساخت شوند.

نصب Terraform

Terraform یک ابزار تک‌فایلی است و نصب آن معمولا شامل دریافت فایل اجرایی و قرار دادن آن در مسیر قابل دسترس سیستم است. بسته‌های رسمی برای سیستم‌عامل‌های مختلف ارائه می‌شود. پس از دانلود، کافی است فایل اجرایی در مسیر PATH قرار گیرد تا از طریق خط فرمان قابل استفاده باشد.

ایجاد اولین پروژه

پس از نصب، می‌توان یک پوشه جدید برای پروژه ایجاد کرد و فایل‌های پیکربندی Terraform را در آن قرار داد. معمولا اولین فایل پروژه با نام main.tf ایجاد می‌شود و شامل تعریف Provider و یک یا چند Resource است.

اجرای دستورات اولیه

Terraform برای شروع کار نیازمند اجرای چند دستور کلیدی است:

  • init: برای آماده‌سازی محیط، دانلود Providerها و مقداردهی Backend استفاده می‌شود.

  • plan: برای مشاهده تغییراتی که قرار است اعمال شود.

  • apply: برای اجرای تغییرات و ایجاد یا به‌روزرسانی منابع.

این سه دستور پایه ستون اصلی تعامل با Terraform را تشکیل می‌دهند و در تمامی پروژه‌ها مورد استفاده قرار می‌گیرند.

پس از نصب و اجرای اولین پیکربندی، محیط Terraform آماده است تا وارد مراحل پیشرفته‌تر مانند ساختاردهی فایل‌ها، استفاده از ماژول‌ها و مدیریت State شود. این مرحله نقطه آغاز کار عملی با Terraform و ورود به فرآیند مدیریت زیرساخت به‌صورت کد است.

ساختار فایل‌ها و پوشه‌ها در Terraform

پس از نصب و اجرای اولیه، مرحله بعدی سازمان‌دهی فایل‌ها و ساختار پروژه است. Terraform بر پایه مجموعه‌ای از فایل‌های متنی با پسوند .tf کار می‌کند و هر فایل نقش مشخصی در تعریف و مدیریت زیرساخت دارد. انتخاب یک ساختار مناسب از همان ابتدا باعث می‌شود پروژه خواناتر، قابل نگهداری‌تر و مقیاس‌پذیرتر باشد.

  • main.tf: فایل اصلی پروژه است و شامل تعریف Provider و منابع (Resources) می‌شود. بسیاری از پروژه‌ها از این فایل برای نقطه ورود پیکربندی استفاده می‌کنند.
  • variables.tf: تمام متغیرهای ورودی پروژه در این فایل تعریف می‌شوند. استفاده از این فایل باعث می‌شود پیکربندی پروژه انعطاف‌پذیر و قابل تنظیم باشد.
  • outputs.tf: خروجی‌هایی که لازم است پس از اجرای Terraform نمایش داده شوند یا در بخش‌های دیگر مورد استفاده قرار گیرند، در این فایل تعریف می‌شوند.
  • terraform.tfvars: مقادیر متغیرها در این فایل قرار می‌گیرد. این فایل امکان جداسازی مقداردهی از تعریف متغیرها را فراهم می‌کند و برای مدیریت محیط‌های مختلف بسیار کاربردی است.
  • provider.tf: در پروژه‌های بزرگ‌تر، تعریف Providerها در فایل جداگانه قرار می‌گیرد تا ساختار پروژه منسجم‌تر باشد.

ساختار پیشنهادی برای پروژه‌های کوچک

project/
 ├── main.tf
 ├── variables.tf
 ├── outputs.tf
 └── terraform.tfvars

ساختار پیشنهادی برای پروژه‌های بزرگ

project/
 ├── providers/
 │    └── provider.tf
 ├── modules/
 │    └── <module_name>/
 ├── environments/
 │    ├── dev/
 │    ├── staging/
 │    └── prod/
 ├── main.tf
 ├── variables.tf
 ├── outputs.tf
 └── terraform.tfvars

این ساختارها به Terraform کمک می‌کنند پیکربندی را به‌صورت منظم پردازش کند و به تیم‌ها امکان می‌دهند پروژه را در مقیاس‌های مختلف مدیریت کنند.

Providerها و نحوه استفاده از آن‌ها

Provider یکی از بنیادی‌ترین اجزای Terraform است و نقش واسط میان Terraform و سرویس‌های زیرساختی را ایفا می‌کند. هر Provider مجموعه‌ای از منابع (Resources) و داده‌ها (Data Sources) را ارائه می‌دهد که Terraform می‌تواند آن‌ها را مدیریت کند. بدون تعریف Provider، ترافورم نمی‌داند باید با کدام سرویس ارتباط برقرار کند یا چه نوع منابعی را ایجاد و مدیریت نماید.

مفهوم Provider

Provider در واقع یک افزونه (Plugin) است که ارتباط با یک سرویس مشخص را برقرار می‌کند. این سرویس می‌تواند یک ارائه‌دهنده ابر عمومی، یک پلتفرم SaaS، یک سیستم داخلی یا حتی یک ابزار مدیریت کانتینر باشد. برخی از Providerهای رایج عبارت‌اند از:

  • AWS
  • AzureRM
  • Google Cloud
  • Kubernetes
  • Cloudflare
  • GitHub
  • Docker

این تنوع گسترده باعث شده Terraform به ابزاری چندمنظوره و مستقل از پلتفرم تبدیل شود.

نحوه پیکربندی Provider

برای استفاده از یک Provider، ابتدا باید آن را در فایل‌های پیکربندی تعریف کرد. این تعریف شامل موارد زیر است:

  • تعیین نسخه Provider
  • مشخص کردن تنظیمات احراز هویت
  • تعیین منطقه یا پارامترهای مرتبط با سرویس

نمونه‌ای از تعریف Provider برای AWS:

provider "aws" {
  region = "us-east-1"
}

مدیریت نسخه Provider

Terraform امکان قفل‌کردن نسخه Provider را فراهم می‌کند تا از تغییرات ناخواسته جلوگیری شود. این کار با استفاده از بخش required_providers انجام می‌شود:

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

قفل‌کردن نسخه باعث می‌شود پروژه در محیط‌های مختلف رفتار یکسانی داشته باشد.

چند Provider در یک پروژه

Terraform امکان استفاده هم‌زمان از چند Provider را فراهم می‌کند. این قابلیت برای پروژه‌هایی که از چند سرویس ابری یا چند پلتفرم استفاده می‌کنند بسیار ارزشمند است.

provider "aws" {
  region = "us-east-1"
}

provider "cloudflare" {
  api_token = var.cloudflare_token
}

در صورت نیاز، می‌توان Providerهای سفارشی ایجاد کرد یا از Providerهای توسعه‌یافته توسط جامعه استفاده نمود. Terraform Registry مجموعه گسترده‌ای از Providerهای رسمی و غیررسمی را ارائه می‌دهد.

ماژول‌ها در Terraform

ماژول‌ها یکی از مهم‌ترین قابلیت‌های Terraform هستند و نقش اساسی در سازمان‌دهی، مقیاس‌پذیری و قابل‌استفاده‌مجدد کردن پیکربندی‌ها ایفا می‌کنند. استفاده از ماژول‌ها باعث می‌شود پروژه‌ها ساختارمندتر شوند، از تکرار کد جلوگیری شود و امکان مدیریت زیرساخت در مقیاس‌های بزرگ فراهم گردد.

مفهوم Module

ماژول در Terraform مجموعه‌ای از فایل‌های پیکربندی است که یک بخش مشخص از زیرساخت را تعریف می‌کند. هر ماژول می‌تواند شامل منابع، متغیرها، خروجی‌ها و حتی ماژول‌های دیگر باشد. به‌این‌ترتیب، ماژول‌ها مانند بلوک‌های سازنده عمل می‌کنند و امکان ساخت زیرساخت‌های پیچیده را با ترکیب بخش‌های کوچک‌تر فراهم می‌سازند.

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

  • کاهش تکرار کد: بخش‌های تکراری زیرساخت تنها یک‌بار تعریف می‌شوند و در بخش‌های مختلف پروژه مورد استفاده قرار می‌گیرند.

  • افزایش خوانایی و سازمان‌دهی: تقسیم پروژه به ماژول‌های کوچک‌تر باعث می‌شود ساختار پروژه شفاف‌تر و قابل نگهداری‌تر باشد.

  • قابلیت استفاده مجدد: ماژول‌ها می‌توانند در پروژه‌های مختلف یا محیط‌های متفاوت (Dev ،Staging ،Production) استفاده شوند.

  • استانداردسازی زیرساخت: تیم‌ها می‌توانند ماژول‌های استاندارد ایجاد کنند تا همه بخش‌ها از الگوی یکسانی پیروی کنند.

ساخت یک Module سفارشی

یک ماژول معمولا شامل فایل‌های زیر است:

module/
 ├── main.tf
 ├── variables.tf
 └── outputs.tf

برای استفاده از یک ماژول، کافی است آن را در فایل اصلی فراخوانی کنید:

module "network" {
  source = "./modules/network"
  cidr_block = "10.0.0.0/16"
}

پارامترهای ورودی ماژول مانند متغیرهای معمولی مقداردهی می‌شوند.

ماژول‌های آماده در Terraform Registry

Terraform Registry مجموعه گسترده‌ای از ماژول‌های آماده را ارائه می‌دهد که توسط HashiCorp یا جامعه توسعه‌دهندگان ایجاد شده‌اند. این ماژول‌ها برای ساخت سریع زیرساخت‌های استاندارد بسیار کاربردی هستند.

نمونه استفاده از یک ماژول آماده AWS:

module "vpc" {
  source  = "terraform-aws-modules/vpc/aws"
  version = "5.0.0"

  name = "main-vpc"
  cidr = "10.0.0.0/16"
}

بهترین شیوه‌ها در استفاده از ماژول‌ها

  • تعریف ماژول‌های کوچک و هدفمند
  • استفاده از نام‌گذاری استاندارد
  • مستندسازی ورودی‌ها و خروجی‌ها
  • پرهیز از پیچیدگی بیش از حد در یک ماژول

مزایا و معایب Terraform

مزایا

  • پشتیبانی گسترده از Providerها و امکان مدیریت زیرساخت در سرویس‌های مختلف ابری و پلتفرم‌های گوناگون
  • استقلال از پلتفرم و مناسب برای معماری‌های چندابری
  • استفاده از زبان توصیفی HCL که خوانایی و یادگیری آسانی دارد
  • قابلیت برنامه‌ریزی پیش از اعمال تغییرات (Plan) برای کاهش خطا
  • مدیریت خودکار وابستگی‌ها با استفاده از گراف منابع
  • امکان استفاده از ماژول‌ها برای افزایش قابلیت استفاده مجدد و استانداردسازی
  • قابلیت ذخیره‌سازی Remote State برای همکاری تیمی و جلوگیری از تداخل
  • پشتیبانی از نسخه‌بندی زیرساخت مشابه کد نرم‌افزار
  • قابلیت تشخیص تغییرات خارج از Terraform
  • مناسب برای ادغام با CI/CD و فرآیندهای DevOps

معایب

  • وابستگی شدید به فایل State که در صورت مدیریت نادرست می‌تواند مشکل‌ساز شود
  • پیچیدگی در پروژه‌های بزرگ در صورت ساختاردهی نامناسب
  • عدم پشتیبانی از عملیات‌های درجا (In-place) در برخی منابع که باعث ایجاد و حذف مجدد می‌شود
  • نیاز به یادگیری مفاهیم جدید مانند Backend ،Module و State Management
  • کندی در برخی عملیات‌ها به‌ویژه در پروژه‌های بزرگ یا Providerهای خاص
  • محدودیت در برخی Providerها که ممکن است همه قابلیت‌های سرویس اصلی را پوشش ندهند
  • نیاز به مدیریت جداگانه Secrets زیرا State ممکن است شامل داده‌های حساس باشد

جمع‌بندی

Terraform به‌عنوان یکی از ابزارهای کلیدی در حوزه «زیرساخت به‌عنوان کد»، رویکردی ساخت‌یافته و قابل اتکا برای مدیریت زیرساخت در محیط‌های ابری و چندپلتفرمی ارائه می‌دهد. این ابزار با تکیه بر زبان توصیفی ساده، معماری شفاف، پشتیبانی گسترده از Providerها و قابلیت‌هایی مانند ماژول‌ها و مدیریت State، امکان ایجاد زیرساخت‌های پایدار، قابل تکرار و استاندارد را فراهم می‌کند.

به‌کارگیری Terraform نه‌تنها سرعت و دقت عملیات زیرساختی را افزایش می‌دهد، بلکه هماهنگی میان تیم‌ها، قابلیت نسخه‌بندی و کنترل تغییرات را نیز بهبود می‌بخشد. در کنار مزایای قابل توجه، شناخت محدودیت‌ها و چالش‌های آن نیز اهمیت دارد تا بتوان از این ابزار در جایگاه مناسب و با ساختاردهی صحیح بهره برد.

چه امتیازی برای این مقاله میدهید؟

خیلی بد
بد
متوسط
خوب
عالی
5 از 1 رای

/@arastoo
ارسطو عباسی
کارشناس تست نرم‌افزار و مستندات

...

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

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

ارسطو عباسی

کارشناس تست نرم‌افزار و مستندات