Terraform چیست و چه تفاوتی با سایر ابزارهای زیرساخت دارد؟
ترافورم یک ابزار زیرساخت مبتنی بر کد یا IaC (مخفف Infrastructure as Code) است که به تیمهای توسعه و عملیات (DevOps) در مدیریت پیادهسازی زیرساختهای چند ابری کمک میکند. در این مطلب، با ترافورم، مزایا و نحوه کار آن، IaC و تفاوت ترافورم با ابزارهای زیرساخت دیگر آشنا خواهید شد.
مدیریت زیرساخت فناوری اطلاعات (IT) در سرورها، محیطهای ابری و بخشهای مختلف به سرعت میتواند پیچیده و غیرقابل کنترل شود. اما یکی از بهترین راهکارهای سازمانها برای اینکه زیرساخت را در ابعاد بزرگتر توسعه دهند، استفاده از راهحلی به اسم ترافورم است. Terraform یک ابزار زیرساخت مبتنی بر کد (IaC) به حساب میآید. اما ترافورم چیست و چگونه کار میکند؟
Terraform (ترافورم) چیست؟
ترافورم یک ابزار «زیرساخت مبتنی بر کد» (IaC) است که تیمهای DevOps از آن برای خودکار کردن کارهای مختلف مرتبط با زیرساخت استفاده میکنند. یکی از کاربردهای اصلی ترافورم، تهیه و راهاندازی منابع ابری است. این ابزار متن باز، به هیچ سرویس ابری خاصی وابسته نیست و با زبان برنامهنویسی Go نوشته شده و توسط شرکت HashiCorp ساخته شده است.
ترافورم این امکان را به شما میدهد که کل زیرساخت خود را به شکل کد تعریف کنید. حتی اگر سرورهای شما از ارائهدهندگان خدمات ابری مختلف باشند، Terraform به شما کمک میکند تا این منابع را به طور موازی و هماهنگ در کل این سرویسها بسازید و مدیریت کنید. ترافورم را میتوان مانند یک زبان مشترک در نظر گرفت که با آن میتوانید تمام مجموعه نرمافزار و زیرساخت خود را کنترل کنید.
Infrastructure as Code یا IaC چیست؟
قبلا، آماده کردن یک سرور ویندوز یا لینوکس برای آزمایشگاه یا مرکز داده، شامل چندین مرحله بود که نیازمند کلیک کردن با ماوس، اجرای اسکریپتها و پیکربندی دستی موارد مختلفی مثل فضای ذخیره سازی و شبکه بود. انجام این کار به صورت گسترده برای صدها یا هزاران سرور، به طور فزایندهای پیچیده و مستعد خطا میشد.
IaC یا «زیرساخت مبتنی بر کد» این فرآیند را بسیار سادهتر، سریعتر و ایمنتر میکند. چون به شما اجازه میدهد تا زیرساخت خود را با استفاده از یک زبان اعلانی (declarative) تعریف و راهاندازی کنید. با این روش میتوانید به ثبات، تکرارپذیری و قابلیت اطمینان بالاتری دست پیدا کنید.
علاوه بر راهاندازی اولیه زیرساخت، این رویکرد (استفاده از IaC) به مدیریت هر تغییری که در طول مسیر برای زیرساخت شما رخ میدهد (که معمولا به عنوان مدیریت تغییر یا drift management شناخته میشود) کمک میکند.
ویژگی ها و مزیت Terraform چیست؟
دلایل متعددی وجود دارد که توسعهدهندگان ترافورم را به عنوان ابزار IaC خود انتخاب میکنند. در اینجا به برخی از مهمترین ویژگیها و مزایای ترافورم اشاره میکنیم:
متن باز
Terraform یک ابزار متنباز به شمار میرود. این یعنی ترافورم جامعهی بزرگی از متخصصان و علاقهمندان دارد که به صورت رایگان برای توسعه و بهبود آن تلاش میکنند. بعلاوه، این افراد پلاگینها و ابزارهای کمکی متعددی برای Terraform میسازند.
سازگار با چند پلتفرم
ترافورم با هر ارائهدهندهی خدمات ابری قابل استفاده است! برخلاف بسیاری از ابزارهای دیگر در حوزهی زیرساخت مبتنی بر کد (IaC) که فقط برای یک سرویسدهندهی خاص طراحی شدهاند، Terraform قابلیت انعطافپذیری بالایی دارد.
زیرساخت ایستا
بسیاری از ابزارهای IaC زیرساختهای «قابل تغییر» (mutable) ایجاد میکنند؛ یعنی این زیرساختها میتوانند برای تطبیق با تغییراتی مثل بهروزرسانی نرمافزار واسط یا اضافه شدن یک سرور ذخیرهسازی جدید، دستکاری و تغییر داده شوند. مشکل اصلی زیرساختهای قابل تغییر، پدیدهی انحراف پیکربندی (configuration drift) است. با گذشت زمان و اعمال تغییرات مختلف، تنظیمات پیکربندی سرورها و سایر اجزای زیرساخت از پیکربندی اولیه دور میشود. همین موضوع باعث میشود که پیدا کردن و رفع باگها یا مشکلات عملکردی، سختتر شود. اما ترافورم زیرساختهای «ایستا» (immutable) را تأمین میکند. یعنی با هر تغییر در محیط، پیکربندی فعلی با یک پیکربندی جدید که تغییرات را در نظر گرفته، جایگزین و زیرساخت دوباره راهاندازی میشود. حتی، پیکربندیهای قبلی به عنوان نسخههای مختلف نگه داشته میشوند تا در صورت نیاز، امکان بازگشت به نسخههای قدیمی وجود داشته باشد.
معایب Terraform
در ادامه برخی از معایب Terraform را بررسی میکنیم:
انحراف پیکربندی (drift)
ترافورم برای مدیریت زیرساخت ابری شما، نیاز دارد تا از وضعیت فعلی منابع باخبر باشد. اما نگهداری از اطلاعات وضعیت فعلی در یک فایل مجزا از کد اصلی برنامه، میتواند در تیمهای بزرگ مشکلساز باشد؛ چون ممکن است بعضی افراد، فرایند Terraform را دور بزنند و تغییرات را مستقیما از طریق کنسول ارائهدهنده سرویس ابری اعمال کنند. این کار باعث بروز «انحراف پیکربندی» میشود، یعنی در این شرایط، فایل پیکربندی ترافورم با وضعیت واقعی زیرساخت ابری مطابقت ندارد.
یادگیری دشوار
ترافورم برای پیکربندی زیرساخت ابری، از زبان اختصاصی خودش به نام HCL (مخفف HashiCorp Configuration Language) استفاده میکند. این زبان میتواند برای افراد تازهکار کمی چالشبرانگیز و دشوار باشد. علاوه بر این ممکن است فرایند پیکربندی، در ارائهدهندگان خدمات ابری مختلف، متفاوت باشد.
راهاندازی سخت محیط
راهاندازی و مدیریت جداگانهی محیطهای مختلف با ترافورم میتواند کار زمانبر و مستعد خطا باشد. راهحلهای جایگزین مثل کپی کردن پیکربندی محیط “پروداکشن” برای محیطهای دیگر هم میتواند باعث افزایش هزینهها شود.
پیچیدگی دیباگ کردن
فرایند دیباگ و مدیریت خطاها در ترافورم میتواند پیچیده باشد. این موضوع به ویژه در استقرارهای بزرگ، بیشتر به چشم میآید.
وابستگی تیم توسعه به DevOps
زبان اختصاصی Terraform میتواند باعث شود که توسعهدهندگان نتوانند به طور مستقل زیرساخت مورد نیاز خود را مدیریت کنند و برای هر تغییری نیاز به همکاری با تیم DevOps داشته باشند. این موضوع میتواند سرعت فرایند توسعه را کاهش دهد.
Terraform چگونه کار میکند؟
در حالت کلی، ترافورم را میتوان تشکیل شده از دو بخش اصلی دانست:
- هسته ترافورم (Terraform Core)
- پلاگینها (Plugins)
هسته ترافورم (Terraform Core) وضعیت فعلی زیرساخت شما را بررسی کرده و آن را با پیکربندی ایدهآلی که تعریف کردهاید مقایسه میکند. بر اساس این مقایسه، Terraform Core یک برنامهریزی برای اضافه یا حذف کردن اجزای زیرساخت پیشنهاد میدهد. بعد از اینکه شما این برنامه را تایید کردید، ترافورم مسئول راهاندازی یا حذف منابع میشود.
پلاگینهای ترافورم به عنوان یک مترجم و واسطه برای ارتباط هسته ترافورم با زیرساخت یا سرویسدهندههای ابری عمل میکنند. ارائهدهندههای ترافورم (Providers) و «تأمینکنندههای منابع» (Provisioners)، مثالهایی از این پلاگینها هستند. لازم به ذکر است که هسته ترافورم از طریق فراخوانی رویه راه دور یا RPC (مخفف Remote Procedure Call) با این پلاگینها ارتباط برقرار میکند.
مهمترین کاربردهای ترافورم
اما کاربرد ترافورم چیست و برای چه استفاده میشود؟ در ادامه به سه مورد از کاربردهای ترافورم اشاره کردهایم:
تأمین زیرساخت ابری عمومی
یکی از مهمترین کاربردهای ترافورم، تأمین زیرساخت ابری عمومی برای ارائهدهندگان سرویس ابری است. ارائه زیرساخت مبتنی بر کد (IaC) برای این سرویسها، همواره یکی از اهداف اصلی Terraform بوده و همچنان بر همین رویه تمرکز دارد. این ابزار از طریق ارائهدهندهها به ابرهای مختلف متصل میشود و APIهای موجود و زبانهایی مانند Azure Bicep (مرتبط با مایکروسافت آژور) را به نحوی ترجمه میکند که با سینتکس ترافورم سازگار شوند.
استقرار در چند ابر به طور همزمان
دومین کاربرد ترافورم استقرار در چند ابر به طور همزمان است! این کاربرد منحصر به فرد، Terraform را از سایر ابزارهای IaC متمایز می کند و به مهندسان DevOps اجازه می دهد تا با استفاده از یک سینتکس واحد، منابع را در AWS، Azure، GCP و سایر ابرهای دیگر به طور کارآمد و مقرون به صرفه مستقر کرده و مدیریت کنند.
استقرار، مدیریت و هماهنگسازی منابع در سرویسدهندههای ابری اختصاصی
کاربرد سوم ترافورم، استقرار، مدیریت و هماهنگسازی منابع در سرویسدهندههای ابری دیگر است. ترافورم این امکان را فراهم میکند که ابزارها و APIهای موجود را به سینتکس اعلانی ترافورم تبدیل کنید.
به طور خلاصه باید گفت که ترافورم این امکان را فراهم میکند که از طریق IaC مدیریت تمامی اکوسیستم آیتی خود را به دست بگیرید و این اکوسیستم میتواند روی یک سرویس ابری، چند ابر یا هرگونه پیادهسازی سرور دیگر باشد.
اجزای اصلی ترافورم چیست؟
در ادامه به اجزای اصلی ترافورم و نقش هر کدام از آنها میپرازیم.
CLI ترافورم
ترافورم یک ابزار متنباز است که به صورت یک فایل باینری واحد کامپایل میشود. این فایل را میتوانید روی سیستم خود دانلود کرده و بطور مستقیم از طریق خط فرمان (command prompt) با آن کار کنید. برای دانلود آخرین نسخه کلیک کنید.
زبان ترافورم
هنگام کار با ترافورم، زیرساخت خود را با استفاده از زبان پیکربندی HCL (مخفف Hashicorp Configuration Language) تعریف میکنید. HCL یک زبان اعلانی (declarative) است که به طور خاص برای سرورها و ابزارهای DevOps طراحی شده است. این زبان، میان فرمتهای قابل خواندن توسط ماشین مثل JSON و فرمتهای پیکربندی که در زبانهای سطح بالا مثل Ruby پیدا میشود، تعادل خوبی را برقرار میکند. به عبارت دیگر، HCL هم برای ماشینها و هم تا حدی برای انسانها قابل درک است.
اجزای زیرساختی که توسط Terraform مدیریت میشوند، «Resources» (منابع) نام دارند. نمونههایی از این منابع شامل ماشینهای مجازی، جداول پایگاه داده، AWS S3 buckets، دیتاسنتر ابری زَس (VPC) و موارد دیگر میشود. هر بلاک «منبع» در HCL به تعریف و پیکربندی ویژگیهای آن منبع خاص کمک میکند.
ارائه دهندگان Terraform
ترافورم برای مدیریت درست زیرساخت، به برقراری ارتباط با زیرساخت اصلی شما (infrastructure host) نیاز دارد. زیرساختهای اصلی معمولا یک API عمومی دارند که کارهایی مثل ساختن، بهروزرسانی و حذف اجزای زیرساخت را راحتتر میکند.
برای اینکه Terraform بتواند به سرویسهای ابری یا نرمافزار مبتنی بر سرویس (SaaS) مورد نیازتان وصل شود، لازم است که در پیکربندی Terraform از ارائهدهندگان یا به عبارتی «Providers» استفاده کنید. این ارائهدهندگان به عنوان پلاگین در اختیار Terraform قرار میگیرند. این معماری مبتنی بر پلاگین، به ناشران امکان میدهد که ارائهدهندگان خود را به طور مستقل منتشر و نگهداری کنند.
تامینکنندگان ترافورم
تأمینکنندگان منابع (Provisioners) نوع دیگری از پلاگینهای قابل استفاده با ترافورم هستند که به آمادهسازی و پیکربندی نهایی زیرساخت برای سرویسدهی کمک میکنند. استفاده از تأمینکنندگان منابع کمی پیچیدتر از دیگر ابزارهای ترافورم است و همچنین ممکن است به سرویسهای حیاتی زیرساخت، دسترسی سطح بالایی نیاز داشته باشند. به همین دلیل، شرکت HashiCorp توصیه میکند که از تأمینکنندگان به عنوان آخرین راهحل و تنها بعد از بررسی تمام گزینههای دیگر با ابزارهای داخلی ترافورم استفاده کنید.
ماژولهای ترافورم
ماژولها در ترافورم به شما این امکان را میدهند که منابع مرتبط را به صورت یک بسته با هم گروه بندی کنید. هر پیکربندی ترافورم حداقل یک ماژول دارد که به عنوان ماژول ریشه (Root Module) شناخته میشود؛ اما میتواند ماژولهای دیگر را هم صدا بزند که به آنها ماژولهای فرزند (Child Module) گفته میشود.
ایجاد و به اشتراک گذاری ماژولها با تیم یا سایر افراد کار سادهای است. «رجیستری ترافورم» (Terraform registry) مجموعهای بزرگ از ماژولهای ترافورم برای سناریوهای پیکربندی رایج را در خود جای داده است. ترافورم میتواند به صورت خودکار این ماژولها را دانلود کند، به شرطی که آنها را در پیکربندی خود قرار دهید.
حالت ترافورم
در Terraform، یک فایل به اسم terraform.tfstate وجود دارد که به نوعی نقش یک بایگانی را بازی میکند. درون این بایگانی، Terraform، یک تصویر کلی از زیرساخت شما به همراه آبجکتها و وابستگیها را نگه میدارد. این بایگانی به فرایند تصمیمگیری در Terraform کمک میکند.
قیمت Terraform
اگر قصد استفاده از ترافورم را دارید، در جدول زیر هزینه و جزئیات پلنهای مختلف ترافرم را به طور خلاصه تشریح کردهایم.
سطح اشتراک | رایگان | استاندارد | پلاس | سازمانی |
قیمت (ماهانه) | رایگان | از ۰.۰۰۰۱۴ دلار به ازای هر ساعت برای هر منبع | نیاز به تماس با تیم ترافورم | نیاز به تماس با تیم ترافورم |
امکان پیادهسازی اختصاصی | ندارد | ندارد | ندارد | دارد |
ارائه زیرساخت به عنوان کد | دارد | دارد | دارد | دارد |
انتشار ماژول یکپارچه تست | ۵ ماژول | ۱۰ ماژول | نامحدود | نامحدود |
مدیریت تیم | ندارد | دارد | دارد | دارد |
تستهای ماژول تولید شده | ندارد | ندارد | بتا | ندارد |
اشتراک رجستری بین سازمانی | ندارد | ندارد | ندارد | دارد |
ثبت حسابرسی | ندارد | ندارد | دارد | دارد |
تشخیص انحراف پیکربندی | ندارد | ندارد | دارد | دارد |
اعتبارسنجی مداوم | ندارد | ندارد | دارد | دارد |
نسخهبندی مجموعههای سیاستها | ندارد | ندارد | دارد | دارد |
ثبت لاگها در سطح اپلیکیشن | ندارد | ندارد | ندارد | دارد |
پشتیبانی از همزمانی | ۱ | ۳ | ۱۰ | نامحدود (وابسته به قدرت منابع محاسباتی اختصاص داده شده) |
پشتیبانی و خدمات پریمیوم | ندارد | دارد | دارد | دارد |
مقایسه Terraform با ابزارهای زیرساخت دیگر
در حوزه «زیرساخت مبتنی بر کد» یا (IaC) ابزارهای مختلفی هستند که هر کدام نسبت به ترافورم مزایا و معایب خاص خود را دارند. در ادامه نگاهی به چند ابزار مهم IaC موجود میاندازیم و آنها را با Terraform مقایسه میکنیم.
تفاوت Kubernetes و Terraform چیست؟
درست است که ترافورم و کوبرنتیز هر دو ابزار قدرتمندی در دنیای رایانش ابری هستند، اما باید بدانید که این دو در سطوح مختلفی کار میکنند و نمیتوانند جایگزین یکدیگر باشند اما میتوانند در کنار هم به خوبی کار کنند.
Kubernetes یک سیستم متنباز برای مدیریت و سازماندهی کانتینرها است. این سیستم به توسعهدهندهها اجازه میدهد تا استقرار (deployment) برنامهها را روی گرههای (node) یک خوشه محاسباتی (compute cluster) زمانبندی کنند. Kubernetes همچنین به طور فعال روی کارهای کانتینری نظارت میکند تا مطمئن شود که وضعیت آنها با خواستههای کاربر مطابقت دارد. به عبارت دیگر، Kubernetes به شما کمک میکند تا چندین کانتینر را با هم به عنوان یک واحد مدیریت کنید و از اجرای درست و همیشگی آنها اطمینان حاصل کنید.
از طرفی، ترافورم در سطح بالاتری عمل میکند. به این معنی که منابع و پیکربندی آنها را در کل محیط ابری مدیریت میکند. Terraform میتواند ماشینهای مجازی، شبکه، پایگاه داده و سایر منابع را در ابرهای عمومی مختلف یا ابرهای خصوصی سازمان مدیریت کند.
به عبارت دیگر، ترافورم مثل یک معمار عمل میکند که کل زیرساخت را طراحی و مدیریت میکند. در حالی که Kubernetes مثل یک سرپرست کارگر است که روی سازماندهی و اجرای کار کانتینرها داخل خوشه تمرکز دارد.
بیشتر بخوانید: کوبرنتیز چیست؟
تفاوت Terraform و Ansible چیست؟
Ansible یک ابزار دیگر در IaC است که برای خودکار کردن پیکربندی و مدیریت سیستمها طراحی شده است. تفاوت اصلی این است که Ansible ابزاری برای راهاندازی زیرساخت نیست و از یک روش مرحلهای پیروی میکند. یعنی، کاربر باید به صورت دستی مراحل راهاندازی را مشخص کند.
این روش به کاربرهای DevOps کنترل بیشتری میدهد؛ اما نیاز به کار بیشتری هم دارد. Ansible برای راهاندازی سرورهایی که نرمافزار و بهروزرسانیهای لازم از قبل روی آنها تنظیم شده، مناسبتر است.
در حالی که ترافورم میتواند زیرساخت را از پایه راهاندازی و مدیریت کند. در نهایت، Terraform امکان مدیریت کل چرخه عمر زیرساخت را فراهم میکند؛ اما Ansible این قابلیت را ندارد.
بیشتر بخوانید: انسیبل چیست؟
مقایسه Terraform و Pulumi چیست؟
Pulumi یک ابزار متنباز محبوب در حوزه IaC هست که برای طراحی، راهاندازی و مدیریت منابع زیرساخت ابری به کار میرود. برعکس ترافورم، Pulumi از یک زبان برنامهنویسی خاص برای زیرساخت استفاده نمیکند و به کاربر اجازه میدهد تا با زبانهای گو، دات نت، جاوا اسکریپت و … زیرساخت را مدیریت کند.
همچنین، Terraform قوانین کدگذاری سختگیرانهای دارد؛ در حالی که Pulumi اینطور نیست و همین باعث میشود تا در بعضی مواقع انعطافپذیرتر باشد. با این حال، جامعه کاربری Pulumi بسیار کوچکتر از ترافورم است. یعنی، منابع و مستندات کمتری برای آن وجود دارد. با اینکه Pulumi انعطافپذیری بیشتری دارد، اما Terraform به طور کلی برای پروژههای بزرگ و گستردهتر، مناسبتر است.
مقایسه ترافورم و OpenTofu
OpenTofu یک نسخه متنباز از ترافورم با هدف ایجاد جایگزینی قدرتمند برای آن است، که قصد دارد قابلیتهای فعلی Terraform را گسترش دهد و ویژگیهای جدیدی ارائه کند. میتوان گفت، OpenTofu قرار است آیندهی دنیای Terraform باشد. در زیر به برخی از مزایایی اشاره میکنیم که با استفاده از OpenTofu بجای ترافورم خواهید داشت:
- ماهیت متن باز: هیچ محدودیتی برای استفاده از OpenTofu، چه برای اهداف تجاری و چه برای مصارف شخصی، وجود ندارد.
- جامعه فعال: مشارکت توسعهدهندگان باعث میشود OpenTofu به مرور زمان قویتر و انعطافپذیرتر شده و بتواند با سناریوهای مختلفی از زیرساخت مبتنی کد (IaC) سازگار شود. این مشارکتها به این صورت عمل میکند که باگها و مشکلات احتمالی به سرعت شناسایی و رفع میشوند. در نتیجه، ثبات و قابلیت اطمینان OpenTofu همیشه در سطح بالایی قرار میگیرد.
- پشتیبانی سریع و قابل اعتماد: همانطور که گفتیم، OpenTofu دارای یک جامعه قدرتمند و فعال است. این جامعه در توسعهی قابلیتها، تامین منابع و رفع باگها تاثیر بسیاری دارد. بنابراین، یک پشتیبانی قوی، سریع و قابل اعتماد را با استفاده از این ابزار تجربه خواهید کرد.
- ریسک پایین: OpenTofu تحت مجوز MPL (مخفف Mozilla Public License) منتشر شده و بخشی از بنیاد لینوکس به شمار میرود. این موضوع تضمین میکند که این ابزار برای همیشه کاملا متنباز باقی خواهد ماند.
گردش کار Terraform به زبان ساده
گردش کار ترافورم شامل سه مرحله زیر است:
مرحله 1: نوشتن
در اولین قدم از راهاندازی با ترافورم، شما باید منابع زیرساخت خود را به شکل کد با زبان پیکربندی HCL تعریف کنید.
مرحله 2: بررسی
پس از آن، ترافورم یک برنامهریزی به شما نشان میدهد که در مقایسه وضعیت موجود و وضعیت ایدهآل، چه منابعی باید اضافه یا حذف شوند.
مرحله 3: درخواست
در نهایت، شما میتوانید این برنامهریزی را قبول کرده، تا ترافورم منابع زیرساخت را اضافه یا حذف کند. بعد از قبول کردن این تغییرات، زیرساخت شما برای راهاندازی کامل با Terraform آماده میشود.
کلام آخر
در این مقاله، بررسی کردیم که ترافورم چیست و به طور خلاصه به ویژگیهای اصلی و کاربرد Terraform پرداختیم که به شما در شروع کار با این ابزار کمک میکند. علاوه بر این به معایب و مزیت های Terraform پرداختیم. استقرار، مدیریت و هماهنگسازی در محیط ابری یا چند ابری میتواند یک چالش بزرگ برای تیمهای DevOps باشد. اما استفاده از ترافورم میتواند این فرایند را سادهتر، ایمنتر و سریعتر کند. کاربرد Terraform به هیچ پلتفرم خاصی محدود نیست و تقریبا با هر ارائهدهنده سرویس ابری کار میکند.