如何在Ansible受控节点自定义路径存储专属日志文件?
Ansible受控节点日志配置方案及log_path适用范围解答
一、log_path配置的适用范围
log_path仅适用于控制节点,它用于指定控制节点上Ansible主日志的存储路径,受控节点不会读取或使用这个配置项。
二、实现受控节点按节点名存储日志到共享挂载点的方案
要在每个受控节点的/log/[machine_name].log路径存储日志(共享挂载点按节点名区分),可以采用以下两种实用方式:
方式1:任务内直接添加日志记录步骤
无需额外插件,在每个任务后添加日志写入操作,利用inventory_hostname变量自动区分节点名:
- name: 执行业务任务 ansible.builtin.command: your_business_command - name: 记录任务日志到受控节点 ansible.builtin.lineinfile: path: "/log/{{ inventory_hostname }}.log" line: "{{ ansible_date_time.iso8601 }} - 任务【{{ ansible_task_name }}】执行完成,结果:{{ result.rc }}" create: yes # 日志文件不存在时自动创建 delegate_to: "{{ inventory_hostname }}"
注意:确保受控节点的
/log共享挂载点对Ansible执行用户有写入权限。
方式2:自定义回调插件(批量场景推荐)
编写一个回调插件,自动在任务执行前后记录日志到受控节点的指定路径:
- 创建回调插件文件
callback_plugins/remote_log.py:
from ansible.plugins.callback import CallbackBase from datetime import datetime class CallbackModule(CallbackBase): CALLBACK_VERSION = 2.0 CALLBACK_NAME = 'remote_log' def v2_runner_on_ok(self, result): host = result._host.get_name() current_time = datetime.now().isoformat() log_file = f"/log/{host}.log" log_content = f"{current_time} | 任务【{result._task.name}】执行成功\n" # 通过远程连接执行日志写入命令 result._connection.exec_command(f"echo '{log_content}' >> {log_file}") def v2_runner_on_failed(self, result, ignore_errors=False): host = result._host.get_name() current_time = datetime.now().isoformat() log_file = f"/log/{host}.log" error_msg = result._result.get('msg', '未知错误') log_content = f"{current_time} | 任务【{result._task.name}】执行失败:{error_msg}\n" result._connection.exec_command(f"echo '{log_content}' >> {log_file}")
- 在
ansible.cfg中启用插件:
[defaults] callback_plugins = ./callback_plugins callback_whitelist = remote_log
内容的提问来源于stack exchange,提问作者Sven van den Boogaart
相关产品推荐
相关产品推荐

