اتوماسیون راهاندازی و پیکربندی چند سرور مجازی و اختصاصی با Ansible
راهاندازی یک سرور لینوکس معمولاً با چند کار آشنا شروع میشود: ساخت کاربر، افزودن کلید SSH، بهروزرسانی بستهها، تنظیم فایروال، نصب ابزارهای ضروری و پیکربندی سرویسها. انجام دستی این مراحل برای یک سرور ممکن است قابلقبول باشد، اما وقتی تعداد سرورها بیشتر شود، تکرار همین دستورها هم وقتگیر است و هم احتمال خطا را بالا میبرد.
Ansible این فرایند را به مجموعهای از دستورهای قابلتکرار تبدیل میکند. با یک فایل inventory مشخص میکنید چه سرورهایی مدیریت شوند و با یک playbook وضعیت مطلوب آنها را تعریف میکنید. سپس همان تنظیمات روی چند سرور مجازی یا اختصاصی اجرا میشوند.
در این آموزش، یک سناریوی عملی برای مدیریت پیکربندی سرور با Ansible میسازیم: چند سرور اوبونتو را آماده میکنیم، کاربر مدیریتی میسازیم، SSH و فایروال را تنظیم میکنیم، بستههای پایه را نصب میکنیم و یک وبسرور را روی گروه مشخصی از هاستها راه میاندازیم.
Ansible چه مسئلهای را حل میکند؟
Ansible یک ابزار اتوماسیون بدون عامل یا agentless است. لازم نیست روی هر سرور مقصد سرویس اختصاصی نصب کنید؛ در بیشتر سناریوهای لینوکسی، کنترلنود از طریق SSH به سرورها متصل میشود و ماژولهای لازم را اجرا میکند. روی میزبان مقصد معمولاً وجود Python کافی است. تفاوت اصلی Ansible با یک اسکریپت ساده Bash در نحوه تعریف عملیات است. در یک اسکریپت ممکن است بنویسید «این بسته را نصب کن»، اما در Ansible معمولاً وضعیت مورد انتظار را مشخص میکنید: «این بسته باید نصب باشد». بسیاری از ماژولهای Ansible خاصیت idempotent دارند؛ یعنی اجرای دوباره playbook نباید تغییری ایجاد کند، مگر اینکه وضعیت سرور با وضعیت تعریفشده تفاوت داشته باشد. این ویژگی برای مدیریت چند سرور مهم است. اگر اجرای playbook در میانه کار متوقف شود، میتوان آن را دوباره اجرا کرد و Ansible فقط تغییرات لازم را اعمال میکند.
Ansible در مقایسه با روشهای دیگر
هر ابزار برای مسئله متفاوتی مناسب است. Ansible جایگزین کامل Terraform، اسکریپتهای Shell یا سیستمهای مدیریت کانتینر نیست، اما میتواند در کنار آنها استفاده شود.
| روش | کاربرد اصلی | مزیت | محدودیت |
|---|---|---|---|
| اجرای دستی با SSH | تغییرات محدود روی یک یا دو سرور | شروع سریع و بدون آمادهسازی | تکرارپذیری کم و احتمال اختلاف میان سرورها |
| اسکریپت Bash | خودکارسازی مراحل خطی | ساده و در دسترس | کنترل وضعیت و مدیریت خطا دشوارتر میشود |
| Ansible | پیکربندی و مدیریت چند هاست | خوانایی، inventory، ماژولهای آماده و اجرای تکرارپذیر | به اتصال SSH و طراحی درست playbook نیاز دارد |
| Terraform | ساخت و تغییر منابع زیرساخت | مدیریت چرخه عمر منابع با state | برای جزئیات پیکربندی داخل سیستمعامل طراحی نشده است |
| Kubernetes | اجرای بارهای کانتینری | زمانبندی، مقیاسپذیری و بازیابی سرویسها | برای مدیریت عمومی تنظیمات سیستمعامل میزبان مناسب نیست |
یک الگوی رایج این است که منابع زیرساخت با Terraform ساخته شوند و Ansible پیکربندی داخل سیستمعامل را انجام دهد. برای محیطهای کوچکتر نیز میتوان سرورها را از پنل ارائهدهنده ساخت و ادامه راهاندازی را به Ansible سپرد.
معماری سناریوی این آموزش
فرض میکنیم یک سیستم محلی یا سرور مدیریتی با عنوان کنترلنود داریم. Ansible روی این سیستم نصب میشود و از طریق SSH به سه هاست متصل خواهد شد:
- دو سرور مجازی برای اجرای وبسرور
- یک سرور اختصاصی برای سرویس پایگاه داده
- یک کاربر اولیه با دسترسی sudo روی هر سه هاست
- احراز هویت SSH با کلید عمومی

ساختار پروژه را به این شکل در نظر میگیریم:
ansible-server-setup/
├── ansible.cfg
├── inventory.ini
├── group_vars/
│ └── all.yml
├── templates/
│ └── sshd_config.j2
└── site.yml
در یک محیط واقعی بهتر است playbookهای بزرگتر را به roleهای جدا تقسیم کنید، اما این ساختار برای دیدن اجزای اصلی کافی است.
نصب Ansible روی کنترلنود
روی اوبونتو میتوانید Ansible را از مخزن سیستم نصب کنید:
sudo apt update
sudo apt install -y ansible
ansible --version
Ansible باید فقط روی کنترلنود نصب باشد. کنترلنود میتواند لپتاپ مدیر سیستم، یک ماشین مجازی مدیریتی یا رانر CI/CD باشد. بهتر است این سیستم دسترسی شبکهای محدود و کلید SSH محافظتشده داشته باشد.
فایل ansible.cfg را در ریشه پروژه ایجاد کنید:
```ini




