Dentro de Azure DevOps YAML, es posible usar una variable dentro de un get para otra variable.

Mi problema específico es el uso de la tarea Azure Key Vaults. usando esta tarea de la siguiente manera:

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

Tengo una variable en la biblioteca llamada KeyVault_Key y la paso al filtro. La tarea de Key Vault creará una nueva variable utilizando el valor de esta variable.

P.ej. si KeyVault_Key = "mySecretKey", entonces crea una variable a la que puede acceder como $(mySecretKey)

Sin embargo, al intentar acceder a todo esto utilizando los comandos variables, no funciona.

P.ej. $($(KeyVault_Key))

También probé variables como

P.ej. $(${{variables.KeyVault_Key}})

** Actualización **

Este es un ejemplo que utiliza la solución variable como se recomienda.

  - 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'
1
Chris Pateman 6 oct. 2020 a las 19:15

2 respuestas

La mejor respuesta

No, esto no es posible. No puedes anidarlos. Entonces, si desea utilizar inmediatamente el valor de su secreto, puede intentar usar Tarea de Azure Cli

  - 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

Sin embargo, si esto no resuelve su problema, me temo que se verá obligado a rediseñar su idea.

1
Krzysztof Madej 6 oct. 2020 a las 17:24

Las variables anidadas aún no se admiten en la canalización azul. La voz del usuario se ha enviado al equipo de desarrollo de Microsoft. Puede votarlo aquí o envíe uno nuevo.

Como solución alternativa, puede definir una nueva variable y asignar su valor a la variable $(KeyVault_Key). Vea el siguiente ejemplo:

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

Luego, puede hacer referencia a la variable mySecretKey creada por la tarea de Key Vault usando $(SecretKeyFromKeyVault)

1
Levi Lu-MSFT 7 oct. 2020 a las 03:59