在Azure DevOps Powershell脚本中动态获取KeyVault秘密

时间:2019-10-29 13:02:25

标签: azure azure-devops azure-powershell

我们的发布管道中有一个Azure Key Vault任务,该任务会下载一些秘密供舞台使用。

在嵌入式Azure PowerShell脚本中,您可以使用以下命令获取机密值:

$secretValue = $(nameOfTheSecretInKeyVault)

这很好。

但是,我们要转向在回购中使用脚本,即将DevOps任务添加到文件路径,即/somePath/myScript.ps1

所以我需要对上面的代码行进行参数化,因为我不能像现在正在做的那样直接更改内联脚本中的名称,但是我无法使它正常工作。

我尝试过:

$compositeName = "${someParameter}-Application"
$secretValue1 = $($compositeName)
$secretValue2 = $("${compositeName}")
$secretValue3 = env:$compositeName
$secretValue4 = $(${compositeName})

最上面一行只是建立它需要查找的秘密的名称。不幸的是,这些都不起作用。尝试#1,#2和#4仅返回字符串名称,而实际上没有获得秘密值,并且#3错误说它不存在。

是否有实现此目标的方法,还是仅需要对机密进行参数化并将其从ADO任务传递到脚本中?

5 个答案:

答案 0 :(得分:2)

要么先运行您的KeyVault任务,然后再运行PowerShell脚本,要么全部在PowerShell中执行。

您需要从Azure DevOps创建到Azure订阅的服务连接。允许服务连接访问KeyVault。从PowerShell或Azure CLI访问KeyVault。

例如对于PowerShell:

(Get-AzKeyVaultSecret -vaultName "Contosokeyvault" -name "ExamplePassword").SecretValueText

Here是详细的演练。

答案 1 :(得分:1)

像您一样,我想不出一种方法来访问在工作的 Download secrets 任务中加载日志提及的变量。它确实以内联模式工作,但没有脚本文件的机会。

因此,我改为利用现有的连线(链接到KeyVault的变量组),然后在脚本的开头自己运行命令:

$mySecretValue = (Get-AzKeyVaultSecret -VaultName "myVault" -Name "mySecret").SecretValueText

从那里,我可以将其用作任何其他变量。

答案 2 :(得分:0)

现在还集成了本地密钥库,因此您可以透明地将密钥作为变量组读取,而无需特定于Keyvault的Powershell代码。

https://docs.microsoft.com/en-us/azure/devops/pipelines/library/variable-groups?view=azure-devops&tabs=yaml#link-secrets-from-an-azure-key-vault

答案 3 :(得分:0)

解决此问题的一种方法是为脚本添加参数,以在调用它时传递release变量,例如vadd.spv

您应该可以使用-secretValue $(nameOfTheSecretInKeyVault),但请记住$env:nameOfTheSecretInKeyVault成为.

编辑:如果您使用_,请再次查看您的问题,您会遇到问题。是env:$nameOfTheSecretInKeyVault

答案 4 :(得分:0)

如果将来有人遇到这种情况,并且正在寻找一种bash替代方法,那么我最终可以使用以下命令来做到这一点

$(az keyvault secret show --name "${secret_name}" --vault-name "${vault_name} --query "value" | sed "s/\"//g")

这使您可以获取保管库秘密的值,并在任何地方使用它。最后需要使用sed来删除从查询中拉出的"