题 如何查看ansible命令的stdout?


如何查看ansible-playbook命令的stdout? -v仅显示ansible输出,而不是单个命令。如果我能够立即弄清楚如何做到这一点会很棒,所以如果出现故障或挂起,我可以看出原因。

例如

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

会打印

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

hello

123
2017-09-06 21:01




有关: serverfault.com/questions/667252/... - Capi Etheriel
stackoverflow.com/questions/20563639/... - JonnyJD


答案:


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

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

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

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

126
2017-09-14 13:01



此外,您可以直接使用调试变量 - debug: var=hello。有时这对多线输出或Ansible模块输出更有帮助(而不是 command/shell 输出)。 - geerlingguy
我使用它来获取Java输出时遇到了麻烦。修复是将所有Java的输出重定向到stdout: shell: java -version 2>&1 - Matthias Braun
没有什么比这更好了,但你只得到stdout消息 后 命令已成功完成。我有一个问题,似乎ansible似乎挂了。原因是我使用了错误的用户名来执行rsync命令,该命令后台处理交互式密码请求,该请求只是挂起了ansible。调试非常困难 - 但如果我能够实时看到stdout,我会立即意识到我做错了什么。如果可能的话,我会喜欢这个功能。 - Michael B
虽然这有效,但这意味着ansible使调试变得非常困难。让我们假设第一个任务永远不会终止(也许是愚蠢地等待用户输入)...用户永远不会知道!而且, register 模块,或任何它不会产生具有 stdout 要么 stderr 变量集....所以我们不是默认获取输出真的很糟糕:| - vlad-ardelean


代替 标准输出 我建议使用 stdout_lines。对于多线输出,这更好,例如

- 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 讨论为什么这样做不可能而且不会实施的原因。


75
2017-09-08 18:12



+1用于链接“实时输出”错误。 - ntc2
如果我想发送out.stdout_lines(作为Ansible邮件任务的主体),我该如何发送它,以便收到电子邮件时它看起来不像这样? [u'total 61',u'lrwxrwxrwx 1 root root 7 Feb 15 2015 bin - > usr / bin',u'drwxr-xr-x 6 root root 1024 Aug 24 22:08 boot',u'.... 。']我希望它看起来像这样,就像在终端上看到的那样 - Chris F


我发现使用了 最小  stdout_callback 使用ansible-playbook给出了使用ad-hoc 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 ..."

给出这样的输出,就像ad-hoc命令一样

example | SUCCESS | rc=0 >>
hi ...

我正在使用ansible-playbook 2.2.1.0


13
2018-04-06 08:12



好的回调插件,简单的后处理只能提取标准输出。 - RichVel