我有一个带有不同 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/