Ansible远程到远程复制文件:无需rsync守护进程的替代方案咨询
不用rsync守护进程也能直接跨主机同步文件的最优方案
嘿,你之前对synchronize模块的顾虑其实是个小误解——它默认是通过SSH协议同步文件的,完全不需要启动rsync守护进程!这刚好能满足你的需求:不需要把文件先拉到Ansible控制端,直接从ubuntu1同步到ubuntu2/3/4。
方案一:用synchronize模块(推荐)
这是最符合Ansible最佳实践的方法,配置简单且高效。你只需要在playbook里把同步任务委托给ubuntu1执行,就能直接把文件推送到目标主机:
- name: Sync /etc/resolv.conf from ubuntu1 to target hosts hosts: ubuntu2,ubuntu3,ubuntu4 become: yes # 因为/etc/resolv.conf需要root权限修改 tasks: - name: Copy resolv.conf from ubuntu1 to current host ansible.builtin.synchronize: src: /etc/resolv.conf # ubuntu1上的源文件路径 dest: /etc/resolv.conf # 目标主机上的目标路径 delegate_to: ubuntu1 # 让这个任务在ubuntu1上执行
为什么这个可行?
当你设置delegate_to: ubuntu1后,synchronize会从ubuntu1发起SSH连接到目标主机(ubuntu2/3/4),直接把文件传过去,全程不需要rsync守护进程,完全依赖已有的SSH信任关系(只要你的Ansible控制机能管理所有主机,通常这个信任已经配置好了)。
方案二:用scp命令(备选)
如果你实在不想用synchronize模块,也可以直接在目标主机上执行scp命令拉取ubuntu1的文件,前提是ubuntu2/3/4能免密SSH访问ubuntu1:
- name: Fetch resolv.conf from ubuntu1 via scp hosts: ubuntu2,ubuntu3,ubuntu4 become: yes tasks: - name: Run scp to copy file ansible.builtin.shell: scp ubuntu1:/etc/resolv.conf /etc/resolv.conf
不过这个方法的缺点是:scp不会像synchronize那样做增量同步(当然对于单个小文件来说影响不大),而且需要确保主机间的SSH密钥已经配置好免密登录。
注意事项
- 不管用哪种方法,都需要
become: yes,因为/etc/resolv.conf是系统文件,普通用户没有写入权限。 - 确保ubuntu1和目标主机之间的SSH信任已经配置(Ansible能管理这些主机的话,通常已经搞定了这一步)。
内容的提问来源于stack exchange,提问作者Hall K
相关产品推荐
相关产品推荐

