首页/系统与基础设施/自动化运维速查/差异模式与变更预览的用法
Ansible 核心70 条

差异模式与变更预览的用法

差异模式(--diff)让支持它的模块打印变更前后的内容差异,回答“到底改了哪几行”;可与 --check 组合用于预演评审,也可在真实执行时用于事后核对。差异含真实配置值,需配合 no_log 与 vault 控制暴露。

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌​​‌​​​‌‌​‌​​‌​‌‌​​‌‌​​‌‌​​‌‌​​​‌​‌‌​‌​‌‌​‌‌​‌​‌‌​‌‌‌‌​‌‌​​‌​​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​​​‌‌​‌‌​‌​​​​‌‌​​​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​​‌​‌​​‌​‌‌​‌​‌‌‌​​​​​‌‌‌​​‌​​‌‌​​‌​‌​‌‌‌​‌‌​​‌‌​‌​​‌​‌‌​​‌​‌​‌‌‌​‌‌‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

差异模式看的是什么

差异模式(--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 控制输出体量。

易错点

  • 在真实执行的运行里长期开着 --diff,日志里堆积大量配置内容,既涨体积又扩大敏感信息暴露面
  • 把差异当成历史审计依据,忽略了它只反映“当前文件与目标内容”的差别
  • 对超大配置文件不做限制,差异输出把终端刷屏,真正有用的报错被淹没
  • 敏感字段没有配合 no_log 使用,口令通过差异输出进到日志和工单系统
  • 在检查模式下看到差异就认定执行一定会改,忽略了命令类任务无法预演的部分

数据来源与参考

  • Ansible 官方文档 Validating tasks: check mode and diff mode
  • Ansible 官方文档 diff 任务关键字与回调和插件输出

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/automation/diff-mode-change-preview.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌​​‌​​​‌‌​‌​​‌​‌‌​​‌‌​​‌‌​​‌‌​​​‌​‌‌​‌​‌‌​‌‌​‌​‌‌​‌‌‌‌​‌‌​​‌​​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​​​‌‌​‌‌​‌​​​​‌‌​​​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​​‌​‌​​‌​‌‌​‌​‌‌‌​​​​​‌‌‌​​‌​​‌‌​​‌​‌​‌‌‌​‌‌​​‌‌​‌​​‌​‌‌​​‌​‌​‌‌‌​‌‌‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​