Назад | Перейти на главную страницу

Оптимизация сценариев Ansible для работы с множеством хостов

Я использую Ansible 2.0 на SLES 11 SP4 примерно на 430 машинах, и он очень медленный, я не могу понять, почему он такой медленный, но он работает намного быстрее, если я ограничиваю количество машин в инвентаре. На выполнение трёх задач (включая сбор фактов) ушло около 7 часов, а третья задача была локальным действием. Когда я провожу инвентаризацию всех 430 машин, на сбор файлов фактов о 2 машинах уходит примерно столько же времени, сколько на полную обработку 6 машин.

И он сразу использует 99,9% ЦП:

root     11646 99.8  0.4 220188 61016 pts/1    Rl+  07:24   6:41                          \_ /usr/bin/python /usr/bin/ansible-playbook /etc/ansible/playbooks/checkhostnames.yml ...
root     11651  0.1  0.4 187396 58828 pts/1    Sl+  07:24   0:00                          \_ /usr/bin/python /usr/bin/ansible-playbook /etc/ansible/playbooks/checkhostnames.yml ...
root     11652  0.1  0.4 187812 59216 pts/1    Sl+  07:24   0:00                          \_ /usr/bin/python /usr/bin/ansible-playbook /etc/ansible/playbooks/checkhostnames.yml ...
root     11653  0.1  0.4 188052 59428 pts/1    Sl+  07:24   0:00                          \_ /usr/bin/python /usr/bin/ansible-playbook /etc/ansible/playbooks/checkhostnames.yml ...
root     11654  0.1  0.4 186148 57496 pts/1    Sl+  07:24   0:00                          \_ /usr/bin/python /usr/bin/ansible-playbook /etc/ansible/playbooks/checkhostnames.yml ...
root     11655  0.1  0.4 186552 57924 pts/1    Sl+  07:24   0:00                          \_ /usr/bin/python /usr/bin/ansible-playbook /etc/ansible/playbooks/checkhostnames.yml ...
root     11656  0.4  0.2 154948 25828 pts/1    Sl+  07:24   0:01                          \_ /usr/bin/python /usr/bin/ansible-playbook /etc/ansible/playbooks/checkhostnames.yml ...

Это пугает, так как я действительно надеялся, что это оптимизирует наши сериализованные процессы ssh, похоже, это просто поглотит все ресурсы.

когда я настраиваю основной pid, он просто работает stat в файле инвентаризации снова и снова.

Я храню все свои вары хоста в одном файле инвентаризации, который я генерирую из базы данных. Я пробовал использовать динамический инвентарь, но это заняло слишком много времени, чтобы даже инициализировать (я предполагаю, что он снова и снова попадает в sql-запрос)

Итак, есть ли способ запустить его на большом количестве машин?

Я уже испробовал все уловки в https://www.ansible.com/blog/ansible-performance-tuning

Я также попытался разбить его, поместив host_vars для каждого хоста в свой собственный файл - я подумал, что strace сообщал мне, что он постоянно анализирует мой файл инвентаризации 500k. Но это не слишком помогло.


Я переключил свой playbook, чтобы просто повторить привет, не собирая факты

когда я запускаю файл инвентаризации только с 3 хостами, я получаю

real    0m1.996s
user    0m0.400s
sys     0m0.112s

когда я запускаю файл инвентаризации со всеми 430 хостами и ограничиваюсь только первыми 3, я делаю это за (обратите внимание, это разные хосты, но одна и та же машина):

real    0m11.989s
user    0m13.693s
sys     0m0.552s

и когда я запускаю файл инвентаризации со всеми 430 хостами без ограничений (и ctrl-c после 3-го, я получаю:

real    2m50.961s
user    2m56.495s
sys     0m0.764s

Так что это заставляет меня думать, что на самом деле не так много всего происходит за кулисами и что-то сильно блокирует.

Прежде всего, вам нужно подумать о кешировании фактов.

Посмотрите здесь, как:

http://docs.ansible.com/ansible/playbooks_variables.html#fact-caching

Вы увидите потрясающую производительность при сборке фактов даже при кешировании в файл.

Затем вы можете подумать о повышении уровня параллелизма с помощью -f

man ansible-playbook

   -f NUM, --forks=NUM
       Level of parallelism.  NUM is specified as an integer, the default is 5.

к чему-то большему, чем 5