fetch模块用于将远程主机文件下载到控制节点,自动按主机名分目录保存,支持循环拉取多文件、提权读取和截取大日志。

在 Ansible 中用 fetch 模块可以把远程主机上的日志文件拉取到控制节点(本地),适合做日志归档、故障排查或集中分析。它和 copy 方向相反,专用于“下载”,且自动按主机名分目录保存,避免文件覆盖。
fetch 的基本用法和关键参数
fetch 是一个仅支持控制节点执行的模块(delegate_to: localhost 会报错,它本来就在本地运行)。最简写法如下:
-
src:远程主机上的绝对路径,比如
/var/log/nginx/access.log;必须是文件,不支持目录(除非加flat: yes) -
dest:本地保存路径,比如
./logs/;Ansible 会自动在该路径下创建以主机名命名的子目录(如./logs/web01.example.com/var/log/nginx/access.log) -
flat:设为
yes可跳过主机名子目录,直接存成./logs/access.log(多主机时会覆盖,慎用) -
fail_on_missing:默认
yes,远程文件不存在时任务失败;设为no可跳过缺失日志
收集多个日志文件的常见写法
单个 fetch 只能拉一个文件,批量操作推荐用 loop 或 with_items(旧语法)配合变量:
- 定义日志列表:
logs_to_fetch: ["/var/log/syslog", "/var/log/messages", "/var/log/nginx/error.log"] - 在 task 中循环:
loop: "{{ logs_to_fetch }}",然后src: "{{ item }}" - 注意
dest要带斜杠结尾(如dest: "./collected_logs/"),否则 Ansible 会误认为是目标文件名
处理权限问题和大日志文件
远程日志常属 root,普通用户无法读取。需确保 Ansible 连接用户有权限:
- 用
become: yes提权(前提是配置了 sudo 免密或使用密钥) - 或改用
remote_user: root(不推荐,安全风险高) - 大日志(如 >500MB)可能拖慢执行、占满本地磁盘;可先用
stat模块检查大小,再决定是否 fetch - 也可结合
command模块用tail -n 1000 /var/log/app.log截取最新行,再 fetch 临时文件
实用示例:拉取并重命名最近的 Nginx 日志
下面这个 task 会拉取远程 /var/log/nginx/access.log,保存为带时间戳的本地文件:
- name: Fetch nginx access log with timestamp
fetch:
src: /var/log/nginx/access.log
dest: "./logs/{{ inventory_hostname }}_access_{{ ansible_date_time.iso8601_basic_short }}.log"
flat: yes
delegate_to: localhost
注意:flat: yes 配合自定义文件名,避免路径嵌套;delegate_to: localhost 不需要写——fetch 总是在本地运行。


















