Azure Devops Pipeline 中的 Python 脚本无法使用库中的值(如果它是机密)

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

我有一个 Azure Devops Pipeline 设置。它通过 yaml 获取一些秘密

variables
 - group: GROUP_WITH_SECRET

然后在管道的后面部分,我运行一个 python 脚本,通过

获取特定的秘密
my_pat = os.environ["my_secret"]

然后在 Microsoft 提供的库中使用它(

msrest
),如下所示:

BasicAuthentication("", my_pat)

如果 ADO 库中的相关变量设置为普通,则脚本可以正常工作。如果我将其更改为秘密,连接将失败。如果我将其设置回纯文本,它会再次起作用。

问题是,我怎样才能使它与秘密一起工作?我尝试过打印该值,但由于它是一个秘密,因此它不会向我显示除该值之外的实际值

The user 'aaaaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa' is not authorized to access this resource

python azure-devops azure-pipelines
3个回答
2
投票

要在 Azure Pipeline 中使用机密变量,您需要在代理作业中显式映射机密变量。

根据我的测试,Python 脚本任务没有环境字段来映射秘密变量。

因此您可以在PowerShell任务中添加环境变量来映射秘密变量。您可以将其设置为后续任务的管道变量。

这是一个例子:

- powershell: |
   echo "##vso[task.setvariable variable=myPass]$env:myPass"
   
  displayName: 'PowerShell Script'
  env:
    myPass: $(myPass)

然后您可以在接下来的任务中使用该变量。

更详细的信息,你可以参考这个文档:秘密变量


1
投票

在几次测试中,我发现了一个奇怪的事情。

如果任务中未指定环境变量,则变量组中的秘密是我的 Python 脚本中的

None

但是,在任务中指定环境变量可以成功检索脚本中的秘密。

例如,我在 Azure DevOps 的变量组中有一个名为

AZURE_CLIENT_SECRET
的秘密变量。

当 Python 脚本尝试访问环境变量时,以下模板会产生

None
值。

  - task: PythonScript@0
    inputs:
      scriptSource: 'filePath'
      scriptPath: '${{ parameters.scriptWorkingDirectory }}/main.py'

但是如果我在任务中指定环境变量

AZURE_CLIENT_SECRET
,它就可以工作。

  - task: PythonScript@0
    inputs:
      scriptSource: 'filePath'
      scriptPath: '${{ parameters.scriptWorkingDirectory }}/main.py'
    env:
      AZURE_CLIENT_SECRET: $(AZURE_CLIENT_SECRET)

纯文本变量不会出现此问题,可以在脚本中使用纯文本变量,而无需在任务中指定它。


0
投票

管道不会自动将秘密变量注入脚本的环境中。

如果您编辑管道,然后单击“变量”,然后单击变量并一直向下查看,您会看到以下内容:

要在脚本中使用秘密变量,您必须将其显式映射为环境变量。

这种“显式映射”可以通过使用任务的

env:
属性来完成。

例如,对于运行 python 脚本的 powershell:

- powershell: |
    python test_blob_storage.py

  env:
    STORAGE_ACCESS_KEY: $(storage-access-key)

其中

storage-access-key
被配置为该管道中的秘密变量。

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