如何查看ansible命令的标准输出?


165

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

例如

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

会打印

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

hello


Answers:


164

我认为您可以将结果注册到变量,然后使用调试打印。

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

- debug: msg="{{ hello.stdout }}"

- debug: msg="{{ hello.stderr }}"

26
此外,您可以直接使用调试变量- debug: var=hello。有时这对于多行输出或Ansible模块输出(而不是command/ shell输出)更有用。
geerlingguy 2014年

4
我很难用它来获取Java输出。解决方法是将Java的所有输出重定向到stdout:shell: java -version 2>&1
Matthias Braun

20
没什么好多了,但是只有在命令成功完成,您才会收到stdout消息。我遇到一个问题,ansible似乎挂起了。原因是我为rsync命令使用了错误的用户名,该命令假脱机了交互式密码请求,该请求刚刚挂起ansible。调试非常困难-但是如果我可以实时看到stdout,我会立即意识到我做错了什么。如果可能的话,我会喜欢这个功能。
Michael B

10
尽管这可行,但它意味着ansible使得调试工作变得非常困难。让我们想象第一个任务永远不会终止(也许它愚蠢地在等待用户输入)……用户永远不会知道!而且,register模块或任何模块都不会产生具有stdoutstderr变量设置的对象...。因此,我们不仅仅默认获取输出是很不好的:|
vlad-ardelean

95

我建议使用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 讨论了为什么无法实现和将不会实现的原因。


16
+1用于链接“实时输出”错误。
ntc2

如果我想发送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

致命的:[127.0.0.1]:失败!=> {“原因”:“在加载YAML时出现语法错误。\ n找不到预期的<document start> \ n \ n该错误似乎在...语法问题中。\ n \ n违规行似乎是:\ n \ n \ n-名称:运行ls.sh并输出\“ ls / \” \ n ^ here \ n“}
Nate

20

我发现,用最少的 stdout_callback有ansible-剧本给了相似的输出使用特设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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.