我需要将文件格式机A复制到机器B,而我运行所有安全任务的控制机器是机器C(本地机器)
我尝试过以下方法:
在ansible的shell模块中使用scp命令
hosts: machine2
user: user2
tasks:
- name: Copy file from machine1 to machine2
shell: scp user1@machine1:/path-of-file/file1 /home/user2/file1
这种方法一直持续下去。
使用获取和复制模块
hosts: machine1
user: user1
tasks:
- name: copy file from machine1 to local
fetch: src=/path-of-file/file1 dest=/path-of-file/file1
hosts: machine2
user: user2
tasks:
- name: copy file from local to machine2
copy: src=/path-of-file/file1 dest=/path-of-file/file1
这种方法给我一个错误如下:
error while accessing the file /Users/<myusername>/.ansible/cp/ansible-ssh-machine2-22-<myusername>, error was: [Errno 102] Operation not supported on socket: u'/Users/<myusername>/.ansible/cp/ansible-ssh-machine2-22-<myusername>'
任何的意见都将会有帮助。
要复制远程到远程文件,可以使用带有'synchronize'关键字的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
上,但您必须相应地调整传输方向(使用mode
的synchronize
参数)。
将任务放在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
)传输到当前远程(ServerB
)。
这可能听起来很奇怪,因为任务已放在ServerB
(通过hosts: ServerB
)。但是,必须记住,任务实际上是在委托主机上执行的,在本例中是ServerA
。所以推动(从ServerA
到ServerB
)确实是正确的方向。还要记住,我们不能简单地选择不委托,因为这意味着转移发生在控制机器和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
上执行的,因此pull是正确的选择。
我能够使用local_action解决这个问题,将scp文件从machineA文件复制到machineC,然后将文件复制到machineB。
如果需要通过ansible在两个远程节点之间同步文件,可以使用:
- 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
使用复制模块将文件从一个服务器传输到另一个服务器的简单方法
这是剧本
---
- hosts: machine1 {from here file will be transferred to another remote machine}
tasks:
- name: transfer data from machine1 to machine2
copy:
src=/path/of/machine1
dest=/path/of/machine2
delegate_to: machine2 {file/data receiver machine}
如果要执行rsync并使用自定义用户和自定义ssh密钥,则需要在rsync选项中编写此密钥。
---
- name: rsync
hosts: serverA,serverB,serverC,serverD,serverE,serverF
gather_facts: no
vars:
ansible_user: oracle
ansible_ssh_private_key_file: ./mykey
src_file: "/path/to/file.txt"
tasks:
- name: Copy Remote-To-Remote from serverA to server{B..F}
synchronize:
src: "{{ src_file }}"
dest: "{{ src_file }}"
rsync_opts:
- "-e ssh -i /remote/path/to/mykey"
delegate_to: serverA
您也可以使用deletgate
和scp
:
- name: Copy file to another server
become: true
shell: "scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null admin@{{ inventory_hostname }}:/tmp/file.yml /tmp/file.yml"
delegate_to: other.example.com
由于delegate
,命令在另一台服务器上运行,而scp
是自己的文件。