Я использую 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