我想使用 Ansible 在多个远程节点上同时执行一个简单的作业。实际的工作涉及 grepping 一些日志文件,然后在我的本地主机上对结果进行后处理(远程节点上没有可用的软件)。
命令行 ansible 工具似乎不太适合这个用例,因为它们将 ansible 生成的格式与远程执行命令的输出混合在一起。Python API 似乎应该能够做到这一点,因为它公开了未修改的输出(除了一些在此处不相关的潜在 unicode 修改)。
我想出的 Python 程序的简化版本如下所示:
from sys import argv
import ansible.runner
runner = ansible.runner.Runner(
pattern='*', forks=10,
module_name="command",
module_args=(
"""
sleep 10
"""),
inventory=ansible.inventory.Inventory(argv[1]),
)
results = runner.run()
在这里,sleep 10
代表实际的日志 grepping 命令——这个想法只是模拟一个不会立即完成的命令。
但是,在运行此程序时,我观察到所花费的时间似乎与我的清单中的主机数量成正比。以下是分别针对 2、5 和 9 台主机的清单的计时结果:
exarkun@top:/tmp$ time python howlong.py two-hosts.inventory
real 0m24.285s
user 0m0.216s
sys 0m0.120s
exarkun@top:/tmp$ time python howlong.py five-hosts.inventory
real 0m55.120s
user 0m0.224s
sys 0m0.160s
exarkun@top:/tmp$ time python howlong.py nine-hosts.inventory
real 1m57.272s
user 0m0.360s
sys 0m0.284s
exarkun@top:/tmp$
其他一些随机观察:
ansible all --forks=10 -i five-hosts.inventory -m command -a "sleep 10"
表现出相同的行为ansible all -c local --forks=10 -i five-hosts.inventory -m command -a "sleep 10"
似乎是同时执行的事情(但只适用于本地连接,当然)ansible all -c paramiko --forks=10 -i five-hosts.inventory -m command -a "sleep 10"
似乎同时执行的事情
也许这表明问题出在 ssh 传输上,与通过 Python API 而非命令行使用 ansible 无关。
无论我的清单中的主机数量如何,这有什么问题会阻止默认传输仅花费大约 10 秒?