通过GitLab CI更新Vault中的Spring Boot配置密钥
用GitLab CI自动更新Vault中存储的Spring Boot配置(JSON格式)
前置准备
- 给GitLab Runner分配Vault权限:创建一个Vault policy,允许更新指定的KV存储路径,示例policy:
path "secret/data/spring-boot/configs/*" { capabilities = ["create", "update", "read"] }
- 在GitLab项目的CI/CD变量中配置:
VAULT_ADDR:Vault服务器地址VAULT_TOKEN:拥有上述policy权限的令牌(推荐用AppRole认证替代静态令牌,更安全)
GitLab CI Job实现
直接用Vault官方镜像+开源工具完成yaml转json和Vault更新,比Python脚本更轻量化且适配场景:
stages: - update-vault-config update-vault-spring-config: stage: update-vault-config image: hashicorp/vault:latest before_script: # 安装yaml转json工具yq和json处理工具jq - apk add --no-cache yq jq # 登录Vault(如果用AppRole,替换下面的登录命令) - vault login $VAULT_TOKEN script: # 1. 将本地application.yaml转成标准JSON格式 - yq -o json application.yaml > config.json # 2. 将JSON内容转为单行格式,适配Vault KV存储的data字段要求 - CONFIG_CONTENT=$(jq -c '.' config.json) # 3. 推送更新到Vault的指定路径(这里示例是生产环境配置路径) - vault kv put secret/spring-boot/configs/prod data="$CONFIG_CONTENT" only: - main # 仅在主分支代码变更时触发更新
AppRole认证替代静态令牌(更安全)
如果不想用静态VAULT_TOKEN,改用AppRole认证的话,修改before_script部分:
- apk add --no-cache yq jq # 通过AppRole获取临时令牌 - vault write auth/approle/login role_id=$VAULT_ROLE_ID secret_id=$VAULT_SECRET_ID -format=json | jq -r '.auth.client_token' > vault-token - export VAULT_TOKEN=$(cat vault-token)
同时在GitLab变量中添加VAULT_ROLE_ID和VAULT_SECRET_ID,并设置为保护+掩码变量。
关键注意事项
- 确认GitLab Runner所在网络能访问Vault服务器,端口开放
- 如果用Vault KV v1版本,把
vault kv put改成vault write - 若只需更新部分配置字段,用
vault kv patch命令,配合jq提取特定字段,比如:- DB_CONFIG=$(jq -c '.spring.datasource' config.json) - vault kv patch secret/spring-boot/configs/prod data="$DB_CONFIG" - 所有Vault相关变量必须设为掩码变量,避免在CI日志中泄露敏感信息
内容的提问来源于stack exchange,提问作者DecusTheSupa
相关产品推荐
相关产品推荐

