使用Ansible synchronize模块跨远程主机传文件的问题咨询
问题解答
问题翻译
现有三台虚拟机:VM.A为Ansible控制节点,VM.B为远程服务器1(源服务器),VM.C为远程服务器2(目标服务器)。我希望使用Ansible的synchronize模块将VM.B的文件传输至VM.C,以避免占用控制节点的/tmp目录。以下是示例YAML代码,但当前代码无法运行。已知控制节点可SSH连接VM.B与VM.C,请问VM.B是否需要能SSH连接VM.C?
示例代码:
- name: 在远程服务器间复制文件 hosts: source_servers become: yes # 如需获取读取源文件的权限则启用 tasks: - name: 将文件同步到目标服务器 synchronize: src: /path/to/source/file dest: /path/on/destination/server/file delegate_to: "{{ groups['destination_servers'][0] }}" # 从目标服务器组中选择第一台服务器 become: yes # 如需获取写入目标路径的权限则启用
核心问题解答
你的现有代码无法运行的原因是同步逻辑配置错误:当你delegate_to到VM.C时,synchronize默认会把VM.C本地的src路径文件推送到VM.C的dest路径,完全没涉及VM.B的文件,这显然不符合需求。
关于VM.B是否需要能SSH连接VM.C,取决于你选择的文件传输方向:
方式1:从VM.B推送文件到VM.C(贴合源→目标的逻辑)
这种情况下需要VM.B能够免密SSH登录VM.C,因为synchronize基于rsync,推送模式下是从源节点(VM.B)发起连接到目标节点(VM.C)。
修改后的Playbook示例:
- name: 从VM.B推送文件到VM.C hosts: source_servers # 即VM.B所在的组 become: yes tasks: - name: 同步文件到VM.C synchronize: src: /path/to/source/file # VM.B上的源文件路径 dest: "{{ ansible_user }}@{{ groups['destination_servers'][0] }}:/path/on/destination/server/file" # 指定VM.C的路径,格式为「用户@目标节点地址:路径」 mode: push # 默认就是push,可省略
方式2:从VM.C拉取VM.B的文件
这种情况下需要VM.C能够免密SSH登录VM.B,此时任务代理到VM.C,由VM.C主动拉取VM.B的文件。
修改后的Playbook示例:
- name: 从VM.C拉取VM.B的文件 hosts: destination_servers # 即VM.C所在的组 become: yes tasks: - name: 从VM.B同步文件到本地 synchronize: src: "{{ ansible_user }}@{{ groups['source_servers'][0] }}:/path/to/source/file" # 指定VM.B的路径 dest: /path/on/destination/server/file # VM.C上的目标路径 mode: pull # 必须设置为pull,明确拉取模式
两种方式都能避免占用控制节点VM.A的/tmp目录,因为文件直接在VM.B和VM.C之间传输。
内容的提问来源于stack exchange,提问作者Alistair
相关产品推荐
相关产品推荐

