使用Ansible get_url模块下载CDN后文件返回403错误
问题:Ansible下载JFrog Distribution包返回403 Forbidden错误
问题场景
我尝试使用Ansible的get_url模块下载JFrog Distribution包,任务代码如下:
- name: Download File get_url: url: "https://releases.jfrog.io/artifactory/jfrog-distribution/distribution-deb/2.22.2/jfrog-distribution-2.22.2-deb.tar.gz" dest: "/tmp/jfrog-distribution-2.22.2-deb.tar.gz"
执行后返回403禁止访问错误:
fatal: [server]: FAILED! => { "changed": false, "dest": "/tmp/jfrog-distribution-2.22.2-deb.tar.gz", "elapsed": 80, "msg": "Request failed", "response": "HTTP Error 403: Forbidden", "status_code": 403, "url": "https://releases.jfrog.io/artifactory/jfrog-distribution/distribution-deb/2.22.2/jfrog-distribution-2.22.2-deb.tar.gz" }
同一机器上使用curl命令(注:原命令末尾有多余的>符号,实际执行需去掉)下载正常:
curl -L "https://releases.jfrog.io/artifactory/jfrog-distribution/distribution-deb/2.22.2/jfrog-distribution-2.22.2-deb.tar.gz" -o jfrog-distribution-2.22.2-deb.tar.gz
我也曾尝试使用Ansible的uri模块并设置follow_redirects: yes,但仍然返回相同的403错误:
[server]: FAILED! => { "changed": false, "dest": "/tmp/jfrog-distribution-2.22.2-deb.tar.gz", "elapsed": 80, "msg": "Request failed", "response": "HTTP Error 403: Forbidden", "status_code": 403, "url": "https://releases.jfrog.io/artifactory/jfrog-distribution/distribution-deb/2.22.2/jfrog-distribution-2.22.2-deb.tar.gz" }
原本猜测是Ansible的代理被过滤,但测试发现curl 7.71.1-DEV版本下载也失败,想知道问题出在哪里?
可能的原因及解决方向
- User-Agent 拦截:JFrog服务器可能会根据请求的
User-Agent字段拦截非标准工具的请求。curl默认的User-Agent与Ansible模块(基于urllib)的不同,可在Ansible任务中手动设置User-Agent为curl的格式:
对于get_url模块,添加参数:
对于headers: {"User-Agent": "curl/7.71.1-DEV"}uri模块,同样添加headers参数。 - 重定向处理差异:虽然设置了
follow_redirects: yes,但Ansible与curl的重定向逻辑可能存在区别(比如是否保留请求头、处理Cookie)。可使用curl -v查看完整请求流程,再在Ansible中模拟对应的请求头。 - 请求头缺失:curl会自动添加部分必要请求头(如
Accept、Host),而Ansible模块默认可能未添加。对比两者的请求头,补充缺失字段。 - 版本访问限制:JFrog部分旧版本包可能设置了访问限制,可确认该版本是否仍公开可用,或更换新版本测试。
- 环境变量差异:Ansible执行时可能使用了与curl不同的环境变量(如代理设置),可在任务中显式设置
use_proxy: no排除代理问题,或检查执行Ansible时的环境变量是否与curl一致。
内容的提问来源于stack exchange,提问作者Omnixz
相关产品推荐
相关产品推荐

