آشنایی با Ansible (اختیاری)
بخش اختیاری
این بخش اختیاری است و برای دانشجویانی است که میخواهند با Configuration Management و ابزارهای declarative آشنا شوند. البته اختیاری بودن به معنای کم اهمیت بودن نیست؛ در دنیای واقعی، ابزارهایی مثل Ansible بسیار مهماند و دانستن آنها به شما کمک میکند درک بهتری از مفاهیم declarative و idempotency داشته باشید.
Configuration Management چیست؟
فرض کنید ۱۰ سرور دارید و میخواهید روی همهٔ آنها:
- یک پکیج خاص نصب باشد
- یک فایل پیکربندی مشخص وجود داشته باشد
- یک سرویس در حال اجرا باشد
میتوانید SSH کنید به هر سرور و دستی این کارها را انجام دهید. اما اگر ۱۰۰ سرور داشته باشید؟ یا اگر بخواهید مطمئن شوید همهٔ سرورها دقیقاً یکسان پیکربندی شدهاند؟
Configuration Management یعنی تعریف desired state — وضعیت مطلوب — و اجازه دادن به یک ابزار که خودش سیستمها را به آن وضعیت برساند.
چرا Ansible؟
ابزارهای زیادی برای Configuration Management وجود دارند (Ansible، Puppet، Chef، SaltStack)، اما Ansible سادهترین است:
- Agentless — نیازی به نصب نرمافزار روی سرورهای مدیریتشده نیست
- SSH-based — از SSH که قبلاً دارید استفاده میکند
- YAML — syntax ساده و خوانا
- Idempotent — میتوانید playbook را بارها اجرا کنید
نصب Ansible
روی سیستم کنترل (جایی که Ansible را اجرا میکنید):
نکته
Ansible را روی سیستمی که میخواهید سرورها را از آنجا مدیریت کنید نصب میکنید، نه روی خود سرورها. اگر فقط یک VM لینوکس دارید، همان را بهعنوان control node و managed node استفاده کنید.
Inventory — لیست سرورها
Ansible باید بداند روی کدام سرورها کار کند. این لیست در فایل Inventory نوشته میشود.
یک فایل ساده inventory.ini بسازید:
برای تمرین، فقط از localhost استفاده میکنیم:
اولین دستور Ad-Hoc
یک دستور ساده بدون نوشتن playbook:
خروجی:
این یعنی Ansible توانست به localhost متصل شود.
یک دستور دیگر — اجرای یک command:
اولین Playbook
یک Playbook فایل YAML است که مجموعهای از taskها را تعریف میکند. هر task از یک module استفاده میکند.
فایل setup.yml بسازید:
اجرای playbook:
خروجی نشان میدهد چه taskهایی changed شدند (تغییر کردند) و چه taskهایی ok بودند (قبلاً در وضعیت مطلوب بودند).
حالا دوباره همین playbook را اجرا کنید:
این بار همهٔ taskها ok هستند — هیچ چیز تغییر نکرده چون سیستم قبلاً در وضعیت مطلوب بوده. این همان idempotency است.
مفاهیم کلیدی Ansible
1. Modules
هر task از یک module استفاده میکند. چند module پرکاربرد:
apt/yum— نصب پکیجcopy— کپی فایلfile— مدیریت فایل و دایرکتوریsystemd— مدیریت سرویسuser— مدیریت کاربرcommand/shell— اجرای دستور (آخرین راهحل)
2. Idempotency
بیشتر moduleها idempotent هستند: اگر وضعیت مطلوب قبلاً برقرار باشد، هیچ کاری انجام نمیدهند.
3. State
در Ansible شما state میگویید:
state: present— باید وجود داشته باشدstate: absent— نباید وجود داشته باشدstate: started— سرویس باید running باشدstate: stopped— سرویس باید متوقف باشد
4. Handlers
اگر یک task تغییری ایجاد کند، میتوانید یک handler را trigger کنید:
Handler فقط اگر task تغییری ایجاد کرده باشد، اجرا میشود.
مثال عملی: نصب و پیکربندی NGINX
یک playbook کامل که NGINX را نصب، پیکربندی و راهاندازی میکند:
این playbook را بهعنوان nginx-setup.yml ذخیره و اجرا کنید:
بعد از اجرا، بررسی کنید:
باید صفحهٔ HTML را ببینید.
حالا دوباره playbook را اجرا کنید — همهچیز ok است و handler اجرا نمیشود چون هیچ چیز تغییر نکرده.
Variables
میتوانید مقادیر را بهصورت متغیر تعریف کنید:
یادگیری بیشتر
این فقط یک آشنایی مقدماتی با Ansible بود. موضوعات پیشرفتهتر:
- Roles — سازماندهی playbook برای استفاده مجدد
- Templates — فایلهای پیکربندی پویا با Jinja2
- Vault — مدیریت رمزها و secretها
- Dynamic Inventory — گرفتن لیست سرورها از cloud provider
- Ansible Galaxy — استفاده از roleهای آماده
اما برای این دوره، همین آشنایی کافی است. حالا شما میدانید:
- Configuration Management چیست
- Imperative و Declarative در عمل چه تفاوتی دارند
- Idempotency چطور کار میکند
- چطور یک ابزار مثل Ansible وضعیت سیستم را مدیریت میکند
این مفاهیم در هفتههای بعد — بهویژه Docker Compose و Kubernetes — دوباره ظاهر میشوند.
منابع یادگیری
مستندات و مقالات
- Ansible for Beginners: Complete Getting Started Guide — راهنمای کامل Ansible برای مبتدیها
- Ansible Configuration Management — راهنمای Configuration Management با Ansible
ویدیو
- Ansible Tutorial for Beginners - TechWorld with Nana — آموزش مقدماتی Ansible