如何以最小带宽将同一文件传输至多台Azure服务器?
减少Ansible向多台Azure服务器重复上传文件的方案
当然可以!你这个需求太常见了——50台机器重复上传同一个文件,不仅耗本地带宽,还慢得让人着急。下面给你几个靠谱的方案,帮你把上传次数从50次降到1次:
方案1:用Azure内部中转VM分发(推荐内网高速传输)
选一台和目标服务器同区域的Azure VM作为中转节点(内网传输免费且速度拉满),先把文件从本地传到这台中转VM(仅1次),再从中转VM同步到所有目标机器:
步骤1:上传文件到中转VM
- name: 将文件上传至Azure中转VM copy: src: /home/myuser/project/build/fatboot.jar dest: /tmp/fatboot.jar owner: foo group: foo mode: 0644 delegate_to: azure-relay-vm # 替换成你的中转VM主机名/IP
步骤2:从中转VM同步到所有目标服务器
用synchronize模块(基于rsync,内网传输高效),把中转VM上的文件同步到所有目标机器:
- name: 从中转VM同步文件到目标服务器 synchronize: src: /tmp/fatboot.jar dest: /opt/project/fatboot.jar owner: yes group: yes mode: 0644 delegate_to: azure-relay-vm
注意:中转VM和所有目标服务器需要提前安装
rsync(大多数Linux发行版默认自带),同时确保Ansible能访问中转VM,且中转VM和目标机器之间的内网端口(rsync默认873)是开放的。
方案2:用Azure Blob Storage作为中转(无需额外维护VM)
如果不想维护中转VM,可以把文件上传到Azure Blob Storage(本地仅传1次),再让目标机器从Blob Storage下载:
步骤1:上传文件到Blob Storage
先确保你的Ansible控制节点安装了azure.azcollection集合,然后用模块上传:
- name: 上传文件到Azure Blob Storage azure_rm_storageblob: resource_group: your-resource-group # 替换成你的资源组 storage_account_name: your-storage-account # 替换成你的存储账户名 container: your-container # 替换成你的容器名 blob: fatboot.jar src: /home/myuser/project/build/fatboot.jar content_type: application/java-archive state: present
步骤2:目标机器从Blob Storage下载
生成一个SAS令牌(确保权限和有效期合适),然后用get_url模块下载:
- name: 从Blob Storage下载文件到目标服务器 get_url: url: "https://your-storage-account.blob.core.windows.net/your-container/fatboot.jar?{{ sas_token }}" dest: /opt/project/fatboot.jar owner: foo group: foo mode: 0644
小技巧:可以给存储账户配置VNet访问规则,只允许目标服务器所在的Azure VNet访问,提升安全性。
额外小优化:Ansible配置微调
如果暂时不想用中转方案,还可以调整Ansible的forks参数(默认5),比如改成10或20,让Ansible同时向更多机器上传,虽然还是传50次,但总时间会缩短。修改ansible.cfg里的forks = 20即可。
内容的提问来源于stack exchange,提问作者opticyclic
相关产品推荐
相关产品推荐

