azure-devops - 动态访问 Azure DevOps 中的 Key Vault secret 变量

标签 azure-devops azure-keyvault azure-yaml-pipelines

我有一个带有不同 key (例如 Key1、Key2、Key3)的 Azure Key Vault。在某些在一个管道任务中动态读取的设置中,我有值说明要使用哪个键(让 KeyName 变量为“Key2”)。如何读取管道中 Key2 的 secret 值?
我尝试了不同的组合,但没有一个对我有用。
测试管道编号1 - 使用连接到 Key Vault 的组变量(为了方便起见,这里的 KeyName 是静态的,但实际上,它是在管道期间通过 powershell 脚本设置的):

jobs:
- job: JobA
  variables:
  - group: KeyVaultGroup #Key vault have secret values "Key1,Key2,Key3..."
  - name: KeyName
    value: Key2
  - name: MyValue
    value: $[ variables[variables.KeyName] ]
  steps:
  - powershell: |
      Write-Host "Var1 $($env:VARENV1)"
      Write-Host "Var2 $($env:VARENV2)"
    env:
      VarEnv1: $(MyValue)
      VarEnv2: $($(KeyName))
结果是:
Var1 
Var2 $(Key2)
MyValue 不起作用,因为在加载 Key Vault 变量之前会评估该变量。并且当在管道期间设置 KeyName 时,它​​也不会起作用(但这可以通过使用单独的作业和使用输出变量来设置 KeyName 来解决 - 就像在测试示例 2 中一样)。
表达式 $($(KeyName)) 不起作用,因为它不会递归地扩展变量(错误?)。
同样的问题是当 AzureKeyVault 任务用于读取 Key Vault 值时,因为它触发得太晚了。
测试编号2 - 两个独立的工作:
我使用了 2 个作业 - 一个读取 key 保管库和 key 名称(作业 A),第二个读取其余作业(作业 B)。问题是,没有办法如何访问从作业 B 加载到作业 A 上的 key 保管库 secret 值。我只能通过依赖项使用作业 B 中作业 A 的输出变量。JobA...但任务 AzureKeyVault不将值导出为输出变量。为此,我需要使用例如Powershell 任务,但在这种情况下,我需要将 secret 值作为环境变量映射到 powershell 任务中,但这意味着我将失去我需要的动态部分,因为它将被静态映射(我需要能够添加/删除 key 保管库中的值而无需更改管道)。这是不行的,或者我不知道如何在不使用输出变量的情况下访问作业之间的 secret 变量。
问题:
当 Key2 保存为变量值 KeyName 并在管道期间加载时,如何从 key “Key2”中读取安全值?

最佳答案

在这种情况下,最好的方法是使用 Azure CLI task使用 azure keyvault 命令:

  - task: AzureCLI@2
    inputs:
      azureSubscription: 'rg-the-code-manual'
      scriptType: 'pscore'
      scriptLocation: 'inlineScript'
      inlineScript: |
        $secretValue =  az keyvault secret show --vault-name tcm-kv --name $(keyName) --query value
        echo $secretValue
此脚本的内容在运行时进行评估,因此您可以设置 keyName就在这项任务之前,一切都会好起来的。如果你需要 secret 的值作为变量,你可以使用日志命令来创建这样的变量。
摆脱双引号的最简单方法是将输出更改为 tsv .
$secretValue =  az keyvault secret show --vault-name tcm-kv --name $(keyName) --query value -o tsv

关于azure-devops - 动态访问 Azure DevOps 中的 Key Vault secret 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63341573/

相关文章:

azure - 如何在 VSTS _git 中为发布管道指定 Azure PS 脚本的正确路径?

tfs - Team Foundation 服务器中的代码行

android - Azure DevOps Gradle "Java heap space"错误

azure - 如何防止在azure devops yaml中创建新分支的构建

Azure Build Pipeline - 如何授予对存储帐户的访问权限?

azure - 链接的 ARM 模板导致模板无效

Azure Key Vault - 如何备份和恢复?

azure - 我的 Terraform 服务主体在 Key Vault 上收到 403 访问错误,即使我为其添加了访问策略

python - 检索 Azure 服务主体的 object_id

azure-devops - 如何在 Azure Devops 中使用 WIX 创建 .msi 安装程序?