如何在Azure DevOps中的另一个变量中使用变量

时间:2020-10-06 16:15:13

标签: azure azure-devops azure-keyvault

在Azure DevOps YAML中,可以在get变量中使用另一个变量。

我的特定问题是有关使用Azure Key Vaults任务的。 使用以下任务:

  - task: AzureKeyVault@1
    displayName: 'Get Secrets $(KeyVault_Key) from ${{parameters.KeyVaultName}}'
    inputs:
     azureSubscription: ${{parameters.azureSubscription}}
     KeyVaultName: ${{parameters.KeyVaultName}}
     SecretsFilter: '$(KeyVault_Key)'
     RunAsPreJob: true

我在库中有一个名为KeyVault_Key的变量,并将其传递到过滤器中。 Key Vault任务将使用该变量的值创建一个新变量。

例如如果KeyVault_Key = "mySecretKey"会创建一个变量,您可以以$(mySecretKey)的身份访问

但是,当尝试使用可变命令访问所有这些命令时,它不起作用。

例如$($(KeyVault_Key))

我也尝试过变量

例如$(${{variables.KeyVault_Key}})

**更新**

这是根据建议使用变量解决方案的示例。

  - stage: 'Deploy'
displayName: 'Deploy Application'
variables:
  - name: "sqlConnectionNameKey"
    value: '$(TF_VAR_MYSQL_SERVER_USERNAME_KEY)'
  - name: "sqlConnectionPwdKey"
    value: '$(TF_VAR_MYSQL_SERVER_PASSWORD_KEY)'
jobs:
  - deployment: DeployApiDatabase
    pool:
      name: Default
    environment:
      name: Azure
    strategy:
      runOnce:
        deploy:
          steps:
            - task: AzureKeyVault@1
              displayName: 'Get Secrets'
              inputs:
                azureSubscription: ${{parameters.azureSubscription}}
                KeyVaultName: '$(TF_VAR_RESOURCE_PREFIX)-kv'
                SecretsFilter: '${{variables.sqlConnectionNameKey}}, ${{variables.sqlConnectionPwdKey}}'
                RunAsPreJob: true
            - task: AzureMysqlDeployment@1
              displayName: 'Deploy ApplicationConfigurationDbContext DB'
              inputs:
                azureSubscription: ${{parameters.azureSubscription}}
                ServerName: '$(sqlServerName).mysql.database.azure.com'
                DatabaseName: 'DatabaseName'
                SqlUsername: '$(sqlConnectionNameKey)@$(sqlServerName)' 
                SqlPassword: '$(sqlConnectionPwdKey)' 
                TaskNameSelector: 'SqlTaskFile'
                SqlFile: '${{variables.mySqlLocation}}DbContext.sql'
                IpDetectionMethod: 'AutoDetect'

2 个答案:

答案 0 :(得分:1)

否,这是不可能的。您不能嵌套它们。因此,如果您想立即使用您的秘密值,可以尝试使用Azure Cli task

  - task: AzureCLI@2
    inputs:
      azureSubscription: '${{parameters.azureSubscription}}'
      scriptType: 'pscore'
      scriptLocation: 'inlineScript'
      inlineScript: |
        $secretValue =  az keyvault secret show --vault-name ${{parameters.KeyVaultName}} --name $(KeyVault_Key) --query value  -o tsv
        echo $secretValue

但是,如果这不能解决您的问题,恐怕您被迫重新设计想法。

答案 1 :(得分:1)

azure管道中尚不支持嵌套变量。用户声音已提交给Microsoft开发团队。您可以投票here或提交新的投票。

作为一种解决方法,您可以定义一个新变量并将其值映射到变量$(KeyVault_Key)。参见以下示例:

  variables: 
  - name: SecretKeyFromKeyVault
    value: $(KeyVault_Key)

然后,您可以使用mySecretKey来引用Key Vault任务创建的变量$(SecretKeyFromKeyVault)