توی این مطلب میخوایم سری بزنیم به حوزهی جذاب و تقریبا بروز infrastructure as code و دوتا از بهترین ابزارها توی این زمینه یعنی Terraform و Ansible
اینها ابزارهایی هستند برای تهیه؛ پیکربندی؛ نگهداری و مانیتورینگ زیرساخت هایی که برای توسعه و استقرار سرویسها و برنامه ها استفاده میشن.
همونجور که توی مطالب قبلی هم اشاره کردیم؛ در زمان های قبلتر فرآیند توسعه بیشتر بصورت آبشاری بوده و شامل چرخهای طولانی برای رسیدن به یک release بوده و آپدیتها دیربه دیر و تفاوت خروجیها در هر آپدیت زیاد بود.ولی امروزه با فراگیری پارادایم و الگوی توسعه چابک شرایط دستخوش تغییر شده و باعث بهوجود اومدن مفاهیم جدیدی مثل IaC یا Infrastructure as Code شده.
پیش از این در رویکرد سنتی سرورها بصورت دستی کانفیگ میشدن و همین باعث میشد تیم توسعه درگیر overhead هایی مثل تهیه داکیومنت دقیق جزئیات برای هر سرور بشه یا سازمان نیازمند یک تیم بزرگ برای ارائه خدمات زیرساخت باشه؛ همچنین باعث طولانیتر شدن بیاندازه چرخه توسعه و افزایش وابستگی بین تیمهای توسعه میشد.
هدف از IaC رفع این مشکلات با حذف کانفیگهای دستی و استفاده از کد برای تهیه و کانفیگ سرور هست. اسکریپتهایی که به صورت کد توسعه داده میشن و میتونن با کنترل نسخه مدیریت بشن؛ و هرزمان نیاز شد ازشون برای کانفیگ سرورها استفاده کرد. همچنین به راحتی بین تیمها به اشتراک گذاشته میشن و هرکس میتونه دقیق از اتفاقاتی که روی هر سرور داره میوفته باخبر باشه.
هر دو ابزار Terraform و Ansible برای رفع نیازها در توسعه زیرساخت استفاده میشن و در راستای اهداف IaC هستند و تقریبا توی همه موارد میتونن جای همدیگه استفاده بشن ولی درنهایت تفاوتهایی دارن که باعث میشه از هرکدوم توی زمینههای متفاوتی استفاده کنیم.
از ترافورم معمولا برای Provisioning یا ساخت ماشینهای مجازی براساس نیازهای ما استفاده میشه. مثلا به ۳ سرور با منابع متفاوت داریم برای ساخت این ماشینها روی سرور اختصاصی خودمون از ترافورم استفاده میکنیم. ترافورم قبل از ایجاد تغییر شرایط موجود روی سرور رو بررسی میکنه و بعد از اون با توجه به تغییراتی که تعریف شده و انتباق اونها با شرایط موجود یک سری دستورالعمل تدارک میبینه و اونها رو اجرا میکنه. حالا مثلا بعد از چند روز متوجه شدیم توی نیازمندی هامون اشتباه کردیم و نیازی به ۳ سرور نیست و بناداریم یکی از اون هارو حذف کنیم یا مثلا یکی از سرورها نیاز به منابع بیشتری داره؛ توی این شرایط هم میشه در ترافورم دستورالعمل هایی تعریف کرد که نیازهای مارو برطرف کنه.
انسیبل یک سرویس متنباز هست که توسط Red Hat توسعه داده شده و موارد استفادهاش بیشتر برای کانفیگ کردن محیط سرور و استقرار(Deploy) برنامهها و سرویس ها روی سرور هست. یا مثلا اجرای یک پالیسی امنیتی روی همهی سرورهای مدنظر(مثلا بلاک کردن یک آیپی روی ۱۰ تا سرور یا نصب پیشنیازها برای دیپلوی یک سرویس روی سرور)
از تفاوتهای عمده انسیبل و ترافورم میشه به Stateful/Stateless بودن اونها اشاره کرد
ترافورم یک پلتفرم Stateful هست به این معنا که State سرورهارو بهخاطر میسپاره و مثلا اگه یک تابع به اشتباه چندبار روی یک سرور اجرا شه ترافورم قابلیت تحلیل شرایط موجود روی سرور رو داره و فقط یکبار اون رو اجرا میکنه ولی انسیبل Stateless هست و اهمیتی به شرایط موجود روی سرور نمیده(واضح هست که نمیتونه چند بار مثلا یک سرویس رو نصب کنه و چک میکنه نصب بودن رو:)).
یک تفاوت خیلی مهم بین این دو Procedural و Non-Procedural بودن اونهاس
توی انسیبل ما با یک ساختار پرسیجرال روبرو هستیم که میشه توش براساس شرایط موجود روی سرور به برنامه دستورات جداگانه داد. مثلا میشه مشخص کرد که اگه روی سرور سیستمعامل Ubuntu نصب بود از دستورالعملA استفاده بشه و اگر از CentOS بود از دستورالعمل B. یا مثلا برای فرآیندهای تکراری میشه از حلقه(Loop) استفاده کرد.
ولی توی ترافروم ما باید فقط اون چیزی که باید روی سرور وجود داشته باشه رو تحویل برنامه بدیم و اون خودش بر اساس شرایط موجود عمل کنه. در عمل امکان توصیف مجموعهای از دستورات و توابع برای رسیدن به هدفمون رو نداریم.
درنهایت باید بسته به نیاز از هرابزار توی جای درستش استفاده کرد.
قطعا برای یادگیری و استفاده از اونها بهتون داکیومنت های هرکدوم رو پیشنهاد میکنم ولی سعی میکنم توی مطالب بعدی یک introduction برای هرکدوم براتون بنویسم:).