使用ansible.posix.synchronize同步至异名目录的问题排查
解决Ansible synchronize模块同步文件时避免源目录嵌套的问题
问题场景
使用ansible.posix.synchronize从本地同步文件树到远程时,希望将源目录下的所有文件直接放到目标目录根目录,而不是让源目录作为子目录嵌套在目标里。比如执行以下任务:
- name: Add dot files ansible.posix.synchronize: src: files/legacy/. dest: "{{ ansible_env['HOME'] }}/." owner: false group: false
实际结果是远程用户家目录下生成了legacy子目录,但需求是把files/legacy/内的文件直接放到家目录根目录。
问题根源在于synchronize模块会自动归一化src参数,移除末尾的/.后缀,导致rsync无法识别“仅同步目录内内容”的指令。
解决方案
方案1:通过rsync_opts传递过滤参数
利用rsync的过滤规则,明确指定只同步源目录内的内容,不包含源目录本身:
- name: Add dot files ansible.posix.synchronize: src: files/legacy/ dest: "{{ ansible_env['HOME'] }}/" owner: false group: false rsync_opts: - "--exclude=./"
--exclude=./会告诉rsync跳过源目录本身,只同步其内部的所有文件和子目录,正好满足需求。
如果需要更精细的过滤(比如只同步点文件),可以调整规则:
rsync_opts: - "--include=*/" # 先包含所有子目录,保证递归同步 - "--include=.*" # 包含所有点文件 - "--exclude=*" # 排除其他所有文件
方案2:直接调用rsync原生命令
绕过synchronize模块的路径处理,用command模块执行原生rsync命令,完全掌控参数:
- name: Add dot files command: rsync -av --no-owner --no-group files/legacy/. {{ ansible_env['HOME'] }}/ delegate_to: localhost
delegate_to: localhost确保命令在本地执行(和synchronize默认推送模式一致)-a包含递归、权限保留等常用同步参数--no-owner和--no-group对应原任务的owner: false和group: false
方案3:使用synchronize的_raw_params(不推荐)
如果必须使用synchronize模块,可以尝试用内部参数_raw_params直接传递rsync命令行,绕过模块的路径归一化:
- name: Add dot files ansible.posix.synchronize: _raw_params: "-av --no-owner --no-group files/legacy/. {{ ansible_env['HOME'] }}/"
注意:这个方法依赖模块内部实现,版本更新可能导致失效,优先推荐前两种方案。
内容的提问来源于stack exchange,提问作者Erik Ogan
相关产品推荐
相关产品推荐

