差异模式看的是什么
差异模式(--diff)让支持它的模块把变更前后两个版本并排打印出来,形如统一 diff 的加号减号行。它解决的是“任务说 changed 但不知道改了什么”的问题:配置文件、模板、行编辑类模块的内容级差别都能直接看到。差异模式本身不改变执行行为,只增加输出,因此既可以在真实执行时开,也可以在检查模式(--check)下开。
基本信息
| 命令行 | ansible-playbook --diff(常与 --check 合用) |
|---|---|
| 任务级控制 | diff: false 关闭单个任务的差异输出 |
| 适用模块 | template、copy、lineinfile、blockinfile 等文本改动类模块 |
| 不适用 | 命令执行类、包管理、服务管理模块没有内容级差异可展示 |
| 输出位置 | 由回调插件决定,默认打印到终端,也可进日志或 JSON 结果 |
| 注意事项 | 差异内容含真实配置值,等同于把配置内容写进日志 |
典型使用场景
- 变更前评审:把将要改动的配置行贴进变更单,供审核人确认
- 排错:任务显示 changed 但与预期不符,用差异看到底写进去了什么
- 模板调试:验证 Jinja2 渲染结果与手工写的内容是否一致
- 漂移复核:定期 --check --diff,看现网配置被谁改过、改了多少行
- 敏感环境下临时排查:确认差异里是否混入了不该出现的字段
- 批量下发前的抽样验证:用 --limit 挑一台看差异,再决定是否全量
常用组合
常用组合
# 只预演并显示差异,不落地
ansible-playbook -i inventory site.yml --check --diff
# 真实执行但显示差异,便于事后核对
ansible-playbook -i inventory site.yml --diff --limit web1
# 任务级关闭差异输出(yaml 片段)
# - name: 大量文本替换,差异过长
# ansible.builtin.template:
# src: big.conf.j2
# dest: /etc/app/big.conf
# diff: false
# 只看某个标签的差异
ansible-playbook -i inventory site.yml --check --diff --tags nginx差异输出读法
| 标记 | 含义 | 判读要点 |
|---|---|---|
| --- 与 +++ | 变更前与变更后的文件标识 | 确认路径与模块报的目标一致,别改错文件 |
| - 开头的行 | 将被删除或替换掉的旧内容 | 重点看这些行是否是被别人手工改过的关键配置 |
| + 开头的行 | 将写入的新内容 | 核对模板变量渲染后的实际值,而不是模板源码 |
| @@ 行 | 变更发生在第几段附近的定位信息 | 配合行号定位到源文件的具体位置 |
| binary 提示 | 二进制内容无法逐行比较 | 文本类模块出现该提示通常说明目标文件已被写坏 |
差异输出会把真实配置值(可能包含口令、密钥、连接串)原样打进终端与日志。对含敏感字段的任务应同时设置任务的 no_log: true 与 diff: false,或把这些字段值完全放到 vault 加密变量里再使用。
差异是“模块认为要写的内容”与目标文件当前内容的比对,不是历史记录:手工在目标机上做过的改动会当成差异显示出来,所以差异行多不代表 playbook 有问题,也可能是现网被改过。
怎么用到流程里
把 --check --diff 固定放进变更流程的第一步:先导出差异贴到变更记录,人确认后再去掉 --check 真实执行。差异文本可以留档作为“这次改了什么”的证据,比只记任务名清楚得多。对于文件很大的场景,用 --limit 抽样或对个别任务 diff: false 控制输出体量。