假设我执行以下操作.
$ 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
$
Run Code Online (Sandbox Code Playgroud)
我确信它是成功的.
在远程主机(MyTestHost)上我的脚本在哪里/如何看到"Hello World"回显/打印?还是脚本的返回/退出代码?
我的研究表明,我可以编写一个插件来拦截模块执行回调或者那些行上的东西并编写一个日志文件.我宁愿不浪费我的时间.
例如下面的stdout(注意我运行的是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"
}
$
Run Code Online (Sandbox Code Playgroud)
Lor*_*ein 107
如果您-v在命令行上将标志传递给ansible-playbook,您将看到执行的每个任务的stdout和stderr:
$ ansible-playbook -v playbook.yaml
Run Code Online (Sandbox Code Playgroud)
Ansible还内置了对日志记录的支持.将以下行添加到ansible配置文件中:
[defaults]
log_path=/path/to/logfile
Run Code Online (Sandbox Code Playgroud)
Ansible将在几个地方查找配置文件:
ansible.cfg 在您运行的当前目录中 ansible-playbook~/.ansible.cfg/etc/ansible/ansible.cfgjoe*_*ler 21
playbook脚本任务将stdout像非playbook命令一样生成,它只需要使用保存到变量register.一旦我们得到了,调试模块就可以打印到playbook输出流.
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 }}`."
Run Code Online (Sandbox Code Playgroud)
输出应该如下所示:
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`."
}
Run Code Online (Sandbox Code Playgroud)
小智 12
还有其他生成日志文件的方法.
在运行之前运行ansible-playbook以下命令以启用日志记录:
指定日志文件的位置.
export ANSIBLE_LOG_PATH =〜/ ansible.log
启用调试
export ANSIBLE_DEBUG = True
检查生成的日志文件.
少$ ANSIBLE_LOG_PATH
使用回调插件,您可以通过 play: gist: 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
Run Code Online (Sandbox Code Playgroud)
官方插件
您可以使用输出回调插件。例如,从 Ansible 2.4 开始,您可以使用调试输出回调插件:
# In ansible.cfg:
[defaults]
stdout_callback = debug
Run Code Online (Sandbox Code Playgroud)
(或者,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.
Run Code Online (Sandbox Code Playgroud)
debug如果您希望输出的格式不同,那么除了模块之外还有其他模块。有json,yaml,unixy,dense,minimal,等(名单)。
例如,使用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>
Run Code Online (Sandbox Code Playgroud)
第三方插件
如果官方插件都不令人满意,您可以尝试该human_log插件。有几个版本: