如何使用ansible在两个节点之间复制文件

我需要将文件表单机A复制到机器B,而从我运行所有我的任务的控制机器是机器C(本地机器)

我已经尝试了以下内容:

  1. 在shell模块中使用scp命令
主机:machine2
 user:user2
任务:
   -  name:将machine1中的文件复制到machine2 
     shell:scp user1 @ machine1:/ path-of-file / file1 / home / user2 / file1

这种方法只是继续下去,永远不会结束。

  1. 使用获取和复制模块
主机:machine1
 user:user1
任务:
   - 名称:将machine1中的文件复制到本地
     fetch:src = / path-of-file / file1 dest = / path-of-file / file1

主机:machine2
 user:user2
任务:
   - 名称:从本地复制文件到machine2
    复制:src = / path-of-file / file1 dest = / path-of-file / file1

这种方法抛出了一个错误,如下所示:

访问文件/Users//.ansible/cp/ansible-ssh-machine2-22-时出错,错误是:[Errno 102] socket不支持的操作:u'/ Users //。ansible / cp / ansible-ssh -machine2-22-”

任何的意见都将会有帮助。

要复制远程到远程文件,可以使用带有“delegate_to:source-server”的同步模块:

- hosts: serverB tasks: - name: Copy Remote-To-Remote (from serverA to serverB) synchronize: src=/copy/from_serverA dest=/copy/to_serverB delegate_to: serverA 

这个剧本可以从你的机器上运行。

由于ant31已经指出你可以使用synchronize模块来做到这一点。 默认情况下,模块在控制机器和当前远程主机( inventory_host )之间传输文件,但可以使用任务的delegate_to参数(注意这是任务的参数,而不是模块的参数)来更改文件。

您可以将任务放在ServerAServerB ,但必须相应地调整传输的方向(使用synchronizemode参数)。

将任务放在ServerB

 - hosts: ServerB tasks: - name: Transfer file from ServerA to ServerB synchronize: src: /path/on/server_a dest: /path/on/server_b delegate_to: ServerA 

这使用默认mode: push ,因此文件从ServerAServerA )传输到当前远程( ServerB )。

这可能听起来很奇怪,因为任务已经放在ServerB (通过hosts: ServerB )。 但是,必须记住,该任务实际上是在委托主机上执行的 ,在这种情况下是ServerA 。 所以推(从ServerAServerB )确实是正确的方向。 另外请记住,我们不能简单地select不委派,因为这意味着在控制机器ServerB之间发生传输。

将任务放在ServerA

 - hosts: ServerA tasks: - name: Transfer file from ServerA to ServerB synchronize: src: /path/on/server_a dest: /path/on/server_b mode: pull delegate_to: ServerB 

这使用mode: pull反转传输方向。 再次,请记住,这个任务实际上在ServerB执行,所以拉是正确的select。

如果您需要通过合理的方式在两个远程节点之间同步文件,可以使用以下命令:

 - name: synchronize between nodes environment: RSYNC_PASSWORD: "{{ input_user_password_if_needed }}" synchronize: src: rsync://user@remote_server:/module/ dest: /destination/directory/ // if needed rsync_opts: - "--include=what_needed" - "--exclude=**/**" mode: pull delegate_to: "{{ inventory_hostname }}" 

remote_server时,需要使用守护进程模式启动rsync。 简单的例子:

 pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock log file = /var/log/rsync.log port = port [module] path = /path/to/needed/directory/ uid = nobody gid = nobody read only = yes list = yes auth users = user secrets file = /path/to/secret/file 

我能够解决这个问题,使用local_action scp从machineA到machineC文件,然后将文件复制到machineB。