优化Ansible playbooks以运行在许多主机上

我在SLES 11 SP4上运行Ansible 2.0的机器大概有430台,速度非常慢,我不能说明它为什么这么慢,但是如果限制库存中的机器数量,速度会更快。 运行一个3任务剧本(包括收集事实)花了大约7个小时,第三个任务是一个本地行动。 当我运行所有430库存时,需要花费相当多的时间来收集2台机器的事实文件,因为它完全处理了6台机器。

它使用了99.9%的CPU:

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进行strace时,它似乎一次又一次地在库存文件上运行stat

我将所有主机variables保存在一个从数据库中生成的清单文件中。 我尝试使用dynamic库存,但花了很长时间甚至初始化(我猜这是一次又一次地击中SQL查询)

那么,是否有一个诀窍在很多机器上运行?

我已经尝试了https://www.ansible.com/blog/ansible-performance-tuning中的所有技巧

我也尝试过把每个主机的host_vars放在自己的文件中来解决它 – 我想strace告诉我,它不断地parsing我的500K库存文件。 但是这并没有太大的帮助。


我把我的剧本转换成只是回应你好,没有收集事实

当我运行只有3个主机的库存文件时,

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

当我运行所有430主机的库存文件,并限制到前3个我完成(注意,这些是不同的主机 – 但机器相同)

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

当我用无限制的所有430个主机运行库存文件(和第三个之后的ctrl-c,我得到:

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

所以,这让我觉得幕后并没有太多的东西在发生,有些东西被强烈的阻挡了。

首先,你需要考虑caching事实。

看看这里如何:

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

即使将文件caching到文件中,您也可以在收集事实上看到惊人的效果。

那么你可以考虑用-f来提高并行度

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

到大于5的东西