我想使用ansible-playbook使用ps,dstat等命令快速监控一些主机 . ansible
命令本身完全符合我的要求,例如我使用:
ansible -m shell -a "ps -eo pcpu,user,args | sort -r -k1 | head -n5"
它很好地打印每个主机的所有std输出,如下所示:
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
运行它,但输出在baiscally显示字典内容和换行不打印,因此这导致一个不可读的混乱像这样:
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
和a 'debug'任务来显示 {{ var.stdout }}
但结果当然是一样的 .
有没有办法在通过playbook运行时从命令的stdout / stderr获得格式良好的输出?我可以想到一些可能的方法(使用sed格式输出?重定向输出到主机上的文件,然后将该文件返回并将其回显到屏幕?),但由于我对shell / ansible的了解有限,我需要一天来尝试一下 .
7 回答
扩展leucos在答案中所说的内容,您还可以使用Ansible谦逊的debug模块打印信息:
debug
模块可以真正使用一些爱,但目前你可以做的最好的是使用这个:它给出了这样的输出:
这可能是一个开始:
NOTE: 关于
ps.stdout_lines
的文档包含在这里:('Register Variables' chapter) .我发现使用带有ansible-playbook的minimal
stdout_callback
给出了与使用ad-hoc ansible类似的输出 .在你的ansible.cfg中(注意我在OS X上,所以修改
callback_plugins
路径以适合你的安装)这样就像你的任务一样
ansible-playbook
给出这样的输出,就像ad-hoc命令一样
我正在使用ansible-playbook 2.2.1.0
如果您需要特定的退出状态,Ansible提供了一种通过 callback plugins 执行此操作的方法 .
Example . 如果您需要100%准确的退出状态,这是一个非常好的选择 .
如果没有,您可以随时使用Debug Module,这是此使用情况的标准 .
干杯
ANSIBLE_STDOUT_CALLBACK=debug ansible-playbook /tmp/foo.yml -vvv
然后STDOUT的任务将有一个部分:
也许不相关如果你更容易在我的
.bash_profile
中使用函数然后运行_check_machine host1 host2
例如 .
不用说功能对你不起作用 . 您需要适当更新它 .