如何使用ansible在两个节点之间复制文件
我需要将文件表单机A复制到机器B,而从我运行所有我的任务的控制机器是机器C(本地机器)
我已经尝试了以下内容:
- 在shell模块中使用scp命令
主机:machine2 user:user2 任务: - name:将machine1中的文件复制到machine2 shell:scp user1 @ machine1:/ path-of-file / file1 / home / user2 / file1
这种方法只是继续下去,永远不会结束。
- 使用获取和复制模块
主机: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
参数(注意这是任务的参数,而不是模块的参数)来更改文件。
您可以将任务放在ServerA
或ServerB
,但必须相应地调整传输的方向(使用synchronize
的mode
参数)。
将任务放在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
,因此文件从ServerA
( ServerA
)传输到当前远程( ServerB
)。
这可能听起来很奇怪,因为任务已经放在ServerB
(通过hosts: ServerB
)。 但是,必须记住,该任务实际上是在委托主机上执行的 ,在这种情况下是ServerA
。 所以推(从ServerA
到ServerB
)确实是正确的方向。 另外请记住,我们不能简单地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。
这对我来说就像一个bug。 我在这里报道过
如果您需要通过合理的方式在两个远程节点之间同步文件,可以使用以下命令:
- 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。