如何解决Jenkins向Ansible Tower传递extraVars仅返回变量名的问题
问题根因
该问题由Groovy字符串插值规则导致:你当前使用'''(三单引号)包裹extraVars的YAML内容,Groovy中三单引号属于纯文本字符串,不会解析内部的${变量名}插值表达式,因此传到Ansible Tower的是字面量${zipFilename},而非变量的实际值。
排查步骤
- 第一步:在Jenkins Pipeline调用
ansibleTower步骤前新增日志打印,校验参数生成结果:添加代码println "生成的extraVars内容:${extraVars}",查看Jenkins构建控制台输出,确认变量是否已经完成替换 - 第二步:在Ansible Tower对应作业模板的配置页,开启「在作业输出中显示额外变量」选项,确认Tower实际接收到的
extraVars参数值 - 第三步:排除变量覆盖冲突:检查Ansible Tower侧的作业模板、关联 inventory、执行角色中是否存在重名的
test_note变量,优先级更高的变量会覆盖传入的参数值
解决方法
将extraVars包裹用的三单引号'''替换为三双引号""",Groovy的三双引号支持多行字符串的变量插值,修改后的代码如下:
node ('windows'){ def zipFilename = "Windows file Zip (This value dynamically changed )" stage('Deployment') { wrap([$class: 'AnsiColorBuildWrapper', colorMapName: "xterm"]) { ansibleTower( towerServer: 'Ansible_Tower', jobTemplate: 'ANS- Test 1', templateType: 'job', importTowerLogs: true, jobType: 'run', removeColor: false, verbose: false, credential: 'cred', inventory: 'Ansible_Test', throwExceptionWhenFail: false, // 三双引号支持多行字符串插值 extraVars: """--- test_note: "${zipFilename}" """ ) } }}
如果变量值包含引号、换行等特殊字符,更推荐使用Map动态生成extraVars,自动处理转义避免YAML格式错误:
node ('windows'){ def zipFilename = "Windows file Zip (This value dynamically changed )" stage('Deployment') { // 用Map定义变量,自动处理转义 def extraVarsContent = [ test_note: zipFilename ] wrap([$class: 'AnsiColorBuildWrapper', colorMapName: "xterm"]) { ansibleTower( towerServer: 'Ansible_Tower', jobTemplate: 'ANS- Test 1', templateType: 'job', importTowerLogs: true, jobType: 'run', removeColor: false, verbose: false, credential: 'cred', inventory: 'Ansible_Test', throwExceptionWhenFail: false, // 转为JSON格式传入,Tower兼容JSON格式的extraVars extraVars: new groovy.json.JsonBuilder(extraVarsContent).toPrettyString() ) } }}
内容的提问来源于stack exchange,提问作者sudharshanan
相关产品推荐
相关产品推荐

