هیچکس دقیقاً نمیداند روی سرورها چه تغییری داده شده
تغییرات دستی کمکم سرورهای مشابه را متفاوت میکند (Configuration Drift) و خطاها فقط در production دیده میشوند. وقتی تنظیمات کد باشد، هر تغییر در Git ثبت و بازبینی میشود.
Infrastructure as Code یعنی سرورها، ماشینهای مجازی، شبکه و تنظیمات آنها در فایلهای کد تعریف شوند و مثل کد نرمافزار در Git نسخهبندی و بازبینی شوند. کانفیگ سرور زیرساخت شما را با Terraform یا OpenTofu و Ansible به کد تبدیل میکند تا هر محیط را بشود تکرارپذیر، مستند و با امکان بازگشت دوباره ساخت.
تغییرات دستی کمکم سرورهای مشابه را متفاوت میکند (Configuration Drift) و خطاها فقط در production دیده میشوند. وقتی تنظیمات کد باشد، هر تغییر در Git ثبت و بازبینی میشود.
دنبال کردن چکلیست دستی کند و خطاپذیر است. با ماژول Terraform و Playbook آماده، محیط جدید با یک دستور و هر بار یکسان ساخته میشود.
اگر کارشناس اصلی در دسترس نباشد، بازیابی ساعتها طول میکشد. زیرساخت کدشده خودش مستند است و محیط از روی کد بازسازی میشود.
کد زیرساخت را طوری مینویسیم که تیم شما بتواند آن را بخواند، تغییر دهد و بعد از تحویل نگهداری کند.
منابع را بهصورت اعلانی تعریف میکنیم و پیش از هر تغییر میبینید دقیقاً چه چیزی ساخته، تغییر یا حذف میشود.
Ansible بستهها، کاربران، سرویسها و سختسازی سرورهای لینوکس را بدون نصب Agent و از طریق SSH پیکربندی میکند و چکلیست آن با امنسازی سرور هماهنگ است.
فایل State نقشه زیرساخت واقعی است. اگر گم شود یا همزمان ویرایش شود، Terraform تصمیم اشتباه میگیرد.
دسترسی از ایران به بخشی از سرویسهای HashiCorp ممکن است محدود یا ناپایدار باشد، چون HashiCorp طبق قوانین کنترل صادرات آمریکا دسترسی کشورهای تحریمشده را محدود میکند.
هیچ تغییری مستقیم روی سرور اعمال نمیشود و مسیر همیشه از Merge Request میگذرد. اجرای خودکار آن در پیادهسازی CI/CD انجام میشود.
لازم نیست همهچیز از صفر ساخته شود و منابع فعلی را مرحلهای زیر مدیریت کد میآوریم.
Infrastructure as Code یعنی وضعیت زیرساخت، از ماشین مجازی و شبکه تا کاربران و سرویسهای داخل سرور، در فایلهای متنی نوشته شود و هر تغییر از مسیر Git، بازبینی و اجرای خودکار بگذرد. Terraform و OpenTofu اعلانی کار میکنند: وضعیت نهایی را توصیف میکنید و ابزار تفاوت آن با وضعیت فعلی را اعمال میکند. Ansible Taskها را به ترتیب و با ماژولهای Idempotent اجرا میکند، پس اجرای دوباره Playbook روی سروری که درست تنظیم شده تغییری ایجاد نمیکند. نتیجه، محیطهای یکسان، تاریخچه قابل ردیابی تغییرات و بازسازی سریع پس از خرابی است.
لازم نیست کل زیرساخت یکجا به کد تبدیل شود. کارهایی را انتخاب کنید که بیشترین تکرار یا خطا را دارند، مثل ساخت ماشین مجازی جدید، تنظیمات پایه و سختسازی سرورهای لینوکس یا تعریف کاربران و کلیدهای SSH. منابعی را که از قبل وجود دارند با Import به State اضافه کنید و کد را تا جایی با وضعیت فعلی تطبیق دهید که plan هیچ تغییری نشان ندهد. از آن به بعد تغییرات فقط از مسیر کد انجام میشود و تشخیص Drift زمانبندیشده، تغییری را که کسی مستقیم روی سرور داده نشان میدهد.
در بیشتر پروژهها Terraform یا OpenTofu ماشینها، شبکه و DNS را از طریق API بستر، مثل Proxmox یا VMware vSphere، میسازد و Ansible داخل همان ماشینها را از طریق SSH پیکربندی میکند. آدرس ماشینهایی که Terraform ساخته میتواند Inventory Ansible را بسازد تا فهرست سرورها دو جا نگهداری نشود. ماژولها را برای dev، stage و production یکسان بنویسید و فقط متغیرها را تغییر دهید. Roleهای Ansible را برای سرویسهای تکراری بسازید و رمزها را در Ansible Vault نگه دارید. سختسازی سرورها در Roleها بر اساس چکلیست امنسازی سرور نوشته میشود و طراحی خود بستر مجازی در خدمات مجازیسازی سرور انجام میشود.
OpenTofu انشعاب متنباز Terraform است که پس از تغییر لایسنس Terraform به BSL زیر نظر بنیاد لینوکس ساخته شد. بیشتر کدهای Terraform بدون تغییر یا با تغییر کم روی آن اجرا میشوند. برای پروژههای جدید OpenTofu را پیشنهاد میکنیم و در پروژههایی که Terraform دارند، مهاجرت را بر اساس Providerهای مورد استفاده بررسی میکنیم.
فایل State نقشه زیرساخت واقعی است. اگر گم شود، Terraform منابع موجود را نمیشناسد و اگر دو نفر همزمان apply کنند، State خراب میشود. State را روی Remote Backend، مثل MinIO سازگار با S3 یا GitLab، با قفل همزمانی نگه دارید، برای هر محیط State جدا بسازید و از آن بکاپ منظم بگیرید. ساختاری که معمولاً برای مخزن پیشنهاد میکنیم این است:
در جریان GitOps هیچ تغییری مستقیم روی سرور اعمال نمیشود. تغییر در Merge Request پیشنهاد میشود، Pipeline دستور plan را اجرا میکند تا بازبین ببیند چه چیزی ساخته، تغییر یا حذف میشود و apply فقط پس از تأیید انجام میشود؛ ساخت این Pipeline در پیادهسازی CI/CD انجام میشود. برای Kubernetes همین جریان با Argo CD یا Flux اجرا میشود و وضعیت کلاستر با مخزن هماهنگ میماند.
دسترسی از ایران به بخشی از سرویسهای HashiCorp ممکن است محدود یا ناپایدار باشد، چون HashiCorp طبق قوانین کنترل صادرات آمریکا دسترسی کشورهای تحریمشده را محدود میکند. به همین دلیل OpenTofu مسیر پیشنهادی ما برای پروژههای جدید است. نسخه Providerها را با .terraform.lock.hcl قفل میکنیم و Providerهای متنباز و Collectionهای Ansible مورد نیاز را در Mirror داخلی نگه میداریم تا اجرای کد به دریافت لحظهای از رجیستری خارجی وابسته نباشد.
تعداد و تنوع منابع، بسترهای درگیر، نیاز به Import زیرساخت موجود و اتصال به Pipeline پایه برآورد هستند. Import منابعی که سالها دستی تغییر کردهاند معمولاً از نوشتن کد برای محیط جدید زمان بیشتری میگیرد، چون هر تفاوت کد با وضعیت واقعی باید بررسی شود. مرور روش اعمال تغییر از مسیر کد با تیم هم بخشی از تحویل است. برای برآورد، بسترها، تعداد سرورها، ابزارهای فعلی و کارهای دستی تکراری تیم را بفرستید تا پس از بررسی اولیه قیمت اعلام شود.
فایل State ممکن است رمزها و مقادیر حساس را بهصورت متن ساده نگه دارد. آن را داخل Git قرار ندهید و دسترسی به Remote Backend را فقط به Pipeline و افراد مسئول بدهید.
در بیشتر پروژهها Terraform و Ansible کنار هم به کار میروند: Terraform زیرساخت را میسازد و Ansible داخل آن را پیکربندی میکند.
| معیار | Terraform / OpenTofu | Ansible |
|---|---|---|
| کاربرد اصلی | ساخت و تغییر منابع مثل ماشین، شبکه و DNS | پیکربندی سیستمعامل و نصب نرمافزار |
| روش کار | اعلانی؛ وضعیت نهایی را توصیف میکنید | اجرای Taskها به ترتیب با ماژولهای Idempotent |
| نگهداری وضعیت | فایل State دارد | State ندارد و هر بار وضعیت را بررسی میکند |
| اتصال | از طریق API مجازیساز یا ارائهدهنده | SSH برای لینوکس و WinRM برای ویندوز، بدون Agent |
| مثال | ساخت ده ماشین روی Proxmox با یک ماژول | نصب و سختسازی Nginx روی همان ماشینها |
منابع، سرورها، تنظیمات تکراری و کارهای دستی فعلی را بررسی میکنیم و بخشهایی را که بیشترین خطا یا زمان را میگیرند انتخاب میکنیم.
ساختار مخزن، ماژولها و Roleها، محل State، مدیریت رمزها و روش بازبینی تغییرات را تعیین میکنیم.
کد را اول روی محیط تست اجرا میکنیم، نتیجه را با وضعیت فعلی مقایسه میکنیم و بعد منابع production را مرحلهای زیر مدیریت کد میآوریم.
مخزن کد، مستندات و Pipeline را تحویل میدهیم و روش اعمال تغییر جدید را با تیم شما مرور میکنیم.
IaC وقتی ارزش دارد که تیم شما بعد از تحویل هم بتواند با آن کار کند. کد را ساده، ماژولار و مستند مینویسیم و بررسی اولیه از طریق تلگرام رایگان است.
همان تیمی که Proxmox، شبکه و سرورهای لینوکس را پیادهسازی میکند کد آن را مینویسد، پس ماژولها با واقعیت محیط شما جور است.
Mirror داخلی و قفل نسخهها از ابتدا در طراحی است تا اجرای کد به دسترسی به سرویسهای خارجی گره نخورد.
IaC کنار Docker، Kubernetes و CI/CD در خدمات DevOps و امنیت طراحی میشود.
بستری که ماشینهای آن را میتوان با Terraform ساخت.
آموزشتنظیماتی که با Ansible خودکار میشوند.
آموزشقوانین فایروالی که بهتر است بهصورت کد نگهداری شوند.
Infrastructure as Code یا زیرساخت بهعنوان کد، یعنی تعریف سرورها، شبکه و تنظیمات در فایلهای متنی که مثل کد نرمافزار در Git نسخهبندی، بازبینی و اجرا میشوند. نتیجه، محیطهای یکسان، تغییرات قابل ردیابی و بازسازی سریع پس از خرابی است.
Terraform ابزاری برای ساخت و مدیریت زیرساخت با زبان HCL است. وضعیت مطلوب را توصیف میکنید و Terraform با مقایسه آن با State فعلی، منابع لازم را از طریق Provider هر بستر، مثل Proxmox یا vSphere، میسازد، تغییر میدهد یا حذف میکند.
Ansible ابزار متنباز خودکارسازی پیکربندی است که بدون Agent و از طریق SSH روی سرورها Task اجرا میکند. Terraform بیشتر برای ساخت منابع و Ansible برای پیکربندی داخل آنها به کار میرود و معمولاً هر دو کنار هم استفاده میشوند.
دسترسی از ایران به بخشی از سرویسهای HashiCorp ممکن است محدود یا ناپایدار باشد، پس این موضوع باید از ابتدا در طراحی دیده شود. برای پروژههای جدید OpenTofu را پیشنهاد میکنیم و Providerهای متنباز مورد نیاز را با نسخه قفلشده در Mirror داخلی نگه میداریم تا اجرای کد به دسترسی مستقیم به رجیستری خارجی وابسته نباشد.
OpenTofu انشعاب متنباز Terraform است که پس از تغییر لایسنس Terraform به BSL در سال ۲۰۲۳ زیر نظر بنیاد لینوکس ایجاد شد. بیشتر کدهای Terraform بدون تغییر یا با تغییر کم روی آن اجرا میشوند. برای پروژههای جدید OpenTofu را پیشنهاد میکنیم و در پروژههای موجود، مهاجرت را بر اساس Providerهای مورد استفاده بررسی میکنیم.
بله. منابع موجود با قابلیت Import به State اضافه میشوند و کد مطابق وضعیت فعلی نوشته میشود تا plan هیچ تغییری نشان ندهد. از آن به بعد، تغییرات فقط از مسیر کد انجام میشود.
هزینه بر اساس تعداد و تنوع منابع، بسترهای درگیر، نیاز به Import زیرساخت موجود و اتصال به Pipeline برآورد میشود. پس از بررسی رایگان اولیه، قیمت بهصورت استعلامی اعلام میشود.
بسترها، تعداد سرورها و کارهای دستی تکراری تیم خود را در تلگرام بنویسید تا کارشناس ما نقطه شروع مناسب IaC را پیشنهاد دهد.