我想使用 ansible-playbook 使用 ps、dstat 等命令快速监控一些主机。该ansible
命令本身完美地完成了我想要的,例如我会使用:
ansible -m shell -a "ps -eo pcpu,user,args | sort -r -k1 | head -n5"
它很好地为每个主机打印所有标准输出,如下所示:
localhost | success | rc=0 >>
0.0 root /sbin/init
0.0 root [kthreadd]
0.0 root [ksoftirqd/0]
0.0 root [migration/0]
otherhost | success | rc=0 >>
0.0 root /sbin/init
0.0 root [kthreadd]
0.0 root [ksoftirqd/0]
0.0 root [migration/0]
然而,这需要我为每个不是很“可靠”的任务保留一堆 shell 脚本,所以我把它放在一个剧本中:
---
-
hosts: all
gather_facts: no
tasks:
- shell: ps -eo pcpu,user,args | sort -r -k1 | head -n5
并使用 运行它-vv
,但输出显示字典内容和换行符没有这样打印,所以这会导致像这样的不可读的混乱:
changed: [localhost] => {"changed": true, "cmd": "ps -eo pcpu,user,args | sort -r -k1
head -n5 ", "delta": "0:00:00.015337", "end": "2013-12-13 10:57:25.680708", "rc": 0,
"start": "2013-12-13 10:57:25.665371", "stderr": "", "stdout": "47.3 xxx Xvnc4 :24
-desktop xxx:24 (xxx) -auth /home/xxx/.Xauthority -geometry 1920x1200\n
....
我还尝试添加register: var
并显示“调试”任务,{{ var.stdout }}
但结果当然是相同的。
当通过剧本运行时,有没有办法从命令的标准输出/标准错误中获得格式良好的输出?我可以想到许多可能的方法(使用 sed 格式化输出?将输出重定向到主机上的文件,然后取回该文件并将其回显到屏幕上?),但由于我对 shell/ansible 的了解有限,我需要一天试一试。