说我执行以下内容。
$ 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”?或者脚本的返回/退出代码?
我的研究表明,我可以编写一个插件来拦截那些行上的模块执行回调或写入日志文件。我宁愿不浪费我的时间。
E.g。类似于下面的标准输出(注意我正在运行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"
}
$
答案 0 :(得分:96)
如果在命令行上将-v
标志传递给ansible-playbook,则会看到每个任务执行的stdout和stderr:
$ ansible-playbook -v playbook.yaml
Ansible还内置了对日志记录的支持。将以下行添加到ansible configuration file:
[defaults]
log_path=/path/to/logfile
Ansible将在几个地方查找配置文件:
ansible.cfg
的当前目录中的ansible-playbook
~/.ansible.cfg
/etc/ansible/ansible.cfg
答案 1 :(得分:18)
playbook脚本任务将生成stdout
,就像非playbook命令一样,它只需要使用register
保存到变量中。一旦我们得到了,debug module就可以打印到剧本输出流。
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`."
}
答案 2 :(得分:7)
还有其他生成日志文件的方法。
在运行ansible-playbook
之前,请运行以下命令以启用日志记录:
指定日志文件的位置。
导出ANSIBLE_LOG_PATH =〜/ ansible.log
启用调试
导出ANSIBLE_DEBUG = True
检查生成的日志文件。
少$ ANSIBLE_LOG_PATH
答案 3 :(得分:3)
使用回调插件,您可以使用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
答案 4 :(得分:1)
官方插件
您可以使用output callback plugins。例如,从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
模块之外还有其他模块。有json
,yaml
,unixy
,dense
,minimal
等(full list)。
例如,使用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
插件。有几个版本:
答案 5 :(得分:0)
Ansible命令行帮助,例如ansible-playbook --help
显示如何通过将详细模式(-v)设置为更详细(-vvv)或连接调试详细程度(-vvvv)来增加输出详细程度。这应该会为您提供一些您在stdout中的详细信息,然后您可以将其记录下来。