Ansible get_url模块报URL不能包含控制字符错误如何解决
报错原因
该报错由参数使用逻辑错误导致:
- 你混淆了命令行下载工具和Ansible
get_url模块的参数规则:--no-check-certificate是wget等命令行工具的跳过证书校验参数,不能直接拼接到URL字符串中传入。get_url不是wget/curl的命令封装,其url字段仅接受符合规范的纯URL内容,任何额外拼接的空格、参数字符串都会被识别为URL中的非法控制字符,触发报错。 - 你最初的示例写法
url: "{{ jenkins_url_repo }}" --no-check-certificate本身不符合YAML语法规则,额外参数直接写在了键值对结构外部,本身就会触发解析异常。
无论你是否给URL值加引号、怎么调整变量拼接方式,只要把非URL内容写入url字段,就无法解决这个报错。
修复方案
get_url模块提供了独立的参数实现跳过HTTPS证书校验的能力,不需要把参数拼入URL,正确配置示例如下:
- name: Pull Jenkins yum repo configuration ansible.builtin.get_url: url: "{{ jenkins_url_repo }}" # 该字段仅传入纯URL地址,不要附加任何其他内容 dest: /etc/yum.repos.d/jenkins.repo # get_url必填参数,指定文件下载后的存放路径 validate_certs: no # 该参数等价于命令行的--no-check-certificate,作用是跳过HTTPS证书校验
额外注意事项:
- 命令行下载工具的其他常用参数,
get_url都有对应的独立配置项,禁止往url字段中拼接:- 下载鉴权用
url_username、url_password参数 - 超时控制用
timeout参数 - 自定义请求头用
headers参数
- 下载鉴权用
- 生产环境不建议长期开启
validate_certs: no,该配置会绕过HTTPS证书校验,存在中间人攻击风险,最优方案是将服务端使用的自签CA证书同步到目标主机的系统信任存储中,保持证书校验开启。
内容的提问来源于stack exchange,提问作者chowfan
相关产品推荐
相关产品推荐

