Ansible get_url模块如何仅在文件变更时下载避免全量拉取
解决方案
根本原因
Ansible默认的get_url模块不会预先校验远端文件和本地文件的差异,只会先全量下载远端文件到临时目录,下载完成后再对比校验和判断是否需要替换本地文件,因此即便本地文件和远端一致,也会产生全量下载的耗时。
解决方案
通过前置任务先分别获取本地文件大小、远端文件大小,仅在大小不一致时才执行下载操作,无需修改download.yaml的生成逻辑,也不需要手动添加校验和参数。
步骤1:调整主playbook结构
tasks: # 加载下载配置(如果已在playbook其他位置加载可跳过) - name: Load download config include_vars: file: download.yaml # 循环处理每个下载项 - name: Process each download item include_tasks: download_single.yaml loop: "{{ lookup('dict', dl) }}"
步骤2:新增download_single.yaml子任务文件
--- # 拼接本地文件完整路径 - name: Set local full path set_fact: local_file: "{{ item.value.dest }}{{ item.value.file }}" # 获取本地文件状态(存在则返回大小) - name: Get local file stat stat: path: "{{ local_file }}" register: local_stat # 发送HEAD请求获取远端文件大小,无全量下载开销 - name: Get remote file size uri: url: "{{ item.value.url }}" method: HEAD follow_redirects: all register: remote_stat # 仅本地文件不存在/大小和远端不一致时执行下载 - name: Download file when needed get_url: url: "{{ item.value.url }}" dest: "{{ local_file }}" when: not local_stat.stat.exists or (local_stat.stat.size | int != remote_stat.content_length | int)
方案说明
- 所有请求均兼容GitHub Release的文件地址,HEAD请求可正常返回正确的文件大小
- 每次执行仅产生少量HEAD请求开销,无变更时不会触发全量下载
- 无需修改现有download.yaml的生成规则,不需要额外添加校验和字段
内容的提问来源于stack exchange,提问作者marcohald
相关产品推荐
相关产品推荐

