راه‌های افزایش سرعت Playbook در Ansible

راه‌های افزایش سرعت Playbook در Ansible

چطور کاری کنیم Ansible مثل جت کار کنه، نه مثل دوچرخه؟

اگر با Ansible کار کرده باشی، احتمالاً می‌دونی که چه ابزار قدرتمندیه. باهاش میشه کل زیرساخت IT رو به‌صورت خودکار مدیریت کرد، از نصب سرویس‌ها گرفته تا پیکربندی سرورها.
اما وقتی پروژه بزرگ‌تر میشه یا سرورهای زیادی داری، اجرای Playbook ممکنه طولانی بشه و از سرعت اون خودکارسازی لذت‌بخش کم کنه.

توی این مقاله قراره یه موتور توربوشارژ بزاریم رو ansible 😎


۱. شناسایی تسک‌های کند با Callback Plugin

اول از همه باید بفهمیم کدوم بخش واقعاً کند عمل می‌کنه. بعضی وقتا یه تسک ساده ممکنه عامل اصلی کندی کل Playbook باشه.
اینجاست که Callback Plugin‌ها وارد بازی می‌شن — مثل timer, profile_tasks و profile_roles که مدت زمان اجرای هر تسک و رول رو نشون میدن.

[defaults]
inventory = ./inventory/hosts
callbacks_enabled = timer, profile_tasks, profile_roles

بعد از اجرای Playbook، خروجی نشون میده هر تسک چقدر زمان برده.
با این اطلاعات می‌تونی تسک‌های سنگین رو شناسایی و بهینه‌سازی کنی.


۲. غیرفعال کردن Fact Gathering (در صورت عدم نیاز)

Ansible قبل از اجرای هر تسک، یه سری اطلاعات از سیستم مقصد جمع‌آوری می‌کنه که بهش می‌گن facts.
اما اگه از این اطلاعات استفاده نمی‌کنی، بهتره غیرفعالش کنی تا هر بار وقتت گرفته نشه.

گزینه اول: غیرفعال کردن برای یک Playbook خاص

---
- name: Deploy web services
  hosts: webservers
  become: true
  gather_facts: false
  roles:
    - kafka
    - nginx

گزینه دوم: غیرفعال کردن به‌صورت کلی

[defaults]
gathering = explicit

گزینه سوم: استفاده از Smart Gathering

تو حالت smart، Ansible فقط وقتی facts جدید می‌گیره که اطلاعات قبلی منقضی شده باشن.
برای این کار باید caching رو تو ansible.cfg فعال کنی.

💡 نکته: وقتی از smart gathering استفاده می‌کنی، لازم نیست تو playbook بنویسی gather_facts: true یا false، خودش مدیریت می‌کنه.

۳. افزایش Parallelism با تنظیم Forks

به‌صورت پیش‌فرض، Ansible همزمان فقط روی ۵ تا هاست کار می‌کنه. یعنی یه تسک رو روی ۵ تا سرور انجام میده، بعد میره سراغ ۵ تای بعدی.
می‌تونی این مقدار رو زیاد کنی تا تسک‌ها روی هاست‌های بیشتری همزمان اجرا بشن:

[defaults]
inventory = ./hosts
forks = 50

یا موقع اجرای Playbook اینجوری:

ansible-playbook site.yml --forks 50
⚠️ توجه: افزایش forks باعث مصرف بیشتر CPU و RAM روی کنترل نود میشه، پس بسته به توان سیستمت تنظیمش کن.

۴. فعال کردن SSH Multiplexing

هر بار که Ansible به یه سرور SSH می‌زنه، یه ارتباط TCP جدید ایجاد می‌کنه و این یعنی زمان اضافی برای مذاکره اولیه بین کلاینت و سرور.
اما با SSH Multiplexing، فقط یه ارتباط TCP برقرار میشه و بقیه‌ی SSHها از همون مسیر استفاده می‌کنن — یعنی مثل باز گذاشتن درِ خونه برای ورودهای بعدی! 🚪⚡

[defaults]
[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=2m

ControlMaster=auto باعث میشه یه master connection ساخته بشه و
ControlPersist=2m اون ارتباط رو تا دو دقیقه بعد از آخرین استفاده باز نگه می‌داره.


۵. غیرفعال کردن بررسی کلید SSH در محیط‌های داینامیک

به‌صورت پیش‌فرض، Ansible کلید SSH هر سرور رو بررسی می‌کنه تا مطمئن بشه قربانی حمله‌ی man-in-the-middle نشی.
اما در محیط‌هایی مثل کانتینرها یا VMهایی که دائم ساخته و حذف میشن، این بررسی فقط وقت‌گیره.

[defaults]
host_key_checking = False
⚠️ این گزینه رو فقط تو محیط کنترل‌شده و امن استفاده کن، نه تو سرورهای حساس.

۶. فعال کردن Pipelining

وقتی Ansible یه تسک رو اجرا می‌کنه، در واقع یه اسکریپت پایتونی می‌سازه، اون رو به هاست کپی می‌کنه و بعد اجراش می‌کنه.
با فعال کردن Pipelining، دیگه نیاز به کپی فایل نیست؛ اسکریپت مستقیم از طریق SSH منتقل و اجرا میشه.
نتیجه؟ سرعت بیشتر و ارتباط کمتر!

[defaults]
pipelining = True
⚠️ اگه توی playbook از sudo استفاده می‌کنی، باید requiretty رو تو فایل /etc/sudoers هاست مقصد غیرفعال کنی.

۷. استفاده از استراتژی Free

به‌صورت پیش‌فرض، Ansible تا زمانی که همه‌ی سرورها یه تسک رو تموم نکنن، سراغ تسک بعدی نمیره (استراتژی linear).
اما اگه تسک‌هات به هم وابسته نیستن، با استراتژی free، هر سرور مسیر خودش رو مستقل طی می‌کنه.

- hosts: production_servers
  strategy: free
  tasks:
    - name: Deploy app
      ...

نتیجه؟ سرعت بالاتر و آزادی بیشتر برای اجرای همزمان.


۸. استفاده از Mitogen — پادشاه بهینه‌سازی

Mitogen یه افزونه‌ی مخصوص Ansibleه که اجرای Playbook رو چند برابر سریع‌تر می‌کنه.
در واقع مثل اینه که یه موتور جدید برای Ansible بنویسی، بدون اینکه حتی به هاست مقصد دست بزنی. 😄

نصبش ساده‌ست:

pip install mitogen

و فقط کافیه این تنظیمات رو به ansible.cfg اضافه کنی:

[defaults]
strategy_plugins = ~/ansible_playground_env/lib/python3.8/site-packages/ansible_mitogen/plugins/strategy
strategy = mitogen_linear
مسیر strategy_plugins بسته به نحوه‌ی نصب ممکنه متفاوت باشه.

جمع‌بندی

اجرای سریع‌تر Playbook فقط به سخت‌افزار قوی مربوط نیست؛
بیشتر به درک عمیق از نحوه‌ی کار Ansible و بهینه‌سازی تنظیماتش بستگی داره.
با همین چند ترفند بالا، می‌تونی زمان اجرای Playbook‌هات رو تا چند برابر کاهش بدی و تجربه‌ای سریع‌تر و حرفه‌ای‌تر بسازی.

همون‌طور که یه مکانیک حرفه‌ای با یه پیچ‌گوشتی درست، موتور رو بهتر تنظیم می‌کنه، یه DevOps کاربلد هم با چند خط تنظیم درست، زیرساختش رو توربو می‌کنه. 🧠⚙️


🔗 منابع: