راههای افزایش سرعت 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 کاربلد هم با چند خط تنظیم درست، زیرساختش رو توربو میکنه. 🧠⚙️