You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 21:50:14