在 DevOps 管道中循环秘密

问题描述 投票:0回答:1

我正在构建一个管道来部署 Web 应用程序并迁移一些租户数据库。

我在我的库中定义了变量,这些变量从 keyvault 中提取秘密。如果我在管道上启用诊断日志记录,我可以看到类似的输出

##[debug]Promise for downloading secret value for: Test1  
Downloading secret value for: Test1.  
##[debug]Promise for downloading secret value for: Test2  
Downloading secret value for: Test2.  
##[debug]Promise for downloading secret value for: DATABASE-URL-FOO-TEST  
Downloading secret value for: DATABASE-URL-FOO-TEST.  
##[debug]Promise for downloading secret value for: DATABASE-URL-FOO-TEST-ALT  
Downloading secret value for: DATABASE-URL-FOO-TEST-ALT. 
...
##[debug]set DATABASE-URL-FOO-TEST-ALT=********
##[debug]Processed: ##vso[task.setvariable variable=DATABASE-URL-FOO-TEST-ALT;isOutput=false;issecret=true;]***   
##[debug]set DATABASE-URL-FOO-TEST-ALT=********  
##[debug]Processed: ##vso[task.setvariable variable=DATABASE-URL-FOO-TEST-ALT;isOutput=false;issecret=true;]***  
##[debug]set Test2=********  
##[debug]Processed: ##vso[task.setvariable variable=Test2;isOutput=false;issecret=true;]***  
##[debug]set Test2=********  

现在我真正想做的是

for in
覆盖所有以
DATABASE-URL-
开头的变量,并将该 URL 传递给我的迁移脚本。我尝试了一些方法,但似乎无法在环境中找到我的变量。这个 bash 任务没有给我
for
循环的输出。

 - task: Bash@3
  inputs:
    targetType: 'inline'
    script: |
      echo "all vars"
      for var in "${!variable@}"; do
          echo "$var=${!var}"
      done

      for key in "${!VAR[@]}"; do
        echo "$key"
        if [[ $key == SECRET_DATABASE-URL* ]]; then
         
         DB_URL=${!VAR[$key]} echo "$DB_URL"
         DB_URL=${!VAR[$key]} ./bin/migrate-databases.sh
        fi
      done

在该任务的诊断输出中,我可以看到类似的行

##[debug]loading SECRET_DATABASE-URL-FOO-TEST-ALT
##[debug]loading SECRET_SYSTEM_ACCESSTOKEN
##[debug]loading SECRET_TEST2
##[debug]loading SECRET_DATABASE-URL-FOO-TEST
##[debug]loading SECRET_TEST1

所以看起来它们已经被设置好了。我怎样才能得到这些变量?

我的管道在

vmImage:ubuntu-latest
上运行,因此使用 Bash,但我愿意接受任何其他方法来实现此目的,只要它与 Ubuntu 代理兼容即可。

bash azure-pipelines azure-keyvault continuous-deployment
1个回答
0
投票

现在我真正想做的是在所有以 DATABASE-URL 开头的变量中,并将该 URL 传递给我的迁移脚本。我尝试了一些方法,但似乎无法在环境中找到我的变量。

与普通变量不同,秘密变量不会自动解密为脚本的环境变量。您无法直接从环境中获取它们(dochere)。

在我这边检查,它能够使用 Azure CLI 获取秘密变量

name
,任务如下:

- bash: |
    # Get all variables from the variable group
    variables=$(az pipelines variable-group variable list --group-id 11 --output json)

    # Get the "DATABASE-URL-" started variables name
    vars=$(echo "$variables" | jq -r 'to_entries[] | select(.key | startswith("DATABASE-URL-")) | .key')
    echo "$vars"

    for var in $vars
    do
      echo "checking: $var"              # output the variable name
      #echo $($var)                       # it doesn't work
      #echo "${!var}"                     # it doesn't work
    done
  displayName: 'Get Secret Variables values'
  env:
    AZURE_DEVOPS_EXT_PAT: $(System.AccessToken)

但是,使用脚本中的变量名,你无法得到

variable value
。 例如,
$($var)
${!var}
不起作用,甚至可以删除变量名称中的
hyphen -
以简化变量名称。

DevOps 中恐怕不支持动态获取预期的秘密变量值。

© www.soinside.com 2019 - 2024. All rights reserved.