如何获取ansible-playbook模块执行的日志/详细信息?


95

说我执行以下操作。

$ cat test.sh
#!/bin/bash
echo Hello World
exit 0

$ cat Hello.yml
---

- hosts: MyTestHost
  tasks:
  - name: Hello yourself
    script: test.sh


$ ansible-playbook  Hello.yml

PLAY [MyTestHost] ****************************************************************

GATHERING FACTS ***************************************************************
ok: [MyTestHost]

TASK: [Hello yourself] ********************************************************
ok: [MyTestHost]

PLAY RECAP ********************************************************************
MyTestHost                    : ok=2    changed=0    unreachable=0    failed=0

$

我肯定知道那是成功的。

我在哪里/如何看到我的脚本在远程主机(MyTestHost)上回显/打印的“ Hello World”?还是脚本的返回/退出代码?

我的研究表明,有可能编写一个插件来拦截模块执行回调或这些行上的内容并编写日志文件。我希望不要浪费时间。

例如下面的标准输出(请注意,我正在运行ansible而不是ansible-playbook):

$ ansible plabb54 -i /project/plab/svn/plab-maintenance/ansible/plab_hosts.txt -m script -a ./test.sh
plabb54 | success >> {
    "rc": 0,
    "stderr": "",
    "stdout": "Hello World\n"
}

$

Answers:


113

如果-v在命令行上将标志传递给ansible-playbook,您将看到执行的每个任务的stdout和stderr:

$ ansible-playbook -v playbook.yaml

Ansible还具有对日志记录的内置支持。将以下行添加到您的ansible配置文件中

[defaults] 
log_path=/path/to/logfile

Ansible将在多个位置查找配置文件:

  • ansible.cfg 在您运行的当前目录中 ansible-playbook
  • ~/.ansible.cfg
  • /etc/ansible/ansible.cfg

8
谢谢。只是贪婪:我可以动态地开始/停止从剧本进行记录吗?像set -xset +x在shell脚本。
Kashyap 2013年

@thekashyap,我认为目前无法实现。
罗琳·霍希斯坦

9
您可以使用该no_log: True标志来防止命令或剧本被记录下来,但是我相信它的含义是一样的。
阿德·米勒

4
您能否描述一下我的输入法logrotatelog_path以便每次ansible运行都有一个不同的文件(文件中包含命令/剧本)?
发泡胶飞

我需要三个vS来获得stdout和stderr
丰富的

24

playbook脚本任务将stdout像非playbook命令一样生成,只需使用将其保存到变量中即可register。一旦知道了这一点,调试模块就可以打印到剧本的输出流中。

tasks:
- name: Hello yourself
  script: test.sh
  register: hello

- name: Debug hello
  debug: var=hello

- name: Debug hello.stdout as part of a string
  debug: "msg=The script's stdout was `{{ hello.stdout }}`."

输出应如下所示:

TASK: [Hello yourself] ******************************************************** 
changed: [MyTestHost]

TASK: [Debug hello] *********************************************************** 
ok: [MyTestHost] => {
    "hello": {
        "changed": true, 
        "invocation": {
            "module_args": "test.sh", 
            "module_name": "script"
        }, 
        "rc": 0, 
        "stderr": "", 
        "stdout": "Hello World\r\n", 
        "stdout_lines": [
            "Hello World"
        ]
    }
}

TASK: [Debug hello.stdout as part of a string] ******************************** 
ok: [MyTestHost] => {
    "msg": "The script's stdout was `Hello World\r\n`."
}

但喂自己的任务还没有给任何标准输出
SAURABH钱德拉帕特尔

这是我的首选方法。擅长在调试语句中使用注册变量的值,这就是您的牡蛎。
约书亚K

14

还有其他生成日志文件的方法。

在运行之前,ansible-playbook运行以下命令来启用日志记录:

  • 指定日志文件的位置。

    导出ANSIBLE_LOG_PATH =〜/ ansible.log

  • 启用调试

    出口ANSIBLE_DEBUG =真

  • 检查生成的日志文件。

    减去$ ANSIBLE_LOG_PATH


1
ANSIBLE_DEBUG不同于指定日志文件。它甚至与冗长选择分开!这仍然非常好-调试将以绝对极端的详细程度为您提供面向开发人员的调试消息。很高兴有周围。
AlanSE '18年

4

官方插件

您可以使用输出回调插件。例如,从Ansible 2.4开始,您可以使用debug输出回调插件:

# In ansible.cfg:
[defaults]
stdout_callback = debug

(或者,export ANSIBLE_STDOUT_CALLBACK=debug在运行剧本之前运行)

重要提示:你必须运行ansible-playbook-v--verbose)选项来查看效果。随着stdout_callback = debug设定,输出现在应该是这个样子:

TASK [Say Hello] ********************************
changed: [192.168.1.2] => {
    "changed": true,
    "rc": 0
}

STDOUT:


Hello!



STDERR:

Shared connection to 192.168.1.2 closed.

debug如果您希望输出格式不同,则除了模块外还有其他模块。有jsonyamlunixydenseminimal,等(名单)。

例如,使用stdout_callback = yaml,输出将如下所示:

TASK [Say Hello] **********************************
changed: [192.168.1.2] => changed=true 
  rc: 0
  stderr: |-
    Shared connection to 192.168.1.2 closed.
  stderr_lines:
  - Shared connection to 192.168.1.2 closed.
  stdout: |2-

    Hello!
  stdout_lines: <omitted>

第三方插件

如果没有一个令人满意的官方插件,可以尝试使用该human_log插件。有几个版本:


3

使用回调插件,您可以在播放过程中以可读的形式输出命令的标准输出: 要点:human_log.py

编辑示例输出:

 _____________________________________
< TASK: common | install apt packages >
 -------------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


changed: [10.76.71.167] => (item=htop,vim-tiny,curl,git,unzip,update-motd,ssh-askpass,gcc,python-dev,libxml2,libxml2-dev,libxslt-dev,python-lxml,python-pip)

stdout:
Reading package lists...
Building dependency tree...
Reading state information...
libxslt1-dev is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 24 not upgraded.


stderr:

start:
2015-03-27 17:12:22.132237

end:
2015-03-27 17:12:22.136859

1

Ansible命令行帮助,例如ansible-playbook --help显示如何通过将详细模式(-v)设置为更多详细程度(-vvv)或将连接调试详细程度(-vvvv)来增加输出详细程度。这应该为您提供一些在stdout中需要的详细信息,然后可以将其记录下来。

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.