Ansible get_url模块报‘no route to host’错误求助
解决Ansible get_url任务无法通过代理连接Docker仓库的问题
我之前也碰到过几乎一模一样的场景——服务器本地用wget/curl能正常拉取文件,但Ansible的get_url模块就是报路由错误,给你几个亲测有效的排查和解决思路:
1. 显式传递代理环境变量
虽然你在模块里设了use_proxy: yes,但Ansible执行任务时的环境变量往往和你SSH登录后的会话环境不一样。试试在playbook里直接指定代理环境变量,覆盖默认的执行环境:
- name: 添加Docker仓库配置文件 get_url: url: https://download.docker.com/linux/centos/docker-ce.repo dest: /etc/yum.repos.d/docker-ce.repo use_proxy: yes environment: http_proxy: http://192.168.1.240:8080 https_proxy: http://192.168.1.240:8080 no_proxy: localhost,127.0.0.1
重点要同时设置http_proxy和https_proxy,因为目标地址是HTTPS协议,部分代理服务器需要单独配置HTTPS的代理变量才能生效。
2. 检查Ansible全局配置的代理优先级
看看你的ansible.cfg文件里有没有全局代理配置,比如[defaults]段下的http_proxy/https_proxy设置,这些全局配置会覆盖模块级的代理参数。如果有冲突的配置,要么注释掉,要么改成你需要的代理地址:
# 示例:如果有类似配置,检查是否和目标代理一致 [defaults] # http_proxy = http://other-proxy:8080
3. 用命令行单独测试get_url模块
直接用ansible命令行调用get_url模块,排除playbook其他逻辑的干扰,快速定位问题:
ansible your_rhel_host -m get_url -a "url=https://download.docker.com/linux/centos/docker-ce.repo dest=/tmp/test_docker.repo use_proxy=yes http_proxy=http://192.168.1.240:8080 https_proxy=http://192.168.1.240:8080"
如果这个单独任务能成功,说明是playbook里的其他配置影响了执行环境;如果还是失败,就聚焦到模块本身或代理的交互问题上。
4. 查看代理服务器的访问日志
登录到代理服务器(192.168.1.240),检查它的访问日志,看看Ansible发起的请求有没有被拦截或者记录异常。有时候本地wget/curl的请求和Ansible模块的请求在User-Agent、请求头等细节上有差异,导致代理服务器拒绝服务。
5. 尝试用uri模块替代get_url
如果get_url模块始终有兼容性问题,可以换成uri模块来下载文件,它的代理配置逻辑更灵活:
- name: 用uri模块下载Docker仓库配置 uri: url: https://download.docker.com/linux/centos/docker-ce.repo dest: /etc/yum.repos.d/docker-ce.repo method: GET validate_certs: no # 若代理存在证书验证问题可临时关闭,生产环境建议配置合法证书 use_proxy: yes environment: http_proxy: http://192.168.1.240:8080 https_proxy: http://192.168.1.240:8080
内容的提问来源于stack exchange,提问作者user1768233
相关产品推荐
相关产品推荐

