Ansible jenkins_plugin模块报403错误:请求无有效crumb
解决Jenkins 2.176.3 + Ansible 2.8 jenkins_plugin模块403 CSRF错误
这个问题我之前在维护Packer Jenkins镜像时碰到过,核心原因是Jenkins 2.176.x版本强化了CSRF保护机制,而Ansible 2.8的jenkins_plugin模块并没有提供直接传递自定义HTTP头的参数(headers参数是Ansible 2.9及以后版本才新增的)。你之前尝试用http_agent传递crumb是走不通的——因为http_agent只是设置请求的User-Agent头,而Jenkins需要的是单独的crumb专属请求头。
下面给你两个可行的解决方案:
方案一:用uri模块替代jenkins_plugin模块(推荐,无需升级Ansible)
直接通过Jenkins的API手动安装插件,完全控制请求头和参数,避开旧版jenkins_plugin的限制:
- 先确保正确获取完整的crumb信息(包括请求字段名,避免Jenkins版本差异导致的字段名变化):
- name: Get Jenkins Crumb uri: force_basic_auth: yes url_username: **** url_password: **** url: http://localhost:8080/crumbIssuer/api/json return_content: yes register: jenkins_crumb until: jenkins_crumb.content.find('Please wait while Jenkins is getting ready') == -1 retries: 10 delay: 5
- 用uri模块循环安装每个插件,带上正确的crumb头:
- name: Install Jenkins plugins via API uri: force_basic_auth: yes url_username: **** url_password: **** url: "http://localhost:8080/pluginManager/installNecessaryPlugins" method: POST headers: "{{ jenkins_crumb.json.crumbRequestField }}": "{{ jenkins_crumb.json.crumb }}" Content-Type: "application/json" body: "{{ {'plugins': [{'shortName': item, 'version': 'latest'}]} | to_json }}" status_code: 200, 302 with_items: "{{ jenkins_plugins }}" retries: 5 delay: 10
- 等待插件安装完成(Jenkins会后台异步处理安装,必须等待避免后续步骤出错):
- name: Wait for all Jenkins plugins to be installed uri: force_basic_auth: yes url_username: **** url_password: **** url: "http://localhost:8080/api/json?tree=plugins[shortName,version]" return_content: yes register: jenkins_plugin_status until: > jenkins_plugin_status.json.plugins | selectattr('shortName', 'in', jenkins_plugins) | list | length == jenkins_plugins | length retries: 20 delay: 10
方案二:升级Ansible到支持headers参数的版本
如果你的Packer环境允许调整Ansible版本,升级到Ansible 2.9或更高即可——新版的jenkins_plugin模块已经支持headers参数,可以直接传递crumb:
- name: Install plugin jenkins_plugin: name: "{{ item }}" version: latest force_basic_auth: yes url_username: **** url_password: **** headers: "{{ jenkins_crumb.json.crumbRequestField }}": "{{ jenkins_crumb.json.crumb }}" with_items: "{{ jenkins_plugins }}"
这个方案更简洁,但需要确认Packer的Ansible环境能顺利升级。
额外注意点
- 不要硬编码
Jenkins-Crumb作为头名,用crumbRequestField的值更稳妥——部分Jenkins版本可能会使用X-Jenkins-Crumb这类不同的字段名。 - 确保Jenkins管理员账号的权限足够安装插件,虽然你的错误提示明确是crumb问题,但权限不足也可能触发403,建议一并确认。
内容的提问来源于stack exchange,提问作者Hartnell Foster
相关产品推荐
相关产品推荐

