如何通过YAML动态从Azure KeyVault获取带指定前缀的多个密钥
可行,具体实现方案如下
核心思路
用Azure CLI的az keyvault secret list命令筛选指定前缀的密钥,再把结果转成字典格式,注入到部署阶段的环境变量里,就能动态传递给代码了,完全不用管每个阶段的密钥数量差异。
分步实现
1. 在部署YAML中添加密钥查询步骤
每个部署阶段单独做密钥查询(毕竟每个阶段的KeyVault是独立的),示例YAML代码:
stages: - stage: Dev_Deployment variables: keyvaultName: "dev-keyvault" secretPrefix: "app-config-" jobs: - job: Fetch_Secrets steps: - script: | # 查询指定前缀的密钥,返回包含名称和值的JSON数组 secrets=$(az keyvault secret list --vault-name $(keyvaultName) --query "[?starts_with(name, '$(secretPrefix)')].{key:name, value:value}" -o json) # 用jq把JSON数组转成键值对字典,写入环境变量 echo "APP_SECRETS=$(echo $secrets | jq -c 'from_entries')" >> $GITHUB_ENV displayName: "拉取Dev环境密钥" # 提前安装jq工具处理JSON pre: | sudo apt-get update && sudo apt-get install -y jq
2. 代码中读取密钥
在后续执行代码的步骤里,直接读取环境变量APP_SECRETS,解析成字典就能用。比如Python代码示例:
import os import json # 从环境变量读取并解析密钥字典 app_secrets = json.loads(os.getenv("APP_SECRETS", "{}")) # 示例:访问指定前缀的密钥 print(app_secrets.get("app-config-db-password"))
3. 多阶段适配
其他阶段只要复制上述步骤,修改keyvaultName和secretPrefix这两个变量就行,不管每个阶段有多少个密钥,都会自动全部拉取。
注意事项
- 执行Azure CLI的服务主体必须有目标KeyVault的
Secrets List和Secrets Get权限 - 如果用Azure Pipelines,也可以结合
AzureKeyVault@2任务,但CLI方式更灵活支持前缀筛选 jq是处理JSON的必要工具,要是部署环境没预装,得提前安装
内容的提问来源于stack exchange,提问作者heycaptain
相关产品推荐
相关产品推荐

