Azure devops 动态访问Azure DevOps中的关键Vault秘密变量

Azure devops 动态访问Azure DevOps中的关键Vault秘密变量,azure-devops,azure-keyvault,azure-yaml-pipelines,Azure Devops,Azure Keyvault,Azure Yaml Pipelines,我有一个Azure密钥库,其中包含不同的密钥(例如,Key1、Key2、Key3)。在一个管道任务中动态读取的某些设置中,我有一个值,该值表示要使用哪个键(让KeyName变量为“Key2”)。如何读取管道中Key2的秘密值 我尝试过不同的组合,但没有一种适合我 测试管道1号-使用连接到密钥保险库的组变量(为方便起见,此处的密钥名是静态的,但实际上,它是在管道过程中通过powershell脚本设置的): jobs: - job: JobA variables: - group: KeyV

我有一个Azure密钥库,其中包含不同的密钥(例如,Key1、Key2、Key3)。在一个管道任务中动态读取的某些设置中,我有一个值,该值表示要使用哪个键(让KeyName变量为“Key2”)。如何读取管道中Key2的秘密值

我尝试过不同的组合,但没有一种适合我

测试管道1号-使用连接到密钥保险库的组变量(为方便起见,此处的密钥名是静态的,但实际上,它是在管道过程中通过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不起作用,因为变量是在加载关键vault变量之前计算的。当在管道中设置KeyName时,它也将不起作用,因为这也是(但这可以通过使用单独的作业和使用输出变量来设置KeyName来解决的,就像第2个测试示例中那样)。 表达式$($(KeyName))不起作用,因为它不会递归地展开变量(bug?)

当AzureKeyVault任务用于读取关键Vault值时,也会出现同样的问题,因为它触发得太晚

第2项测试-两个独立的工作: 我用了两个作业——一个是读取密钥库和密钥名称(作业A),另一个是读取其余的密钥库和密钥名称(作业B)。问题是,无法从作业B访问加载到作业A上的密钥库秘密值。我只能通过依赖项使用作业B中作业A的输出变量。作业A。。。但是任务AzureKeyVault没有将值导出为输出变量。为此,我需要使用例如Powershell任务,但在这种情况下,我需要将秘密值作为环境变量映射到Powershell任务中,但这意味着我将丢失所需的动态部分,因为它将静态映射(我需要能够在密钥库中添加/删除值,而无需更改管道)。这是不可能的,或者我不知道如何在不使用输出变量的情况下访问作业之间的秘密变量

问题:
当密钥2保存为变量值KeyName并在管道中加载时,如何从密钥“Key2”读取安全值?

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

-任务:AzureCLI@2
投入:
azureSubscription:“代码手册”
脚本类型:“pscore”
scriptLocation:“inlineScript”
inlineScript:|
$secretValue=az keyvault秘密显示--vault名称tcm kv--名称$(keyName)--查询值
echo$secretValue
此脚本的内容在运行时进行评估,因此您可以在执行此任务之前设置
keyName
,一切正常。若您需要secret的值作为变量,您可以使用logging命令来创建这样的变量

摆脱双引号的最简单方法是将输出更改为
tsv

$secretValue=az keyvault机密显示--vault名称tcm kv--名称$(keyName)--查询值-o tsv

只想添加一点,即az命令将返回包含在双引号字符中的值,它的意思类似于“myvalue”。这给了我一些时间去意识到问题在哪里…:-)只是为了让人们读这篇文章来节省时间…@Kine谢谢你指出这一点。我用我们如何摆脱
的例子编辑了我的答案。