如果您执行以下操作:
- name: print to stdout
command: echo "My log information"
register: logdata
- debug: msg="{{ logdata.stdout }}"
注册logdata
变量的内容将与完整的 ansible 日志一起显示。我希望将这些调试消息存储在另一个文件中。这有可能吗?
我想到的另一种方法是使用一个寄存器变量数组。最后使用模块copy
将该数组的内容放入文件中。这不是最好的选择。如果可以将 stdout 重定向debug
到另一个文件,那就太酷了。
答案1
在变量中捕获输出后,使用 local_action 如下:
- local_action:
module: copy
content: "{{ variable1 }}"
dest: /tmp/whatever.out
答案2
您可以使用 lineinfile 模块吗?
- lineinfile: create=yes regexp="NONEXISTENTLINE" dest=/tmp/ansible.log line="{{logdata.stdout}}" state=present
我使用 regexp="NONEXISTENTLINE" 来允许多次记录同一条消息。也许你不需要这样做。
日志会保存在每个目标主机上。您可以拉取它,也可以不拉取。
或者,您可以使用 awk 或其他工具来解析输出。
答案3
如何将 Ansible
debug
消息发送到另一个文件?
无需编写任何任务,只需通过配置和白名单添加其他任务即可重新实现已存在的功能回调插件, 看所有回调插件的索引,即log_plays
回调 – 将剧本输出写入日志文件。
与ansible.cfg
[default]
stdout_callback = yaml
callback_whitelist = timer, profile_tasks, log_plays
[callback_log_plays]
log_folder = /tmp/ansible/hosts
最小示例剧本
---
- hosts: test
become: false
gather_facts: false
tasks:
- debug:
stdout
将导致
PLAY [test] *********************************************************************************************
Saturday 14 October 2023 12:45:15 +0200 (0:00:00.041) 0:00:00.041 ******
TASK [debug] ********************************************************************************************
ok: [test.example.com] =>
msg: Hello world!
PLAY RECAP **********************************************************************************************
test.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Playbook run took 0 days, 0 hours, 0 minutes, 0 seconds
Saturday 14 October 2023 12:45:15 +0200 (0:00:00.068) 0:00:00.109 ******
===============================================================================
以及一个日志文件
~/test$ ll /tmp/ansible/hosts/
total 52
-rw-r--r--. 1 ansible_user users 314 Oct 14 12:45 test.example.com
有内容
~/test$ cat /tmp/ansible/hosts/test.example.com
Oct 14 2023 12:45:15 - log_plays.yml - - debug - OK - {"msg": "Hello world!", "changed": false, "_ansible_verbose_always": true, "_ansible_no_log": false}
类似及进一步的问答
以及关于log_plays
打回来用法