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
相关产品推荐
相关产品推荐

