无公网无rsync环境下,替代Ansible copy/synchronize的批量文件传输方案
可行解决方案
方案一:本地打包+Raw模块批量传输解压
这种方法通过一次性打包所有tar文件,再通过Raw模块(仅需SSH连接,不依赖目标节点Python环境)传输并解压,大幅减少传输次数、提升速度:
- 本地将所有目标tar文件打包为一个压缩包:
tar -czf all_images.tar.gz /root/file*.tar
- 通过Ansible Raw模块一次性传输并解压到所有服务器:
ansible all -m raw -a 'mkdir -pv /root/newimages/ && cat > /root/newimages/all_images.tar.gz && cd /root/newimages/ && tar -xzf all_images.tar.gz --strip-components=1' < /root/all_images.tar.gz
- 执行Docker镜像加载命令:
ansible all -m shell -a 'find /root/newimages/ -name "*.tar" -exec docker load -i {} \;'
注:
--strip-components=1用于去掉打包时的/root前缀,确保文件直接解压到/root/newimages/目录下。
方案二:使用Ansible Playbook结合with_fileglob批量Copy
如果偏好使用Ansible模块而非Raw命令,可编写简单Playbook实现批量Copy,相比逐条命令行Copy减少连接开销:
创建transfer_images.yml文件:
- name: 批量传输Docker镜像包并加载 hosts: all tasks: - name: 创建目标目录 shell: mkdir -pv /root/newimages/ - name: 批量复制所有tar文件 copy: src: "{{ item }}" dest: /root/newimages/ mode: 644 with_fileglob: - /root/file*.tar - name: 加载Docker镜像 shell: find /root/newimages/ -name "*.tar" -exec docker load -i {} \;
执行Playbook:
ansible-playbook transfer_images.yml
方案三:Netcat(nc)高速传输(局域网场景)
若控制节点与所有服务器处于同一局域网,且目标节点默认安装nc,可使用无加密的流传输进一步提升速度:
- 本地启动nc服务端,打包并输出tar文件流:
tar -czf - /root/file*.tar | nc -l 1234
- 通过Ansible命令让所有服务器连接控制节点接收并解压:
ansible all -m raw -a 'mkdir -pv /root/newimages/ && nc <控制节点IP> 1234 | cd /root/newimages/ && tar -xzf - --strip-components=1'
- 执行Docker镜像加载命令:
ansible all -m shell -a 'find /root/newimages/ -name "*.tar" -exec docker load -i {} \;'
注:此方法无传输加密,仅适用于可信局域网环境。
内容的提问来源于stack exchange,提问作者Saeed
相关产品推荐
相关产品推荐

