例如
- name: print to stdout
action: command echo "hello"
会打印
TASK: [print variable] ********************************************************
hello
#1 楼
我认为您可以将结果注册到变量,然后使用调试进行打印。- name: print to stdout
command: echo "hello"
register: hello
- debug: msg="{{ hello.stdout }}"
- debug: msg="{{ hello.stderr }}"
评论
另外,您可以直接使用-debug:var = hello调试变量。有时,这对于多行输出或Ansible模块输出(而不是命令/ shell输出)更有用。
–geerlingguy
2014年8月8日在3:03
我很难用它来获取Java输出。解决方法是将Java的所有输出重定向到stdout:shell:java -version 2>&1
–马特西亚斯·布劳恩(Matthias Braun)
2015年1月6日在17:27
没什么好多了,但是只有在命令成功完成之后,您才会收到stdout消息。我遇到了ansible似乎挂起的问题。原因是我为rsync命令使用了错误的用户名,该命令假脱机了交互式密码请求,该请求刚刚挂起ansible。调试非常困难-但是如果我能实时看到stdout,我会立即意识到我做错了什么。如果可能的话,我会喜欢这个功能。
– Michael B
2015年2月9日在4:31
虽然这有效,但是它意味着ansible使得调试工作变得非常困难。让我们想象第一个任务永远不会终止(也许它愚蠢地在等待用户输入)……用户永远不会知道!此外,寄存器模块或其他任何模块都不会产生设置了stdout或stderr变量的对象....因此,我们不仅仅默认获取输出是很不好的:|
– vlad-ardelean
15年7月10日在10:47
确保您正在运行的命令有超时,或使用Ansible异步强制超时。然后,应该提示您出了点问题,并查看先前的输出。
–tfwright
9月6日15:30
#2 楼
我建议使用stdout_lines代替stdout。对于多行输出,这要好得多,例如,- hosts: all
tasks:
- name: Run ls.sh and output "ls /"
script: ls.sh
register: out
- debug: var=out.stdout_lines
给定
TASK: [debug var=out.stdout_lines] ********************************************
ok: [local] => {
"var": {
"out.stdout_lines": [
"total 61",
"lrwxrwxrwx 1 root root 7 Feb 15 2015 bin -> usr/bin",
"drwxr-xr-x 6 root root 1024 Aug 24 22:08 boot",
"drwxr-xr-x 22 root root 3580 Sep 8 18:41 dev",
[...]
"drwxr-xr-x 9 root root 4096 Aug 25 19:14 usr",
"drwxr-xr-x 13 root root 4096 Feb 25 2015 var"
]
}
}
关于调试的实时输出目的有一个封闭的错误报告
https://github.com/ansible/ansible/issues/3887#issuecomment-54672569
,讨论了不可能和将不会实现的原因。
评论
+1用于链接“实时输出”错误。
–ntc2
15年11月26日,0:29
如果我想发送out.stdout_lines(作为Ansible邮件任务的主体),我该如何发送它,这样在收到电子邮件时它看起来不会像这样? [u'total 61',u'lrwxrwxrwx 1 root root 2015/2/15 bin-> usr / bin',u'drwxr-xr-x 6 root root 1024 Aug 24 22:08 boot',u'.... 。']我希望它看起来像这样,如在终端上所见
–克里斯F
17 Mar 10 '17 at 21:35
致命的:[127.0.0.1]:失败! => {“原因”:“在加载YAML时出现语法错误。\ n找不到预期的
–内特
19年8月15日在16:28
#3 楼
我发现将最小的stdout_callback
与ansible-playbook结合使用会产生与使用临时ansible相似的输出。在您的ansible.cfg中(请注意,我在OS X上,因此请修改
callback_plugins
路径以适合您的安装)stdout_callback = minimal
callback_plugins = /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/ansible/plugins/callback
这样的任务
---
- hosts: example
tasks:
- name: Say hi
command: echo "hi ..."
这样的输出就像临时命令会
example | SUCCESS | rc=0 >>
hi ...
我正在使用ansible-playbook 2.2.1.0
评论
不错的回调插件,简单的后处理只能提取标准输出。
– RichVel
17年6月27日在9:43
#4 楼
如果您真的想实时查看输出,那么至少可以使用ansibleshell
模块来解决问题。在任何将shell封装为ansible的外壳脚本中,在后台触摸并拖尾日志文件工作。然后重定向ansible shell命令的输出以追加到该日志文件。您需要确保在ansible完成后杀死后台尾部作业,否则它将悬空。
例如,在调用ansible的bash脚本中:
set -m
touch /tmp/debug.log && tail -f /tmp/debug.log &
ansible-playbook ... call playbook here
kill %1 # ensure the background tail job is stopped
然后在某些ansible中运行角色:
- name: Run a script and print stdout/stderr
shell: bash -c "/run/something.sh 2>&1 >> /tmp/debug.log"
评论
非常有趣和创意。感谢您的见解。看起来我可以将该技术应用于其他事物,因此非常简洁。
–约书亚K
7月23日22:54
老实说,这是这里唯一正确的答案...
– Moataz Elmasry
10月9日,11:59
#5 楼
我发现仅通过ssh杀死远程进程中的卡住进程即可返回stdout。我发现这比编写最终在剧本中不会使用的变通办法要短:kill -9 PID
评论
相关:serverfault.com/questions/667252/…stackoverflow.com/questions/20563639/…