You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 22:15:08