Ansible无原生命令批量校验远程文件MD5,需用shell模块调用md5sum或stat模块(≥2.5版支持checksum_algorithm: md5)获取哈希值,再通过register和assert比对;fetch仅拉取文件不校验。

Ansible 本身不直接提供“批量校验远程文件 MD5”的原子模块,但可通过 command 或 shell 模块调用远程主机的 md5sum 命令,结合 fetch(拉取文件)或 stat(获取哈希)等模块协同实现。关键在于:校验动作发生在目标主机,而非控制端;结果需收集、比对,不能仅靠单次执行断言。
用 shell 模块在目标主机计算并返回 MD5 值
这是最常用、最轻量的方式,适用于已知待校验文件路径的场景:
- 使用
shell: md5sum /path/to/file | awk '{print $1}'提取纯哈希值(避免空格/星号干扰) - 必须加
chdir或绝对路径,防止因工作目录不同导致文件找不到 - 建议加
ignore_errors: yes并配合failed_when判断文件是否存在,提升健壮性
示例任务:
- name: 获取 /etc/hosts 的 MD5 值shell: md5sum /etc/hosts | awk '{print $1}'
args:
chdir: /
register: hosts_md5
ignore_errors: yes
failed_when: hosts_md5.rc != 0 or 'No such file' in hosts_md5.stderr
用 stat 模块直接读取文件哈希(推荐用于存在性+完整性双检)
stat 模块原生支持 checksum 字段(默认为 sha256),但若目标主机系统支持且 Ansible 版本 ≥ 2.5,可显式指定 checksum_algorithm: md5:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 无需依赖 shell 解析,更安全、更幂等
- 自动处理文件不存在、权限不足等异常,返回结构化结果
-
stat结果中的checksum字段即为小写 32 位 MD5 字符串(不含空格和类型标识)
示例任务:
- name: 检查 /opt/app/config.yml 的 MD5stat:
path: /opt/app/config.yml
checksum_algorithm: md5
register: config_stat
- name: 断言 MD5 匹配
assert:
that:
- config_stat.stat.checksum == 'a1b2c3d4e5f678901234567890abcdef'
msg: "config.yml MD5 不匹配"
批量校验多个文件:用 loop + vars 定义基准哈希表
当需校验一批固定路径文件时,把预期 MD5 存在变量中,用循环逐个比对:
- 将文件路径与预期哈希组织为列表或字典,在
vars中定义 - 用
loop(替代旧版with_items)遍历,每个迭代调用stat或shell - 用
set_fact收集结果,最后统一报告或触发失败
示例片段(基于字典):
vars:expected_checksums:
- path: /etc/passwd
md5: 8d777f385d3dfec8815d20f7496026dc
- path: /etc/shadow
md5: b1d5a8f8e9c7d6b5a4f3e2d1c0b9a8f7
tasks:
- name: 校验每个文件 MD5
stat:
path: "{{ item.path }}"
checksum_algorithm: md5
loop: "{{ expected_checksums }}"
register: checksum_results
- name: 汇总不匹配项
set_fact:
failed_files: >-
{{ checksum_results.results | selectattr('stat.exists', 'equalto', true) | selectattr('stat.checksum', 'ne', item.md5) | map(attribute='item.path') | list }}
loop: "{{ expected_checksums }}"
注意 fetch 模块不校验 MD5 —— 它只拉取文件
fetch 模块作用是把远程文件复制到本地(按主机名分目录存储),它不会自动计算或比对哈希:
- 若你看到 “fetch 校验 MD5 失败”,通常是误以为 fetch 有校验逻辑,实际是拉取后需手动用本地
md5sum对比 - 适合场景:先 fetch 文件到控制端,再用
community.general.hashi_vault或自定义脚本做离线校验 - 若真要走 fetch 路径,务必配合
flat: yes和fail_on_missing: no控制行为

















