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

Qui*_*etz 225 debugging stderr stdout ansible

如何查看 ansible-playbook 命令的标准输出?-v 只显示 ansible 输出,而不是单个命令。如果我能立即弄清楚如何执行此操作,那就太好了,因此如果出现故障或挂起,我可以了解原因。

例如

- name: print to stdout
  action: command echo "hello"
Run Code Online (Sandbox Code Playgroud)

会打印

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

hello
Run Code Online (Sandbox Code Playgroud)

小智 218

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

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

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

- debug: msg="{{ hello.stderr }}"
Run Code Online (Sandbox Code Playgroud)

  • 此外,您可以直接使用 `- debug: var=hello` 调试变量。有时这对多行输出或 Ansible 模块输出(而不是 `command`/`shell` 输出)更有帮助。 (31认同)
  • 没什么好得多,但您只会在命令成功完成后* 收到 stdout 消息。我遇到了 ansible 似乎挂起的问题。原因是我对 rsync 命令使用了错误的用户名,该命令会假脱机交互式密码请求,该请求只是挂起 ansible。调试非常困难 - 但如果我可以实时查看标准输出,我会立即意识到我做错了什么。如果可能的话,我会喜欢这个功能。 (27认同)
  • 虽然这有效,但这意味着 ansible 使调试变得非常困难。让我们想象第一个任务永远不会终止(也许它在愚蠢地等待用户输入)......用户永远不会知道!此外,`register` 模块或其他任何模块都不会产生设置了 `stdout` 或 `stderr` 变量的对象......所以我们不只是默认获得输出真的很糟糕:| (14认同)
  • 我无法使用它获取 Java 输出。解决方法是将所有 Java 输出重定向到标准输出:`shell: java -version 2>&1` (4认同)

小智 135

我建议使用stdout_lines而不是stdout。对于多行输出,这更好,例如

- hosts: all
  tasks:
    - name: Run ls.sh and output "ls /"
      script: ls.sh
      register: out

    - debug: var=out.stdout_lines
Run Code Online (Sandbox Code Playgroud)

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"
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

关于用于调试目的的实时输出,有一个关闭的错误报告 https://github.com/ansible/ansible/issues/3887#issuecomment-54672569 讨论了为什么这是不可能的并且不会实施的原因。

  • +1 用于链接“实时输出”错误。 (21认同)

Jas*_*n S 25

我发现,用最少的 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
Run Code Online (Sandbox Code Playgroud)

所以像这样的任务

---
- hosts: example
  tasks:
   - name: Say hi
     command: echo "hi ..."
Run Code Online (Sandbox Code Playgroud)

给出这样的输出,就像临时命令一样

example | SUCCESS | rc=0 >>
hi ...
Run Code Online (Sandbox Code Playgroud)

我正在使用 ansible-playbook 2.2.1.0


cob*_*lla 5

如果你真的想实时观看输出,有一种方法可以解决它,至少对于 ansibleshell模块是这样。

在任何 shell 脚本中包装您对 ansible 的调用,在后台作业中触摸和跟踪日志文件。然后重定向 ansible shell 命令的输出以附加到该日志文件。您需要确保在 ansible 完成后终止后台 tail 作业,否则它将悬而未决。

例如,在调用 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
Run Code Online (Sandbox Code Playgroud)

然后在一些 ansible 角色:

- name: Run a script and print stdout/stderr
  shell: bash -c "/run/something.sh 2>&1 >> /tmp/debug.log"
Run Code Online (Sandbox Code Playgroud)

  • 非常有趣和有创意。感谢您的见解。看起来我可以将该技术应用到其他事情上,所以这非常简洁。 (2认同)
  • 老实说,这是这里唯一正确的答案...... (2认同)