借助Azure DevOps变量组在Azure Key Vault中存储与检索密钥
Azure DevOps Pipeline集成Key Vault变量组安全传递密钥指南
步骤1:创建关联Key Vault的变量组
- 登录Azure DevOps项目,进入库 -> 变量组
- 点击新建变量组,填写组名(比如
TerraformBackendVars) - 勾选链接到Azure Key Vault,选择已配置好的服务连接,再选中你的目标Key Vault
- 从Key Vault中添加所需机密:确保Key Vault内已存储以下值(名称可自定义,需和后续YAML引用一致):
serviceConnectionName:Terraform初始化用的服务连接名称backendResourceGroupName:存储tfstate文件的资源组名称backendStorageAccountName:存储账户名称backendContainerName:存储容器名称backendTfstateKey:tfstate文件的密钥名称
- 保存变量组
步骤2:在Pipeline中引用变量组
在YAML的variables块中添加变量组引用,替换原硬编码变量部分。
步骤3:替换YAML中的硬编码值
将所有需要从Key Vault获取的值替换为$(变量名)格式,同时修正原YAML中重复的tfdeploy stage名称(同名stage会导致Pipeline执行报错)。
修改后的完整YAML
trigger: none ######################### # 构建代理配置 ######################### pool: vmImage: ubuntu-latest ###################### # 参数声明 ###################### parameters: - name: ResourceGroup displayName: 请输入资源组名称 type: string default: <请填写资源组名称> - name: Region displayName: 请输入区域名称 type: string default: <请填写区域名称> - name: sqlserver displayName: 请输入SQL Server名称 type: string default: <请填写SQL Server名称> ###################### # 变量与变量组引用 ###################### variables: - group: TerraformBackendVars # 引用关联Key Vault的变量组 - name: TF_VAR_ResourceGroup value: ${{ parameters.ResourceGroup }} - name: TF_VAR_REGION value: ${{ parameters.Region }} - name: TF_VAR_SQLSERVER_NAME value: ${{ parameters.sqlserver }} ################### # 阶段声明 ################### stages: - stage: tfvalidate jobs: - job: validate continueOnError: false steps: - task: TerraformInstaller@0 inputs: terraformVersion: 'latest' - task: TerraformTaskV3@3 displayName: Terraform Init inputs: provider: 'azurerm' command: 'init' backendServiceArm: $(serviceConnectionName) # 从Key Vault变量组获取 backendAzureRmResourceGroupName: $(backendResourceGroupName) # 从Key Vault变量组获取 backendAzureRmStorageAccountName: $(backendStorageAccountName) # 从Key Vault变量组获取 backendAzureRmContainerName: $(backendContainerName) # 从Key Vault变量组获取 backendAzureRmKey: $(backendTfstateKey) # 从Key Vault变量组获取 - task: TerraformTaskV3@3 displayName: Terraform Validate inputs: provider: 'azurerm' command: 'validate' - stage: tfdeploy_first condition: succeeded('tfvalidate') dependsOn: tfvalidate jobs: - job: apply steps: - task: TerraformInstaller@0 inputs: terraformVersion: 'latest' - task: TerraformTaskV3@3 displayName: Terraform Init inputs: provider: 'azurerm' command: 'init' backendServiceArm: $(serviceConnectionName) backendAzureRmResourceGroupName: $(backendResourceGroupName) backendAzureRmStorageAccountName: $(backendStorageAccountName) backendAzureRmContainerName: $(backendContainerName) backendAzureRmKey: $(backendTfstateKey) - task: TerraformTaskV3@3 displayName: Terraform Validate inputs: provider: 'azurerm' command: 'validate' - task: TerraformTaskV3@3 displayName: Terraform Plan inputs: provider: 'azurerm' command: 'plan' environmentServiceNameAzureRM: $(serviceConnectionName) - task: TerraformTaskV3@3 displayName: Terraform Apply inputs: provider: 'azurerm' command: 'apply' commandOptions: '-auto-approve' environmentServiceNameAzureRM: $(serviceConnectionName) backendAzureRmContainerName: $(backendContainerName) backendAzureRmKey: $(backendTfstateKey) - task: TerraformTaskV3@3 displayName: Terraform Validate Post-Apply inputs: provider: 'azurerm' command: 'validate' - stage: tfdeploy_second condition: succeeded('tfvalidate') dependsOn: tfvalidate jobs: - job: apply steps: - task: TerraformInstaller@0 inputs: terraformVersion: 'latest' - task: TerraformTaskV3@3 displayName: Terraform Init inputs: provider: 'azurerm' command: 'init' backendServiceArm: $(serviceConnectionName) backendAzureRmResourceGroupName: $(backendResourceGroupName) backendAzureRmStorageAccountName: $(backendStorageAccountName) backendAzureRmContainerName: $(backendContainerName) backendAzureRmKey: $(backendTfstateKey) - task: TerraformTaskV3@3 displayName: Terraform Validate inputs: provider: 'azurerm' command: 'validate' - task: TerraformTaskV3@3 displayName: Terraform Plan inputs: provider: 'azurerm' command: 'plan' environmentServiceNameAzureRM: $(serviceConnectionName) - task: TerraformTaskV3@3 displayName: Terraform Apply inputs: provider: 'azurerm' command: 'apply' commandOptions: '-auto-approve' environmentServiceNameAzureRM: $(serviceConnectionName)
注意事项
- 确保Azure Key Vault已授予Azure DevOps服务连接
机密用户角色权限,允许读取机密内容 - 变量组引用的Key Vault机密名称必须和YAML中使用的
$(变量名)完全匹配 - 原YAML中存在两个同名
tfdeploystage,会导致Pipeline执行失败,已修改为tfdeploy_first和tfdeploy_second,可根据实际需求调整名称或合并阶段
内容的提问来源于stack exchange,提问作者DSH
相关产品推荐
相关产品推荐

