我在 SLES 11 SP4 上针对大约 430 台机器运行 Ansible 2.0,它非常慢,我真的不知道为什么它这么慢,但如果我限制清单中的机器数量,它就会快得多。运行 3 个任务剧本(包括收集事实)大约需要 7 个小时,第 3 个任务是本地操作。当我运行所有 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 进程,但看起来它只会消耗所有资源。
stat
当我 strace 主 pid 时,它似乎只是在库存文件上一遍又一遍地运行。
我将所有主机变量保存在从数据库生成的一个清单文件中。我尝试使用动态清单,但初始化过程花费的时间太长了(我猜是它一遍又一遍地执行 SQL 查询)
那么,是否有一个技巧可以让它在多台机器上运行呢?
我已经尝试了所有的技巧https://www.ansible.com/blog/ansible-performance-tuning
我还尝试过将每个主机的 host_vars 放在各自的文件中来分解它 - 我认为 strace 告诉我它正在不断解析我的 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
所以,这让我认为,幕后并没有真正发生什么,只是有某种东西严重阻碍着。
答案1
首先,您需要考虑缓存事实。
请看这里了解如何:
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