如何通过rsync/ssh使用synchronize模块从非清单服务器拉取文件?
解决Ansible synchronize模块从非清单主机拉取内容的路径异常问题
我来帮你分析下这个问题的根源,再给出针对性的解决方案:
问题核心原因
你设置delegate_to: "{{ inventory_hostname }}"并使用mode: pull的逻辑是对的——让每台目标主机自己去连接wallaby拉取内容,而非通过Ansible控制节点中转。但因为wallaby不在你的Ansible清单里,Ansible不会自动处理和它的SSH连接配置(比如密钥、远程用户),再加上rsync的路径规则容易踩坑,就导致了本地路径异常的问题。
修正后的任务配置
方案1:调整synchronize参数(推荐)
- name: Pull content from wallaby to local directory synchronize: src: "wallaby:/remote/path/" # 注意末尾的斜杠!这是rsync路径规则的关键 dest: "/local/path/" mode: pull rsync_opts: # 手动指定SSH参数,确保目标主机能无交互连接wallaby - "-e ssh -o StrictHostKeyChecking=no -i /home/your-user/.ssh/wallaby_private_key" delegate_to: "{{ inventory_hostname }}"
这里有几个必须注意的细节:
- 路径末尾的斜杠:这是rsync的核心规则——如果
src末尾加斜杠,会把/remote/path里的所有内容直接复制到/local/path;如果不加斜杠,会把/remote/path这个目录本身复制到/local/path下(最终路径会变成/local/path/path),这大概率是你遇到的“路径异常”的直接原因。 - rsync_opts配置:因为wallaby不在清单中,你需要手动指定SSH连接参数:
-o StrictHostKeyChecking=no:避免首次连接时需要手动确认主机密钥(如果已经配置过信任可以去掉)-i /path/to/private/key:指定目标主机用来连接wallaby的私钥路径- 如果wallaby的SSH用户和目标主机当前用户不同,还可以加
-l wallaby_user指定远程用户
方案2:直接调用rsync命令(更灵活,适合调试)
如果synchronize模块的封装让你觉得受限,也可以直接用command模块执行原生rsync命令,方便查看详细输出排查问题:
- name: Pull content via raw rsync command command: rsync -avz -e "ssh -o StrictHostKeyChecking=no -i /home/your-user/.ssh/wallaby_private_key" wallaby:/remote/path/ /local/path/ delegate_to: "{{ inventory_hostname }}"
前置验证步骤
在运行剧本前,建议先手动在任意一台目标主机上执行对应的rsync命令,确认:
- 目标主机能通过SSH正常连接wallaby(密钥验证通过,无交互)
- wallaby上的
/remote/path有可读权限,目标主机的/local/path存在且有写入权限 - rsync命令执行后,文件路径完全符合你的预期
内容的提问来源于stack exchange,提问作者Mikhail T.
相关产品推荐
相关产品推荐

