如何用Ansible Playbook仅复制新增或已修改的文件?
问题背景
我需要将src_directory目录下mfiles文件夹中的文件复制到dest_directory目录下的mfiles文件夹中,目前已有实现该功能的Ansible代码:
- name: 检查MYFILES是否存在(统计文件数量) shell: ls -1 {{ src_directory }}/mfiles/ | wc -l register: exist_mfiles delegate_to: localhost run_once: true - name: 复制MYFILES copy: src: "{{ src_directory }}/mfiles/" dest: "{{ dest_directory }}/mfiles/" force: yes mode: '664' when: exist_mfiles.stdout != "0"
存在的问题
这些文件数量多且体积庞大,当出现连接错误时,重新复制所有文件会耗费大量时间。
技术问询
如何通过Ansible Playbook仅复制新增或已修改的文件?
解决方案
1. 调整copy模块参数(简单直接)
你当前设置了force: yes,这会强制覆盖所有文件,不管内容是否变化。copy模块默认会对比源文件和目标文件的校验和,只有当文件新增或修改时才会同步,所以直接移除force: yes即可实现增量复制:
- name: 检查MYFILES是否存在(统计文件数量) shell: ls -1 {{ src_directory }}/mfiles/ | wc -l register: exist_mfiles delegate_to: localhost run_once: true - name: 增量复制MYFILES copy: src: "{{ src_directory }}/mfiles/" dest: "{{ dest_directory }}/mfiles/" mode: '664' when: exist_mfiles.stdout != "0"
2. 使用synchronize模块(大文件/大量文件推荐)
synchronize基于rsync实现,天生支持高效增量同步,适合大体积、多数量文件的场景,还能保留文件属性、处理软链接等:
- name: 检查MYFILES是否存在(统计文件数量) shell: ls -1 {{ src_directory }}/mfiles/ | wc -l register: exist_mfiles delegate_to: localhost run_once: true - name: 用rsync增量同步MYFILES synchronize: src: "{{ src_directory }}/mfiles/" dest: "{{ dest_directory }}/mfiles/" mode: push # 从控制端推送到目标节点,拉取则设为pull rsync_opts: - "--chmod=664" # 强制设置文件权限为664 when: exist_mfiles.stdout != "0"
注意:目标节点和控制端都需要安装rsync。
3. 优化文件存在性检查(更可靠)
原有的ls | wc -l在目录不存在时会报错,改用find模块更安全,能准确判断目录是否存在且有文件:
- name: 检查mfiles目录是否存在且非空 find: paths: "{{ src_directory }}/mfiles/" file_type: file register: mfiles_exists delegate_to: localhost run_once: true - name: 增量复制MYFILES copy: src: "{{ src_directory }}/mfiles/" dest: "{{ dest_directory }}/mfiles/" mode: '664' when: mfiles_exists.matched > 0
内容的提问来源于stack exchange,提问作者GingerHead
相关产品推荐
相关产品推荐

