Jenkins升级至2.387.3后调用Ansible Playbook传参失败
Jenkins升级至2.387.3后Ansible Playbook传递加密extraVars报错
问题场景
升级Jenkins到2.387.3版本后,使用声明式流水线调用Ansible Playbook,传递包含加密字段的extraVars参数时触发类型转换错误。
流水线代码片段
ansiblePlaybook([ become: false, colorized: true, installation: 'ansible', extraVars: [ login: 'mylogin', secret_key: [value: 'g4dfKWENpeF6pY05', hidden: true] ], playbook: 'src/main/ansible/prova_parametri.yml' ])
报错信息(翻译后)
java.lang.ClassCastException: java.lang.String类无法转换为hudson.util.Secret类 (java.lang.String位于引导类加载器的java.base模块中;hudson.util.Secret位于org.eclipse.jetty.webapp.WebAppClassLoader @76908cc0的未命名模块中) at org.jenkinsci.plugins.ansible.workflow.AnsiblePlaybookStep$AnsiblePlaybookExecution.convertExtraVars(AnsiblePlaybookStep.java:390) at org.jenkinsci.plugins.ansible.workflow.AnsiblePlaybookStep$AnsiblePlaybookExecution.run(AnsiblePlaybookStep.java:422) at org.jenkinsci.plugins.ansible.workflow.AnsiblePlaybookStep$AnsiblePlaybookExecution.run(AnsiblePlaybookStep.java:352) at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution$1$1.call(AbstractSynchronousNonBlockingStepExecution.java:47) at hudson.security.ACL.impersonate2(ACL.java:451) at hudson.security.ACL.impersonate(ACL.java:463) at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution$1.run(AbstractSynchronousNonBlockingStepExecution.java:44) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:829)
原因分析
Jenkins 2.387.x LTS版本对hudson.util.Secret类型的处理逻辑进行了调整,旧流水线写法直接传入字符串作为加密字段的value,无法被Ansible插件正确转换为Secret类型,从而触发类型转换异常。
解决方案
方案1:将字符串转换为Secret类型
在流水线中使用Secret.fromString()方法将明文字符串转换为Secret类型后传入:
ansiblePlaybook([ become: false, colorized: true, installation: 'ansible', extraVars: [ login: 'mylogin', secret_key: [value: Secret.fromString('g4dfKWENpeF6pY05'), hidden: true] ], playbook: 'src/main/ansible/prova_parametri.yml' ])
注意:生产环境不建议硬编码明文密钥,推荐从Jenkins凭据管理中获取已存储的Secret对象直接传入。
方案2:升级Ansible插件
检查并升级Jenkins的Ansible插件到最新适配版本,部分新版本插件已针对Jenkins 2.387.x的Secret类型变更做了兼容处理。
内容的提问来源于stack exchange,提问作者CARCARLO
相关产品推荐
相关产品推荐

