我想使用像 ps、dstat 等命令来快速监控一些主机,使用 ansible-playbook。 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脚本,这不完全符合'ansible'的要求,因此我将其放入一个playbook中:
---
-
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
以及一个“debug”任务,以显示{{ var.stdout }}
,但结果当然是相同的。
是否有一种通过playbook运行命令的stdout/stderr输出可以得到漂亮格式化的方法?我可以想到许多可能的方法(使用sed格式化输出?将输出重定向到主机上的文件,然后获取该文件并在屏幕上echo它?),但由于我对shell/ansible的知识有限,这需要花费我一天时间去尝试。