Ansible如何对比两个目录并保证copy模块同步后目录内容完全一致
问题原因
Ansible 原生的copy模块默认仅同步源路径下新增、修改的文件到目标路径,不会删除目标路径中源路径不存在的文件,因此你删除源目录的9.txt后再次执行原有playbook,目标目录/tmp/data不会产生任何变动。
解决方案
方案1:使用synchronize模块(推荐)
synchronize模块底层基于rsync实现,原生支持目录完全同步,开启delete参数即可自动删除目标路径下源路径不存在的内容,执行效率远高于先删后拷的方案。
Playbook示例如下:
--- - hosts: localhost tasks: - name: 完全同步源目录到目标路径 synchronize: src: /tmp/test1/ dest: /tmp/data/ delete: yes
参数说明:
- 源路径末尾加
/表示同步目录内的内容,而非将test1目录本身整体复制到目标路径下 delete: yes开启同步删除逻辑,确保两边目录内容完全一致
首次执行前可在ansible-playbook命令后加
--check参数执行预演,确认操作符合预期再正式执行,避免误删文件。
方案2:先清空目标目录再复制
如果环境限制无法使用synchronize模块,可先删除目标目录再执行copy操作,适合小容量目录场景:
--- - hosts: localhost tasks: - name: 删除原有目标目录 file: path: /tmp/data state: absent - name: 重新复制源目录到目标路径 copy: src: /tmp/test1 dest: /tmp/data
内容的提问来源于stack exchange,提问作者yayun
相关产品推荐
相关产品推荐

