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

Ansible如何用synchronize模块从localhost同步目录至host_b?

解决Ansible 2.4.2.0中将localhost目录同步到host_b的问题

你遇到的问题其实是对synchronize模块的delegate_to用法理解有点偏差,我来给你梳理下可行的方案:

方案一:正确使用synchronize模块(推荐,适合大目录增量同步)

synchronize默认是从控制节点(localhost)推送文件到远程主机,但如果直接用delegate_to: host_b,相当于把执行节点换成了host_b,此时默认的push模式就变成从host_b推送到原任务目标主机(host_a),这就是你说的反向问题。

正确的做法是把任务委派回localhost,同时指定目标主机为host_b,这样rsync就会从localhost直接推送到host_b:

- name: 将localhost目录同步到host_b
  synchronize:
    src: /你的本地目录路径/
    dest: /host_b上的目标路径/
    mode: push  # 这是默认值,可省略
  delegate_to: localhost
  vars:
    ansible_ssh_host: host_b  # 指定目标主机为host_b

或者更直接的,在dest里明确指定host_b的地址(需要localhost能通过ssh免密访问host_b):

- name: 将localhost目录同步到host_b
  synchronize:
    src: /你的本地目录路径/
    dest: 你的用户名@host_b:/host_b上的目标路径/
  delegate_to: localhost

这样执行时,Ansible会在localhost上运行rsync命令,直接把本地目录推送到host_b,完美解决方向问题。

方案二:用copy模块递归复制(适合小目录)

你想到的删除目标目录再用copy的方法是可行的,而且写法也很直观:

- name: 先清空host_b上的目标目录(可选,根据需求决定)
  file:
    path: /host_b上的目标路径/
    state: absent
  delegate_to: host_b

- name: 递归复制localhost目录到host_b
  copy:
    src: /你的本地目录路径/
    dest: /host_b上的目标路径/
    remote_src: no  # 默认就是no,可省略,明确表示源在本地
  delegate_to: host_b

注意src末尾的斜杠:如果加斜杠,会把目录里的内容复制到目标目录;如果不加,会把整个目录复制到目标路径下,根据你的需求调整即可。

两种方案对比:synchronize基于rsync,支持增量同步,大目录、频繁更新的场景下更高效;copy模块操作简单,适合小目录一次性复制的场景。

内容的提问来源于stack exchange,提问作者tinita

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:25:57