优化 Ansible 剧本以针对多台主机运行

优化 Ansible 剧本以针对多台主机运行

我在 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

相关内容