You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 10:06:04