【问题标题】:Dynamicallly get KeyVault secret in Azure DevOps Powershell script在 Azure DevOps Powershell 脚本中动态获取 Key Vault 机密
【发布时间】:2020-02-24 17:26:38
【问题描述】:

我们的发布管道中有一个 Azure Key Vault 任务,它会下载一些机密以在阶段中使用。

在内联 Azure PowerShell 脚本中,您可以使用以下命令获取密钥值:

$secretValue = $(nameOfTheSecretInKeyVault)

这很好用。

但是,我们希望在 repo 中使用脚本,即将 DevOps 任务指向文件路径,即 /somePath/myScript.ps1

所以我需要参数化上面的代码行,因为我不能像我目前正在做的那样只更改内联脚本中的名称,但我无法让它工作。

我试过了:

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

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

有没有办法实现这一点,还是我只需将秘密参数化并将其从 ADO 任务传递到脚本中?

【问题讨论】:

    标签: azure azure-devops azure-powershell


    【解决方案1】:

    和你一样,我想不出一种方法来访问日志提到的变量,这些变量加载到作业的 Download secrets 任务中。它确实可以在内联模式下工作,但不能使用脚本文件。

    因此,我利用现有的接线(链接到我的 KeyVault 的变量组)并在我的脚本开始时自己运行命令:

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

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

    【讨论】:

    【解决方案2】:

    要么在 PowerShell 脚本之前先运行 KeyVault 任务,要么在 PowerShell 中全部执行。

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

    例如对于 PowerShell:

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

    Here 是详细的演练。

    【讨论】:

    • 是的,我首先运行 KeyVault 任务,因此在使用特定名称时它可以正常工作,即 $secretValue = $(nameOfTheSecretInKeyVault) 语法。我只需要能够传入 keyvault 机密的名称以用作参数。我可以求助于 Get-AzKeyVaultSecret,但感觉应该有一种方法可以使用 KeyVault 任务并参数化您要使用的密钥的名称。
    【解决方案3】:

    现在还集成了本机密钥保管库,因此您可以将密钥作为变量组透明地读入,无需特定于 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

    【讨论】:

    • 我仍然必须在 PowerShell 中引用变量组名称才能从变量组中调用它,所以当您不知道您使用哪个变量时,我会遇到同样的问题编写脚本时会需要。
    • @MDBarbier 不确定“你不知道你想要哪个变量”是什么意思。您不能将它们命名为与 Keyvault 中所需的秘密相同吗?集成将使它们具有相同的名称。您是说要参数化秘密名称吗?我想你可以使用 YAML 中的表达式将代码解释到系统中
    • 是的,希望参数化秘密名称,以便脚本可以通用并用于多个管道(其中秘密名称会有所不同)。我想我会尝试将该值作为参数传递给脚本,而不是在脚本中对其进行评估。谢谢。
    【解决方案4】:

    解决此问题的一种方法是为您的脚本添加一个参数,以便在您调用它时传递发布变量,例如-secretValue $(nameOfTheSecretInKeyVault)

    你应该可以使用$env:nameOfTheSecretInKeyVault,但记住.变成_

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

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2019-08-17
        • 1970-01-01
        • 2018-07-26
        • 1970-01-01
        • 1970-01-01
        • 2018-07-13
        • 1970-01-01
        • 2020-05-07
        • 2016-07-02
        相关资源
        最近更新 更多