curl 可能从远程主机下载文件而不知道名称

h22fl7wq  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(235)

我试图从远程主机下载一个巨大的文件,但是我不知道我试图下载的服务器中的文件的名称和格式,我只有URL。
1.我需要保留下载的文件名。
1.防止重复下载以保存时间。
1.在下载或跳过文件时,获取本地文件名。

第一个行动手册:问题是,下面的代码可以正常工作,并将映像下载到/tmp/images目录。但是,它每次都下载映像。(需要大约2分钟)。如何防止重复下载?

---
- hosts: localhost
  tasks:
  - name: "Download the Image"
    ansible.builtin.get_url:
      url: "https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img"
      dest: "/tmp/images/"
      mode: '0755'
    register: image_download_stats

   - name: "Print the downloaded image name"
     debug:
       msg: "{{ image_download_stats.dest|basename }}"

**第二个行动手册:**我想出的解决方法代码是:

---
- hosts: localhost
  tasks:
  - name: "Download the image"
    shell: wget --show-progress=off   --content-disposition -N https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img --force-directories -P /tmp/images/
    register: image_download

  - name: "Print the name of the image"
    debug:
      msg: "{% if image_download.stdout_lines |length > 0  %}{{ image_download.stdout_lines |regex_search('(?<=‘)(.*?)(?=’)')}}{%else%}{{image_download.stderr_lines |regex_search('(?<=‘)(.*?)(?=’)')}}{%endif%}"

如果您将这两种行动手册运行两次,您会注意到第二种行动手册节省了时间,因为它不下载映像,但仍然返回文件名。**对第二种行动手册有什么建议吗?第二种行动手册在很大程度上依赖于繁重的wget任务,不是ansible的原生方式。ansible用户/Maven认为可以使用它吗?**第二个对我来说工作得很好,但是你们认为这种方法会失败吗?或者有没有一种方法可以让url模块变得更智能?

**注意:**我知道从URL中提取文件名的basename技术。但是,有时我的URL不是标准格式,无法结束文件名。无法信任获取由/字符分隔的URL的最后部分。
**编辑:**我尝试了第二个剧本与archlinux下载,它没有工作。这意味着,它是导致重复下载。所以,没有时间节省。任何建议都是受欢迎的。例如:

wget --show-progress=off   --content-disposition -N 'https://gitlab.archlinux.org/archlinux/arch-boxes/-/jobs/69793/artifacts/raw/output/Arch-Linux-x86_64-basic-20220721.69793.qcow2?inline=false' --force-directories -P /tmp/images

我应该给予跳过下载以节省时间的想法吗?

8oomwypt

8oomwypt1#

需要将属性 checksumdest作为文件名为的路径,以避免下载 url(如果 checksum 匹配)。例如

- name: "Download the Image"
    ansible.builtin.get_url:
      url: "https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img"
      dest: "/tmp/images/jammy-server-cloudimg-amd64.img"
      mode: '0755'
      checksum: "{{ lookup('file', '/tmp/images/jammy-server-cloudimg-amd64.md5') }}"
    register: image_download_stats

引用自 * 校验和 *:
此外,如果将校验和传递给此参数,并且文件存在于目标位置下,则将计算destination_checksum,如果checksum等于destination_checksum,则将跳过文件下载...

  • 目的地 * 的报价:

如果dest是一个目录,则文件将始终被下载(无论是否使用强制和校验和选项),但仅当内容发生更改时才被替换。
(Yes.开发人员没有解析URL来获取文件名,因此,如果 dest 是一个目录,没有文件名,模块就无法计算和比较校验和。)
请参阅#73185
问:***“从远程主机下载文件,但不知道文件名。"***
答:解析URL并创建属性 destchecksum。例如,

- name: "Download the Image"
      ansible.builtin.get_url:
        url: "{{ my_url }}"
        dest: "{{ my_dest }}/{{ my_file }}"
        mode: '0755'
        checksum: "{{ lookup('file', my_checksum) }}"
      register: image_download_stats
      vars:
        my_dest: /tmp/images
        my_url: "https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img"
        my_file: "{{ my_url.split('/')|last }}"
        my_file_name: "{{ my_file|splitext|first }}"
        my_checksum: "{{ my_dest }}/{{ my_file_name }}.md5"

相关问题