如何使用Ansible复制远程Linux服务器上的空文件夹?
解决Ansible复制空文件夹的问题
我之前也碰到过一模一样的问题!Ansible的copy模块默认不会同步空目录——它的核心逻辑是基于文件的存在性来处理的,空文件夹里没有任何文件,所以会被直接忽略掉。下面给你两种实用的解决方案:
方法一:用file模块手动创建空目录
既然copy模块不处理空文件夹,我们可以先完成文件的复制,再单独用file模块创建需要的空目录。这种方式简单直接,适合目录结构不复杂的场景。
示例Playbook:
- name: Copy config test copy: src: /home/user/test/ dest: /tmp/test - name: Create empty log directory file: path: /tmp/test/log state: directory mode: '0755' # 可以根据需求设置权限,建议和原目录保持一致
解释:第一个任务负责复制所有带文件的目录和文件,第二个任务专门创建log这个空目录,state: directory会确保目录存在,就算已经存在也不会报错。
方法二:用synchronize模块替代copy
如果你需要同步整个目录结构(包括所有空目录),推荐使用synchronize模块——它基于rsync,天生支持空目录的同步,更适合复杂目录结构的场景。
示例Playbook:
- name: Sync entire test directory including empty folders synchronize: src: /home/user/test/ dest: /tmp/test rsync_opts: - "--include='*/'" # 确保所有目录都被包含,包括空目录 - "--include='*'" # 包含所有文件
解释:synchronize模块默认会保留目录结构,加上rsync_opts里的参数可以明确指定包含所有目录和文件,这样空的log文件夹就会被同步到远程服务器了。
额外灵活方案:自动探测并创建空目录
如果你不确定本地目录里有哪些空文件夹,也可以用Ansible的find模块先探测本地的空目录,再动态创建远程对应的目录,这种方式不用手动维护目录列表,适合目录结构经常变化的情况:
- name: Find empty directories locally find: paths: /home/user/test/ file_type: directory empty: yes register: empty_dirs delegate_to: localhost - name: Create empty directories on remote file: path: "/tmp/test/{{ item.path | relpath('/home/user/test/') }}" state: directory mode: '0755' loop: "{{ empty_dirs.files }}"
这样不管本地新增多少空目录,远程都会自动创建对应的目录,不用频繁修改Playbook。
内容的提问来源于stack exchange,提问作者useresxi
相关产品推荐
相关产品推荐

