如何通过Terraform将Azure DevOps库中的多个密钥导入Azure Key Vault
实现Azure DevOps变量库密钥批量同步到Azure Key Vault的YAML流水线方案
一、Azure DevOps变量库密钥命名规范
给需要同步到Azure Key Vault的密钥统一添加自定义前缀(比如kv-secret-),示例命名:
kv-secret-db-passwordkv-secret-api-keykv-secret-jwt-signing-key
前缀的作用是精准筛选需要同步的密钥,避免误操作流水线中的其他变量。
二、YAML流水线批量处理流程
完整YAML示例
trigger: - main pool: vmImage: 'ubuntu-latest' # 链接目标Azure DevOps变量库,自动注入所有变量到流水线环境 variables: - group: '你的变量库名称' # 单个变量直接映射为Terraform环境变量 - name: TF_VAR_tenant_id value: $(tf-sp-tenant-id) steps: # 1. 批量生成Terraform所需的secrets map - script: | secrets_map="{" # 遍历所有以kv-secret-开头的环境变量 for var_name in "${!kv-secret-@}"; do # 去掉前缀,作为Azure Key Vault中存储的密钥名称 secret_name=${var_name#kv-secret-} # 转义变量值中的双引号,避免JSON格式错误 secret_value=$(echo "${!var_name}" | sed 's/"/\\"/g') # 拼接JSON键值对 secrets_map+="\"$secret_name\":\"$secret_value\"," done # 移除末尾多余逗号并闭合JSON secrets_map=${secrets_map%,} secrets_map+="}" # 设置为Terraform可识别的环境变量 echo "##vso[task.setvariable variable=TF_VAR_secrets]$secrets_map" displayName: 'Build Terraform secrets map' # 2. 初始化Terraform后端 - task: TerraformCLI@0 inputs: command: 'init' workingDirectory: '$(System.DefaultWorkingDirectory)/terraform' backendType: 'azurerm' backendServiceArm: '你的Azure服务连接名称' backendAzureRmResourceGroupName: '你的资源组名称' backendAzureRmStorageAccountName: '你的存储账户名称' backendAzureRmContainerName: 'tfstate' backendAzureRmKey: 'terraform.tfstate' # 3. 执行Terraform计划(可选,用于预览变更) - task: TerraformCLI@0 inputs: command: 'plan' workingDirectory: '$(System.DefaultWorkingDirectory)/terraform' environmentServiceName: '你的Azure服务连接名称' # 4. 执行Terraform应用(生产环境建议添加审批环节) - task: TerraformCLI@0 inputs: command: 'apply' workingDirectory: '$(System.DefaultWorkingDirectory)/terraform' environmentServiceName: '你的Azure服务连接名称' commandOptions: '-auto-approve'
三、Terraform代码适配
你的现有Terraform代码完全满足需求,无需修改:
resource "azurerm_key_vault_secret" "example" { for_each = var.secrets name = each.key value = each.value key_vault_id = azurerm_key_vault.example.id } variable "tenant_id" { description = "The Tenant ID for the Azure Key Vault" } variable "secrets" { type = map(string) description = "A map of secrets to store in the Azure Key Vault" }
核心说明
- 流水线生成的
TF_VAR_secrets是JSON格式字符串,Terraform会自动解析为map(string)类型,直接匹配var.secrets变量 for_each遍历map时,each.key是去掉前缀后的密钥名称,each.value是变量库中的密钥值,自动对应到Azure Key Vault的密钥名和值
注意事项
- 确保流水线服务主体拥有:
- Azure DevOps变量库的读取权限
- Azure Key Vault的密钥创建、更新权限
- 若密钥值包含特殊字符(如反斜杠、换行),需在脚本中添加对应转义逻辑
- 生产环境建议移除
-auto-approve,添加手动审批环节确认变更
内容的提问来源于stack exchange,提问作者Andrew Duffy
相关产品推荐
相关产品推荐

