terraform چیست و چه کاربردهایی دارد؟ افرادی که با مهندسی نرم افزار سروکار دارند، کمابیش با Terraform آشنا هستند. اما این ابزار چیست و چرا آشنایی با آن برای ما مهم است؟
Terraform یک ابزار زیرساخت مبتنی بر کد (یا IaC مخفف عبارت Infrastructure as Code) است که به مهندسان کمک میکند تا زیرساختهای نرمافزاری خود را به صورت کد تعریف کنند. البته، ایدهی تعریف زیرساخت مبتنی بر کد برای مهندسان چندان هم جدید نیست؛ با این حال، توانایی تهیهی زیرساخت از طریق Terraform یک روش قدرتمند است که با استفاده از آن میتوان سیستمهای توزیعشدهی بزرگ را به راحتی مدیریت کرد.
در این مقاله، ابتدا با زیرساخت مبتنی بر کد آشنا میشویم و سپس به این موضوع که Terraform چیست و چطور میتواند به ما در توسعهی برنامههایمان کمک کند میپردازیم. در ادامه نیز روش استفاده از آن را یاد میگیریم. بیایید این آموزش جالب را با یکدیگر شروع کنیم.
IaC یا Infrastructure as Code
زیرساخت مبتنی بر کد به شما کمک میکند تا از طریق برنامهنویسی، بتوانید زیرساختهای فناوری اطلاعات را تهیه و مدیریت کنید. برخلاف مدیریت زیرساخت دستی که در آن، تمامی منابع موردنیاز توسط یک انسان و به صورت دستی پیکربندی میشوند، در روش زیرساخت مبتنی بر کد، تیمهای DevOps یا تیمهای توسعهدهنده میتوانند تهیه، مدیریت و نظارت بر منابع موردنیاز را از طریق برنامهنویسی و به صورت خودکار انجام دهند. در واقع، با ترافورم این تیمها میتوانند تمام اجزای زیرساختهای مختلف را در قالب کد توصیف و ارائه کنند. کدهای نوشته شده در فایلهای پیکربندی (با نام config) قرار میگیرد و تمام اعضای تیم میتوانند این کدها را با یکدیگر به اشتراک گذاشته و آنها را دوباره استفاده کنند و در صورت نیاز، با بهروزرسانی، ورژنها را ارتقا دهند. با استفاده از این فایلها، یک گردش کاری ثابت ایجاد میشود و میتوان زیرساخت ابری یا مرکز داده و منابع آن را در طول چرخهی عمرشان به صورت کلی مدیریت کرد.
فایلهای پیکربندی Terraform به صورت اعلانی (declarative) هستند. این به این معنی است که در این فایلها، وضعیت پایان زیرساخت توصیف میشود. با استفاده از این ابزار، نیاز به نوشتن دستورالعملهای گامبهگام که فرایندی خستهکننده و وقتگیر است حذف شده و میتوان منابع زیرساخت موردنیاز را به راحتی ایجاد و مدیریت کرد.
این فایلهای پیکربندی، رابطهای برنامهنویسی برنامه یا همان APIها را برای پلتفرمهای ابری و سایر سرویسها کدگذاری کرده و انجام کارهای زیر را برای تیمهای توسعه راحتتر میکنند:
- تهیهی منابع از تمام ارائهدهندگان ابری؛
- اجرای حفاظهای امنیتی و انطباق آنها برای استانداردسازی زیرساختها؛
- همکاری و استفادهی مجدد از گردش کاری استاندارد و قابلاعتماد برای تهیهی زیرساختها؛
- ادغام زیرساخت self-service با VCS، ITSM و CI/CD.
با نصب Terraform میتوان اجزای زیرساختها از جمله منابع محاسباتی، ذخیرهسازی شبکه و اجزای سطح بالا مانند ورودیهای DNS را به صورت خودکار مدیریت کرد. همچنین از این ابزار برای خودکارسازی خطمشیهای فایروال، دیتابیس و سرورها استفاده میشود. یکی از مزایای Terraform کیت توسعهی ابری Terraform (CDKTF) است که به تیمهای توسعه کمک میکند تا زیرساختها با زبانهای برنامهنویسی مانند TypeScript، Python، Go، C# و جاوا را مدیریت کنند.
Terraform چیست؟
در این بخش، به طور خلاصه به بررسی این موضوع میپردازیم که Terraform چیست؟
Terraform یک ابزار IaC است که تیمهای توسعه از آن برای خودکارسازی وظایف مختلف زیرساختها استفاده میکنند. به عنوان مثال، یکی از مهمترین موراد استفاده از Terraform تأمین منابع ابری است. این یک ابزار منبع-باز و ابری است که با زبان برنامهنویسی GO نوشته شده و توسط تیم HashiCorp ایجاد شدهاست.
با استفاده از Terraform شما میتوانید زیرساختهای موردنیازتان را در قالب کد توصیف کنید. حتی اگر سرورهای شما از ارائهدهندگان مختلفی نظیر AWS یا Azure باشند نیز Terraform به شما کمک میکند تا این منابع را به صورت موازی بین ارائهدهندگان بسازید و آنها را مدیریت کنید.
به طور خلاصه، Terraform را میتوانید به عنوان یک زبان مشترک و بافت همبند در نظر بگیرید که میتوان از آن برای کل پشتهی IT استفاده کرد.
Terraform چگونه کار میکند؟
همانطور که در بخشهای قبلی اشاره کردیم، ترافورم از APIها برای ایجاد و مدیریت خودکار منابع زیرساخت استفاده میکند. تمامی ارائهدهندگان اصلی خدمات ابری، APIهای قابل دسترسیای که با Terraform کار میکنند را ارائه میدهند. لیست همهی این ارائهدهندگان در وبسایت Terraform Registry موجود است. در این وبسایت انواع ماژولها، کتابخانههای خطمشی و وظایفی که تیمها از طریق کد میتوانند برای استقرار سریع پیربندیهای زیرساخت مشترک و مدیریت خودکار استفاده کنند را به صورت فهرست پیدا میکنید.
گردش کار یا همان جریان کار ترافورم در 3 مرحله انجام میشود. در مرحلهی 1، منابع موردنیاز توسط کاربر در فایلهای پیکربندی تعریف میشوند؛ یا به عبارتی دیگر نوشته میشوند. این منابع میتوانند در چندین محیط داخلی یا ابری و چندین ارائهدهندهی و خدمات مختلف باشند. پس از بررسی و تأیید مراحل موردنیاز توسط کاربر، مرحلهی 2 آغاز میشود. در این مرحله، Terraform یک برنامهی اجرایی ایجاد میکند تا اقداماتی را که برای ایجاد یا بهروزرسانی زیرساخت انجام میدهد را توصیف کند.
قبل از ایجاد تغییرات در زیرساخت، طرح باید توسط کاربر تأیید شدهباشد. پس از تأیید، مرحلهی 3 که اعمال است شروع شده و ترافورم تمام عملیات پیشنهادی را به ترتیبی که داده شدهاست، انجام میدهد. البته، Terraform همیشه قبل از ایجاد تغییرات، وابستگیهای منابع را بررسی میکند. به عنوان مثال، در صورتی که کاربر تعداد ماشینهای مجازی را در ابر خصوصی مجازی (VPC) تغییر دهد، Terraform ابتدا VPC را دوباره ایجاد کرده و سپس ماشینهای مجازی را افزایش میدهد.
زمانی که مشارکتکنندگان بیشتری به تیم توسعهدهندگان اضافه میشوند، اهمیت اعمال تغییرات به صورت متوالی و بدون همپوشانی، بیشتر به چشم میآید. Terraform با ارائهی نسخههای Enterprise و Cloud برای تیمها، به همکاری بهتر و موثرتر اعضای تیم کمک میکند؛ زیرا تمام اعضای تیم میتوانند حالتها و ورژنهای مختلف را از راه دور ذخیره کرده تا همه بتوانند به جدیدترین تغییرات دسترسی داشتهباشند.
Cloud به عنوان یک سرویس میزبان در دسترس است. Enterprise نیز شما را قادر میسازد تا نسخهی Cloud را در نمونهی خصوصی مستقر کرده و آن را شخصاً میزبانی کنید؛ یعنی نویسندگان، کد خود را به یک سیستم کنترل نسخهی مرکزی ( مانند گیت هاب) میفرستند و Cloud از آخرین نسخههای کد موجود در مخزن مرکزی استفاده میکند.
ویژگیهای کلیدی Terraform چیست؟
در این قسمت از آموزش Terraform چیست به معرفی ویژگیهای اصلی آن میپردازیم:
- زیرساخت مبتنی بر کد: متخصصان فناوری اطلاعات از زبان پیکربندی سطح بالای ترافورم که HCL نام دارد برای توصیف زیرساختهای فایلهای پیکربندی توصیفی و قابلخواندن برای انسان استفاده میکنند. این ابزار به شما کمک میکند تا یک طرح اولیه ایجاد کرده و با نسخهسازی یک الگو، آن را به اشتراک بگذارید و در صورت نیاز، بارها و بارها استفاده کنید.
- برنامههای اجرایی: پس از توصیف زیرساختها توسط کاربر، ترافورم یک برنامهی اجرایی را ایجاد میکند که قبل از شروع هرگونه تغییری، از کاربر یک تأییدیه میخواهد. در این مرحله، کاربر میتواند قبل از انجام کار بر روی زیرساختها، تغییرات را بررسی کرده و در صورت نیاز، قسمتی از آن را دوباره ایجاد، بهروزرسانی و یا حذف کند.
- نمودار منبع: ترافورم با ایجاد و ارائهی یک نمودار منبع به کاربر، منابع غیروابسته را به صورت موازی ایجاد کرده و یا آنها را تغییر میدهد. با استفاده از این نمودار، منابع تا حد امکان به صورت کارآمد ساخته میشوند و در عین حال، کاربران دید بهتری نسبت به زیرساختهایشان دارند.
- تغییر فرایند خودکارسازی: ترافورم قادر است به صورت مجازی و بدون تعامل انسانی، مجموعهای از تغییرات پیچیده را در زیرساختها پیادهسازی کند. پس از اینکه کاربر اقدام به بهروزرسانی فایلهای پیکربندی میکند، Terraform متوجه تغییرات میشود و یک برنامهی اجرایی افزایشی ایجاد میکند تا وابستگیهای موردنیاز حفظ شوند.
کاربرد Terraform چیست؟
اولین و شاید مهمترین کاربر اصلی Terraform، ارائهی ابر عمومی (public cloud) در یکی از ارائهدهندگان اصلی است. این ابزار بر روی ارائهی IaC برای خدماتی نظیر AWS و Azure تمرکز دارد و استفاده از این خدمات ابری عمومی را از طریق یک پلاگین که APIهای موجود و زبانهایی مانند Azure Bicep را پشتیبانی کرده و نحو ترافورم را ایجاد میکند، امکانپذیر کرده است.
کاربرد دوم ترافورم راحتترکردن فرایند استقرار چند-ابری است. این ابزار برخلاف سایر رقبای IaC خود، به طور همزمان در تمام ارائهدهندگان ابری عمل میکند. با داشتن قابلیت استقرار در چندین ارائهدهندهی ابری، مهندسان میتوانند از یک نحو بدون آشنایی با ابزارها و فناوریهای متعدد استفاده کنند.
سومین کاربرد رایج این ابزار استقرار، مدیریت و هماهنگی منابع با ارائهدهندگان ابر سفارشی است. ارائهدهنده، روشی در ترافورم است که از آن برای بستهبندی یک API موجود و تبدیل آن به نحو اعلانی استفاده میشود. در این روش، لازم نیست که حتماً از AWS یا یکی از سرویسهای ابری اصلی استفاده کنید. همچنین، ارائهدهندگان میتواند برای موارد استفادهی داخلی مانند تبدیل ابزارها یا APIهای موجود به ترافورم نوشته شوند.
به طور کلی، کاربردهای Terraform در کمک به مدیریت کل اکوسیستم فناوری اطلاعات از طریق IaC خلاصه میشود.
مزایای IaC
با کمک IaC دیگر نیازی به رویههای عملیاتی استاندارد و تلاشهای دستی برای مدیریت منابع فناوری اطلاعات نداریم و میتوانیم تمامی فرایندها را با خطوط کد به صورت خودکار درآوریم. به عبارتی دیگر، IaC به جای پیکربندی دستی گرههای ابری یا سختافزارهای فیزیکی، مدیریت زیرساخت فرایندها را از طریق کد منبع، خودکارسازی میکند.
در این قسمت، چند مورد از مهمترین مزایای Terraform که از راهحل IaC استفاده میکند را با یکدیگر میخوانیم:
- سرعت و سادگی: IaCها با حذف فرایندهای دستی و ایجاد تحول در نحوهی مدیریت، کار را برای توسعهدهندگان راحتتر کردهاند. به عبارت دیگر، IaC چرخهی حیات کل معماری زیرساخت را با اجرای سادهی یک اسکریپت فراهم کرده است.
- بهبود همکاری بین تیم: تمام اعضای مختلف تیم میتوانند در نرمافزار IaC مانند همان روشی که در گیت هاب با یکدیگر تعامل میکردند، همکاری داشته باشند. در این نرم افزارها میتوانید کد را به سیستمهای ردیابی موضوع پیوند دهید تا همکاران دیگر از آن استفاده کرده یا آن را بروزرسانی کنند.
- کاهش خطا: در زمان تهیهی زیرساخت با استفاده از IaC احتمال خطا به طرز قابل توجهی کاهش مییابد. IaC تنظیمات شما را استاندارد کرده و به برنامهها اجازه میدهد تا بدون نیاز به نظارت دائمی سرپرست، به راحتی اجرا شوند.
- بازیابی فاجعه: همانطور که میدانید، پس از فروپاشی سیستم، زیرساختهایی که به صورت دستی ساخته شدهاند، باید به صورت دستی بازیابی شوند. از آنجایی که ایجاد زیرساختها در IaC به صورت خودکار انجام میشوند، میتوانید به راحتی اسکریپتها را دوباره اجرا کرده و دقیقا همان نرم افزار را دوباره بازیابی کنید.
- امنیت پیشرفته: با خودکارسازی فرایندها در IaC تمام خطاهای انسانی به صورت خودکار حذف میشوند و در نتیجه، امنیت کلی معماری محاسباتی و دادههای مرتبط ارتقا مییابد.
از مزایای دیگر IaC میتوان به سرعت بالا، دقت زیاد و داشتن دید بهتر نسبت دادهها اشاره کرد.
اجزای اصلی Terraform چیست؟
Terraform از دو جزء اصلی ساخته شده است:
هستهی ترافورم (Terraform Core)
هستهی Terraform وظیفهی نظارت بر خواندن و درونیابی فایلهای پیکربندی، اجرای طرح منابع، ویژگیهای مدیریت حالت و رسم نمودار منابع را برعهده دارد. این هسته، از فایلهای باینری کامپایل شدهای که به زبان Go نوشته شدهاند، تشکیل شدهاست.
پلاگین ترافورم (Terraform Plugin)
پلاگینها یا همان افزونههای Terraform، منابعی را برای سرویسهای خاص تعریف میکنند. به عنوان مثال، راهاندازی کتابخانههای مورداستفاده برای برقراری تماسهای APIها و احراز هویت ارائهدهندگان زیرساخت از جمله وظایف پلاگینهای Terraform است. این پلاگینها مانند هستهی Terraform در زبان برنامهنویسی Go و به عنوان باینریهای اجرایی برای یک سرور خاص یا به عنوان یک تأمینکننده (provisioner) نوشته میشوند.
ارائهدهندگان به افزونههایی که انواع منابع را پیادهسازی میکنند، گفته میشود. این افزونهها حاوی تمام کدهای لازم برای احراز هویت و اتصال به یک سروی خاص هستند. ترافورم از 100 ارائهدهندهی ابر مانند Alibaba Cloud، AWS، Azure، Google Cloud Platform، Kubernetes و غیره پشتیبانی میکند.
هر ارائهدهنده میتواند رابط با یک API خاص، ارائهدهندگان SaaS و ارائهدهندگان ابر را فعال کند و منابع تعریفشده را در معرض دید قرار دهد. صرفنظر از اینکه کدام ارائهدهنده که استفاده میشود، منابع با زبان پیکربندی HCL تعریف میشوند.
شما میتوانید پس از پیداکردن ارائهدهندگان مناسب برای پلتفرم و سرویس ابری، آنها را به پیکربندی خود اضافه کنید. پس از اضافهکردن ارائهدهندگان، میتوانید از منابعشان برای ارائهی زیرساختهای خود استفاده کنید.
خوشبختانه، افزونههای Terraform برای تقریباً هر ارائهدهندهی بزرگی در دسترس هستند. علاوهبراین، این افزونهها توسط کل جامعهی ترافورم و سازمانهای فردی توسعهیافته، پشتیبانی میشوند.
تفاوت Kubernetes و Terraform چیست؟
گاهی اوقات، افراد برای انتخاب بین ترافورم و Kubernetes بر سر یک دوراهی قرار میگیرند. حقیقت این است که این دو ابزار نمیتوانند جایگزین یکدیگر باشند و شما میتوانید آنها را با یکدیگر استفاده کنید.
در واقع، Kubernetes یک سیستم ارکستراسیون کانتینر منبع-باز است که به توسعهدهندگان کمک میکند تا اسقرارها را بر روی گرهها در یک خوشه محاسباتی برنامهریزی کرده و به طور فعال، بارهای کانتینری را مدیریت کنند. با استفاده از این ابزار، کاربران میتوانند مطمئن شوند که وضعیت آنها با اهدافشان مطابقت دارد.
از آن طرف، Terraform را داریم که یک ابزار زیرساخت مبتنی بر کد است که با دسترسی گستردهای که به توسعهدهندگان میدهد، آنها را قادر میسازد تا زیرساختهای کاملی را که چندین ابر عمومی و ابر خصوصی را در میگیرد، به صورت خودکار ایجاد و مدیریت کنند.
ترافورم میتواند قابلیتهای IaaS، PaaS و حتی SaaS را خودکار کرده و آنها را مدیریت کند و تمام این منابع را به صورت موازی در تمام این ارائهدهندگان بسازد. شما میتوانید از Terraform برای خودکارسازی ارائهی Kubernetes و برای خودکارسازی استقرار برنامهها در یک خوشه استفاده کنید.
مقایسه Terraform در برابر ابزارهای زیرساخت دیگر
جایگزینهای مختلفی برای Terraform در بازار IaC وجود دارد که هر کدام دارای مزایاومعایب و موارد استفاده خاص خودشان هستند. در اینجا، به بررسی تعدادی از ابزارهای اصلی IaC موجود در بازار میپردازیم.
مقایسه ترافورم و انسیبل
انسیبل یک ابزار IaC است که توسعهدهندگان از آن برای خودکارسازی پیکربندی و مدیریت سیستم استفاده میکنند. تفاوت اصلی Ansible با ترافورم در این است که Ansible یک ابزار تأمینکننده نیست و از یک رویکرد رویهای استفاده میکند. این به این معنی است که کاربران باید مراحل تهیه را به صورت دستی مشخص کنند.
کاربران توسعهدهنده با استفاده از Ansible کنترل بیشتری بر روی نرمافزارهای خود دارند؛ با این حال، حجم کاریشان افزایش مییابد. از Ansible معمولاً برای تهیهی سرورها با نرمافزار مناسب و بهروزرسانیهایی که قبلاً پیکربندی شدهاند، استفاده میشود.
در مقابل، میتوانیم از ترافورم برای راهاندازی و هماهنگی زیرساختها استفاده کنیم. همچنین، مدیریت کامل چرخهی حیات یک نرمافزار با استفاده از Terraform امکانپذیر است؛ در حالی که در Ansible همچین قابلیتی وجود ندارد.
مقایسه ترافورم و Pulumi
Pulumi یک ابزار منبع-باز IaC است که توسط کاربران زیادی در سراسر جهان استفاده میشود. این ابزار برای طراحی، استقرار و مدیریت منابع زیرساختهای ابری استفاده میشود. Pulumi برخلاف Terraform از زبان نرمافزاری مخصوص دامنه استفاده نمیکند و به کاربران اجازه میدهد که در محیطهای برنامهنویسی مختلفی مانند JavaScript، GO و.NET و غیره مستقر شوند.
همانطور که میدانید، Terraform از دستورالعملهای کدنویسی سختگیرانهای پیروی میکند. این در حالی است که در Pulumi چنین نیست و در سناریوهای خاص، انعطافپذیریهای بیشتری را مشاهده میکنیم. با این حال، جامعهی Pulumi کوچکتر از جامعهی ترافورم است و به همین دلیل، اسناد کمتری از این ابزار در اینترنت موجود است.
به طور کلی، هر چه دامنهی استقرار بیشتر باشد، لزوم استفاده از Terraform بیشتر به چشم میآید.
جمعبندی
چرا در زمان نوشتن کد یک برنامه، باید مجبور باشیم که زیرساختها و فرایندها را به صورت دستی تهیه کنیم؟ واقعیت این است که مجبور نیستیم! زیرساختهای مبتنی بر کد مانند Terraform را میتوان در فرایندهای توسعه برای تست، استانداردسازی و مقیاسپذیری استفاده کرد. اکوسیستم زیرساخت مدرن مبتنی بر کد به توسعهدهندگان کمک میکند تا مدیریت و تهیهی منابع موردنیازشان را با سهولت و در زمان کمتری انجام داده و تعامل بهتری با اعضای تیمشان داشته باشند.