Ansible 2.5 copy模块返回值异常:执行成功却返回OK而非CHANGED
关于Ansible 2.5复制目录返回OK而非CHANGED的解释
这个现象是Ansible在2.3版本之后对copy模块处理目录的行为做了优化变更导致的,和你之前使用的2.2版本逻辑存在差异。
具体原因
在Ansible 2.2及更早版本中,copy模块处理目录时基本不会对源目录和目标目录的内容做严格的一致性校验——哪怕目标目录已经存在且内容和源完全一致,执行任务后也会标记为CHANGED。
而从2.3版本开始,Ansible优化了copy模块的目录同步逻辑:当你指定的src是一个目录,且dest是已存在的目录时,模块会自动对比源目录下所有文件的内容、权限、属主属组等元数据。如果所有内容完全匹配,就会返回OK;只有当存在文件新增、修改、删除或者元数据变化时,才会标记为CHANGED。这种优化能避免无意义的变更标记,提升Playbook的执行效率。
针对你的场景的解决思路
根据你的需求,有几种处理方式:
- 如果需要强制标记为CHANGED:不管内容是否一致,都希望任务执行后显示
CHANGED,可以通过changed_when参数手动控制变更状态:- name: copy files share copy: dest: "/opt/" mode: 0644 owner: root group: root src: "./share" changed_when: true - 如果需要准确检测内容变更:当前2.5的行为其实是更合理的,它能精准识别目录内容是否真的有变化,避免无效操作。如果你只是疑惑为什么和旧版本不一样,理解这个优化逻辑即可。
- 如果目标是复制整个
share目录到/opt下:你当前的写法是把share里的内容直接放到/opt/目录下,如果实际需求是生成/opt/share目录,需要修改dest参数为/opt/share,这样当目标目录不存在时会创建并复制内容(返回CHANGED),存在且内容一致时返回OK。
内容的提问来源于stack exchange,提问作者Hassan Wh
相关产品推荐
相关产品推荐

