GitLab CI/CD中如何通过.gitlab-ci.yml向Python脚本传递Vault数据库凭证?
GitLab CI/CD中从Vault传递凭证到Python脚本的最佳方式
方案1:利用GitLab CI原生Vault集成注入环境变量
这是最贴合GitLab CI最佳实践的方式,无需额外安装工具,安全且配置简洁。
- 先在GitLab项目中配置Vault连接(路径:项目设置 > CI/CD > 变量 > Vault),关联对应的Vault实例和密钥路径。
- 在
.gitlab-ci.yml中直接引用Vault中的密钥作为环境变量:
stages: - run_script run_db_script: stage: run_script image: python:3.11 variables: DB_USER: ${VAULT_PATH/db/creds/readonly/username} DB_PASSWORD: ${VAULT_PATH/db/creds/readonly/password} script: - pip install psycopg2-binary # 示例依赖,根据你的数据库调整 - python your_db_script.py
- Python脚本中直接读取环境变量:
import os import psycopg2 conn = psycopg2.connect( user=os.getenv("DB_USER"), password=os.getenv("DB_PASSWORD"), host="your-db-host", port="5432", dbname="your-db-name" )
方案2:通过Vault CLI在CI阶段获取凭证
如果无法使用GitLab原生Vault集成,可以在CI环境中安装Vault CLI,手动登录并提取凭证:
- 在
.gitlab-ci.yml的before_script中完成Vault登录和凭证提取:
stages: - run_script run_db_script: stage: run_script image: python:3.11 before_script: - apt-get update && apt-get install -y unzip - wget https://releases.hashicorp.com/vault/1.15.0/vault_1.15.0_linux_amd64.zip - unzip vault_1.15.0_linux_amd64.zip && mv vault /usr/local/bin/ - vault login -method=gitlab role=your-vault-role jwt=$CI_JOB_JWT - export DB_USER=$(vault read -field=username db/creds/readonly) - export DB_PASSWORD=$(vault read -field=password db/creds/readonly) script: - pip install psycopg2-binary - python your_db_script.py
- Python脚本读取环境变量的方式和方案1一致。
方案3:Python脚本直接调用Vault API(不推荐)
让Python脚本直接请求Vault API获取凭证,但需要在CI中传递Vault地址、token等敏感信息,风险较高,仅适用于特殊场景:
import os import requests VAULT_ADDR = os.getenv("VAULT_ADDR") VAULT_TOKEN = os.getenv("VAULT_TOKEN") response = requests.get( f"{VAULT_ADDR}/v1/db/creds/readonly", headers={"X-Vault-Token": VAULT_TOKEN} ) creds = response.json()["data"] # 后续用creds["username"]和creds["password"]连接数据库
注意:无论哪种方案,都要确保CI作业的权限最小化,只授予Vault中必要的密钥读取权限,避免泄露敏感数据。
内容的提问来源于stack exchange,提问作者patap
相关产品推荐
相关产品推荐

