我试图从远程主机下载一个巨大的文件,但是我不知道我试图下载的服务器中的文件的名称和格式,我只有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
我应该给予跳过下载以节省时间的想法吗?
1条答案
按热度按时间8oomwypt1#
需要将属性 checksum 和 dest作为文件名为的路径,以避免下载 url(如果 checksum 匹配)。例如
引用自 * 校验和 *:
此外,如果将校验和传递给此参数,并且文件存在于目标位置下,则将计算destination_checksum,如果checksum等于destination_checksum,则将跳过文件下载...
如果dest是一个目录,则文件将始终被下载(无论是否使用强制和校验和选项),但仅当内容发生更改时才被替换。
(Yes.开发人员没有解析URL来获取文件名,因此,如果 dest 是一个目录,没有文件名,模块就无法计算和比较校验和。)
请参阅#73185
问:***“从远程主机下载文件,但不知道文件名。"***
答:解析URL并创建属性 dest 和 checksum。例如,