Infrastructure as Code یا به اختصار IaC به مجموعه عملیاتی گفته میشود که طی آنها مدیریت زیرساخت (شامل تنظیمات شبکه، ماشینهای مجازی، سرورها و اِستک نرمافزاری) با یک زبان برنامهنویسی سطح بالا صورت میگیرد که در فضای کلود، IaC یکی از بخشهای لاینفک دوآپس است که ارتباط تنگاتنگی با Continuous Delivery دارا است.
در ارتباط با IaC نیاز است تا با اصطلاحی تحت عنوان Idempotence آشنا شویم که به مجموعه ویژگیهایی اشاره دارد که همواره یک پیکربندی یکسان را روی سرورها اِعمال میکند تا جایی که اگر قبلاً تنظیمات خاصی روی کلود پیادهسازی شده باشد، تمامی آنها را حذف کرده و تنظیمات جدید را جایگزین آنها میکند که همین مسئله منجر بدین خواهد شد تا تیم توسعهٔ نرمافزار این اطمینان را داشته باشد که کانفیگ مد نظرشان روی سرورها پیاده شده است و اگر هم بارها و بارها آن را اجرا کنند، خروجی یکسانی دریافت خواهند کرد.
IaC چه تفاوتهایی با Infrastructure Automation دارا است؟
ایدهٔ IaC تا حد بسیاری شبیه به Bash Scripting است که نوعی Infrastructure Automation میباشد که در آن یکسری کارهای تکراری توسط یک اسکریپت ساده انجام میشوند به طوری که مثلاً برای نصب یک پکیج خاص از طریق اسکریپت داریم:
#!/bin/bash
sudo apt-get install ruby-full build-essential
اما IaC پا را یک گام فراتر میگذارد بدین شکل که مثلاً در ابزاری همچون Ansible، که ابزاری زیرساختی است که کارهای متفاوتی انجام میدهد که یکی از آنها پیکربندی است، اسکریپتی به صورت زیر خواهیم داشت:
---
- name: Configure Raddit App Instance
hosts: all
become: true
tasks:
- name: Install Ruby
apt: "name={{ item }} state=present"
with_items:
- ruby-full
- build-essential
با توجه که اسکریپت فوق ساختاری همچون سورسکد دارا است، از نام Infrastructure as Code برایش استفاده میشود. به عنوان مثالی دیگر از کاربرد ابزار Ansible میتوان به نصب سیستم مدیریت پایگاه دادهٔ MySQL اشاره کرد سپس از درست اجرا شدنش اطمینان حاصل نمود، یک نام کاربری و رمز عبور ساخت، یک دیتابیس جدید ایجاد کرد و در نهایت دادههای غیرضروری را پاک کرد.
IaC چه مشکلاتی را مرتفع میسازد؟
فرض کنیم که به هر دلیلی سِروری از دسترس خارج میشود که در چنین شرایطی مجبور میشویم تا اِستک نرمافزاری را تکبهتک با مد نظر قرار دادن نسخههای مورد نیاز نصب نماییم که روی هم رفته چنین کاری بسیار زمانبَر و از طرفی پُرریسک میباشد و اینجا است که پای IaC به میان میآید.
همانطور که سورسکد یکسان همواره خروجی قابلاجرای یکسانی ایجاد میکند، یک IaC نیز همواره و در هر محیطی که قرار گیرد تنظیمات زیرساختی یکسانی را روی تجهیزات اعمال میکند تا جایی که بدون وجود IaC تیمهای مهندسی باید تکتک سرورها را به صورت دستی کانفیگ کنند و نیاز به توضیح نیست که بروز خطا و یا در بهترین حالت تفاوت در پیکربندی میان سرورهای مختلف اجتنابناپذیر خواهد بود و همین تضادها منجر به بروز مشکلات در پروسهٔ دیپلوی نرمافزار خواهد شد. در همین راستا، مزایای IaC را میتوان در سه دستهبندی کلی تقسیمبندی کرد که عبارتند از:
- کاهش هزینهها
- افزایش سرعت
- کاهش ریسک
وقتی دخالت عامل انسانی به حداقل برسد، مسلماً هزینههای جاری نیز کاهش خواهند یافت و از آنجا که کانفیگ سرورها به صورت خودکار و از طریق اجرای یک اسکریپت صورت میگیرد، مسلماً سرعت کار نیز افزایش مییابد مضاف بر اینکه فرآیند خودکارسازی بدین شکل ریسک خطای انسانی را کاهش میدهد.
IaC چگونه کار میکند؟
سازوکار IaC بدین صورت است که یک مُدل توسط یک زبان برنامهنویسی سطح بالا یا ابزارهای تخصصی این کار همچون Ansible توسط توسعهدهندگان ایجاد میگردد که با اجرایش روی بستر کلود، کلیهٔ تنظیمات مد نظر ایشان اِعمال میگردند. در همین راستا، سه رویکرد مختلف وجود دارد که عبارتند از:
- Declarative: این رویکرد بر روی «چهچیزی» متمرکز است بدین شکل که پیکربندی نهایی چهچیزی باید باشد. به عبارتی، این رویکرد وضعیت مطلوب را مشخص میسازد که پاسخگوی نیازها نرمافزاری خواهد بود.
- Imperative: این رویکرد بر روی «چگونه» متمرکز است با این توضیح که مشخص میسازد تنظیمات سرور چگونه باید دستخوش تغییر شوند تا نیازهای تیم توسعهٔ نرمافزار برآورده شوند. به عبارتی، این رویکرد ترتیب اجرای کامندها را تعیین میکند که در نهایت منجر به پیکربندی مد نظر خواهند شد.
- Intelligent: این رویکرد بر روی «چرا» متمکز است بدین صورت که چرا یک تنظیمات خاص باید اِعمال گردد. به عبارتی، این رویکرد وضعیت مطلوب نهایی را تضمین میکند.
در پایان لازم به یادآوری است که در توسعهٔ IaC دقیقاً همان روندهایی را به کار خواهیم برد که برای توسعهٔ سورسکد استفاده میشوند؛ به عبارت دیگر، تنظیمات پیکربندی سرورها را داخل ورژن کنترل ذخیره میکنیم تا قابلیت این را داشته باشیم که آن را بهروزرسانی کنیم و یا به ورژنهای قبلی باز گردیم مضاف بر اینکه سایر دولوپرها میتوانند کدی که ما به عنوان IaC نوشتهایم را مرور کرده، تست کنند و حتی بهبود بخشند.