本地连接的是serverA:
hosts: serverB
- name: Deploy firmware images
synchronize:
src: /path/on/serverA
dest: /path/on/serverB
checksum: true
delegate_to: serverB
本地连接的是serverB:
hosts: serverA
- name: Deploy firmware images
synchronize:
src: /path/on/serverA
dest: /path/on/serverB
checksum: true
mode: pull
# delegate_to: serverB
delegate_to: "{{ item }}"
loop: "{{ query('inventory_hostnames', pxe_hosts | default('serverB')) }}"
# loop: "{{ lookup('inventory_hostnames', pxe_hosts | default('serverB'), wantlist=True) }}" lookup 需要加wantlist=True来返回list
run_once: true
在hosts为serverA的情况,若serverA 中包含多台server:
hosts文件:
[serverA]
server1
server2
[serverB]
server3
server4
-
则在ansible运行时,若没有run_once: true, server1和server2都会向serverB同步文件。
并且在server执行时会报错:
\r\nrsync: rename failed for “/path/on/serverB/test_file” (from bios/.tmp/test): No such file or directory (2)\nrsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1650) [generator=3.1.2]\n", “rc”: 23
同步过去的目的地的文件/path/on/serverB/test_file会出现问题,具体原因还未找到。若有run_once: true, 那么此task只会在第一台server上运行。
-
如果要同步到多台server, 如此例中的[serverB] 下的两台server, 不能直接在delegate_to中写serverB,
需写成:delegate_to: "{{ item }}" loop: "{{ query('inventory_hostnames', pxe_hosts | default('serverB')) }}"
pxe_hosts 为在运行ansible时通过 -e 传入的参数:
ansible-playbook -i ./hosts -e "pxe_hosts=server3" deploy.yml
-
synchronize模块和copy模块的简单比较
copy模块不支持从远端到本地的拉去操作,fetch模块支持,但是src参数不支持目录递归,只能回传具体文件;
copy模块的remote_src参数是指定从远端服务器上往远端服务器上复制,相当于在shell模块中执行copy命令;
synchronize则支持文件下发和回传,分别对应的push和pull模式。synchronize模块的功能依赖于rsync.x86_64,但是功能不依赖于rsync配置文件中定义的模块;
copy模块适用于小规模文件操作,synchronize支持大规模文件操作。 -
使用synchronize模块,delegate_to remoteB, 前提保证remoteB 的serverB 能够ssh免密访问remoteA的server
即serverA 的.ssh/authorized_keys 中要有serverB的id_rsa.pub。 否者会一直卡住