我如何看到ansible-playbook命令的stdout? -v仅显示Ansible输出,而不显示单个命令。如果我能弄清楚如何立即执行此操作,那将很好,因此,如果出现故障或挂起,我可以知道原因。
例如

- name: print to stdout
  action: command echo "hello"


会打印

TASK: [print variable] ******************************************************** 

hello


评论

相关:serverfault.com/questions/667252/…

stackoverflow.com/questions/20563639/…

#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找不到预期的 \ n \ n该错误似乎是...语法问题。\ n \ n违规行似乎是:\ n \ n \ n-名称:运行ls.sh并输出\“ ls / \” \ n ^ here \ 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 楼

如果您真的想实时查看输出,那么至少可以使用ansible shell模块来解决问题。
在任何将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