我有一个如下的任务:
- name: Download {{ mysql_connector_download_url }}
ansible.builtin.get_url:
url: '{{ mysql_connector_download_url }}'
dest: '{{ mysql_connector_download_dir }}/{{ mysql_connector_download_file }}'
register: jdbc_driver
其中mysql_connector_download_url
扩展为https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-j-8.0.31.tar.gz
这已经工作了很长一段时间,但由于某种原因它不再起作用,我得到的错误是这样的:
"msg": "Request failed",
"response": "HTTP Error 403: Forbidden",
"status_code": 403,
"url": "https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-j-8.0.31.tar.gz"
奇怪的是,我可以wget
在目标机器上输入相同的 URL,并且工作正常,只有通过 ansible 下载才会失败。
我在想也许与 cookie 有关,但如果是这样的话,它不应该wget
也失败吗?
答案1
由于该文件可用但隐藏在重定向后面,因此最简单的方法是查看输出以wget
获取文件的真实位置并从那里下载。
在这种情况下,重定向https://dev.mysql.com/get/Downloads…
到https://cdn.mysql.com/Downloads…
并将最后一个 URL 传递给 Ansible 是成功的。
这当然将来可能会改变,但这个解决方案为我解决了这个问题。
答案2
这是由请求头 User-Agent 导致的,如果使用请求头 "User-Agent":"ansible-httpget" 会返回 403,但如果将请求头设置为 "User-Agent":"curl/7.29.0" 则可以。
要获取 302 重定向 uri,你可以查看这个 Github 评论:https://github.com/ansible/ansible/issues/27293#issuecomment-518389800。