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

如何通过Terraform将Azure DevOps库中的多个密钥导入Azure Key Vault

实现Azure DevOps变量库密钥批量同步到Azure Key Vault的YAML流水线方案

一、Azure DevOps变量库密钥命名规范

给需要同步到Azure Key Vault的密钥统一添加自定义前缀(比如kv-secret-),示例命名:

  • kv-secret-db-password
  • kv-secret-api-key
  • kv-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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 03:05:59