Ansible 的 fetch 模块用于从远程主机拉取文件到控制节点,支持自动按主机名归档、权限控制、失败触发回传及压缩传输。

Ansible 的 fetch 模块专为“从远程主机拉取文件到控制节点”设计,非常适合在部署失败后自动回传关键日志,保留故障现场。它不像 copy 那样单向推送,而是反向抓取,且天然支持按主机名自动归档,避免文件覆盖。
确认目标日志路径与权限
先确保你要取的日志在受管主机上真实存在、可读,并注意路径是否因环境差异而变化(比如不同发行版日志位置不同):
- 常见服务日志:/var/log/nginx/error.log、/var/log/journal/(需用
journalctl导出)、/opt/app/logs/app.log - Ansible 自身执行日志:如果启用了
log_path配置,通常在控制节点,不在远端;但 Playbook 中写入的调试日志(如debug模块输出到文件)可能在远端 - 权限检查:若日志属 root,需加
become: yes才能读取;可用stat模块预检:
- name: 检查日志是否存在且可读
stat:
path: /var/log/myapp/error.log
register: log_stat
- name: 跳过 fetch(若不存在)
fetch:
src: /var/log/myapp/error.log
dest: ./logs/{{ inventory_hostname }}/error.log
flat: no
when: log_stat.stat.exists and log_stat.stat.readable
用 fetch 拉取并结构化保存
fetch 默认会把文件存到 dest 指定目录下,按 {{ inventory_hostname }}/relative/path 分层,这是它的核心优势:
-
flat: no(默认):保留原始路径结构,适合多主机、多路径场景 -
flat: yes:直接平铺到 dest 目录,适合只取单个固定文件(如/tmp/deploy.log),避免嵌套 - 示例任务:
- name: 回传应用错误日志
fetch:
src: /opt/myapp/logs/error-{{ ansible_date_time.date }}.log
dest: ./failure-logs/
flat: no
fail_on_missing: no # 文件不存在时不中断整个 Playbook
become: yes
结合失败处理机制触发回传
fetch 本身不感知前序任务是否失败,必须配合 Ansible 的错误控制逻辑才能做到“仅在失败时执行”:
- 用
ignore_errors: yes+failed_when显式定义失败条件,再用block+rescue捕获异常:
block:
- name: 执行高风险部署任务
command: /opt/myapp/deploy.sh
register: deploy_result
failed_when: deploy_result.rc != 0
rescue:
- name: 部署失败 —— 立即回传日志
fetch:
src: /opt/myapp/logs/deploy-{{ ansible_date_time.iso8601_basic }}.log
dest: ./crash-dumps/
flat: no - 或更轻量:用
when判断前一个任务状态(需注册变量):
- name: 记录部署结果
command: echo "deploy finished"
register: deploy_step
ignore_errors: yes
- name: 失败时回传日志
fetch:
src: /var/log/syslog
dest: ./syslog-failures/
flat: no
when: deploy_step is failed
增强可靠性:压缩+校验+清理
线上日志往往很大,直接 fetch 可能慢或超时;同时要防止传输损坏:
- 先在远端打包压缩(用
archive模块),再 fetch 压缩包:
- name: 打包日志目录
archive:
path: /opt/myapp/logs/
dest: /tmp/logs-{{ ansible_date_time.date }}.tar.gz
format: gz
owner: root
group: root
mode: '0600'
- name: 回传压缩包
fetch:
src: /tmp/logs-{{ ansible_date_time.date }}.tar.gz
dest: ./logs-bundles/
flat: yes - 传输后可选校验:fetch 会返回
checksum字段,可在后续 task 中用assert或shell调用sha256sum对比 - 远端临时文件建议清理(尤其压缩包),避免磁盘占满:
- name: 清理远端临时包
file:
path: /tmp/logs-*.tar.gz
state: absent
when: deploy_step is failed


















