Jenkins凭证中JSON格式文件的$符号转义异常问题
问题描述
我们有个用Credential插件的Jenkins流水线,引用的JSON密钥文件原始内容是:
{ "key" : "value$$" }
流水线会把这个文件复制到目标机器,再触发Ansible Playbook执行,但执行后目标机器上的密钥文件内容变成了:
{ "key" : "value$" }
其中一个$符号丢了。我们试过用"'value$$'"和"value$$$$"的写法,问题还是没解决。相关Jenkins流水线代码片段如下:
environment { def values = "${SITE_AGENT}".split('-') credentialsId = "security-keys-${values[-2]}-${values[-1]}" } stages { stage('Initialise') { steps { // 给构建起个有意义的名字 buildName "${NODE_NAME}-${BUILD_USER_ID}-#${BUILD_NUMBER}" buildDescription "Runing ${Tag_Name} in ${SITE_AGENT}" } } stage('Run deployment.yml') { steps { withCredentials([ usernamePassword(credentialsId: 'git-deploy-token', passwordVariable: 'git_pass', usernameVariable: 'git_user'), file(credentialsId: "${credentialsId}", variable: 'secret_file') ]) { ansiblePlaybook( colorized: true, playbook: '$WORKSPACE/playbook/deployment.yml', extraVars: [ tag_name:"${Tag_Name}", git_url:"${Git_Project}", deploy:"${Deploy_Playbook}", git_user:"${git_user}", git_pass:"${git_pass}", secret_file:[value:readFile(secret_file), hidden:true] ] ) } } } }
解决方案
1. 在Jenkins侧做转义处理
$在Groovy和Ansible里都是特殊字符,会被变量解析器处理。可以在读取密钥文件后,把每个$替换成\$,这样传递给Ansible时,最终会保留原始的$$:
修改extraVars里的secret_file部分:
secret_file:[value:readFile(secret_file).replace('$', '\\$'), hidden:true]
处理后原始的value$$会变成value\$\$,Ansible写入文件时会解析回value$$。
2. 在Ansible Playbook中禁用变量解析
如果不想改Jenkins代码,可以在Ansible的复制任务里,用quote过滤器强制不解析变量,或者用原始格式保留内容:
比如在deployment.yml的复制任务里:
- name: 复制密钥文件到目标机器 copy: content: '{{ secret_file | quote }}' dest: /path/to/target/secret.json mode: '0600'
或者用多行格式保留原始内容:
- name: 复制密钥文件到目标机器 copy: content: | {{ secret_file }} dest: /path/to/target/secret.json mode: '0600'
3. 调整Credential中的原始内容(结合前两种方法)
如果单独改Credential里的$$为$$$$没效果,可以结合上面的转义方法一起用——先在Credential里写$$$$,再通过Jenkins的replace处理成\$\$\$\$,最终Ansible解析后会保留$$。
内容的提问来源于stack exchange,提问作者Oxycash
相关产品推荐
相关产品推荐

