使用动态的azureSubscription的AzureCLI@2 DevOps流水线。

4
我有一个 DevOps 流水线,给出了这个错误:

资源授权问题: “流水线无效。Job ExecutionTerraform: 步骤 AzureCLI 输入 connectedServiceNameARM 引用了服务连接 Azure: $(subscriptionName),但该服务连接不存在或未被授权使用。有关授权详细信息,请参阅 https://aka.ms/yamlauthz。

我正在使用的配置可以动态查找“订阅名称”。
我用于此的步骤是:
- bash: |
    # pull the subscription data
    # ... read data into local variables

    # set the shared variables
    echo "##vso[task.setvariable variable=subscriptionId]${SUBSCRIPTION_ID}"
    echo "##vso[task.setvariable variable=subscriptionName]${SUBSCRIPTION_NAME}"

我尝试通过模板调用Azure CLI:

- template: execution-cli.yml
  parameters:
    azureSubscriptionId: $(subscriptionId)
    azureSubscriptionName: $(subscriptionName)

我的CLI步骤使用的模板内部:

steps:
  - task: AzureCLI@2
    displayName: Test CLI
    inputs:
      azureSubscription: "ARMTest ${{ parameters.azureSubscriptionName }}"
      scriptType: bash
      scriptLocation: inlineScript
      inlineScript: |
        az --version
      addSpnToEnvironment: true
      useGlobalConfig: true

看起来Pipelines试图在没有注意到其中有一个变量的情况下预先检查授权。 我在其他管道中也这样做,没有任何问题,我不确定在这种特殊情况下有什么不同。

更新1:我在其他地方使用的工作模板

完整模板:

parameters:
  - name: environment
    type: string

jobs:
  - job: AKSCredentials
    displayName: "AKS Credentials Pull"
    steps:
      - task: AzureCLI@2
        displayName: AKS Credentials
        inputs:
          azureSubscription: "Azure: testbed-${{ parameters.environment }}"
          scriptType: bash
          scriptLocation: inlineScript
          inlineScript: az aks get-credentials -g testbed-${{ parameters.environment }} -n testbed-${{ parameters.environment }}-aks
          addSpnToEnvironment: true
          useGlobalConfig: true

抱歉问个蠢问题:你确定你在其他地方有这个工作吗? - Krzysztof Madej
我确定。我的更新任务执行所有内容都没有任何问题。 - el n00b
我之所以问这个问题,是因为它明显是GitHub上描述的问题。您在运行时设置了订阅,这需要在编译时知道。因此,在发生这种情况时,还没有正确的订阅。但是,如果您在YAML中定义了纯变量,那么它将起作用。 - Krzysztof Madej
@KrzysztofMadej 这就是让我困惑的地方。我知道这个工作模板正在使用它(我现在有多个人在使用它)。但是在我的新流水线和文档中,我看到它不起作用并且不应该起作用。但我在另一个流水线中看到它能正常工作! - el n00b
${{ parameters.environment }} 这会起作用,如果你没有将运行时设定的变量作为值传递。 - Krzysztof Madej
显示剩余2条评论
1个回答

2
这是不可能的,因为 Azure 订阅需要在编译时知道。您在运行时设置变量。 这里有一个类似情况的问题解释:

服务连接或 Azure 订阅不支持运行时变量。在您的代码示例中,您正在引用 AzureSubscription 变量,该变量将在运行时初始化(但不会在保存时初始化)。您的语法是正确的,但您需要将 AzureSubscription 变量作为变量的一部分设置。

如果您像下面这样定义变量:
variables:
  subscriptionId: someValue
  subscriptionName: someValue

然后你会使用它。
- template: execution-cli.yml
  parameters:
    azureSubscriptionId: $(subscriptionId)
    azureSubscriptionName: $(subscriptionName)


"它应该能够工作。但由于您在运行时设置变量,这导致了您的问题。"

这就是它的确切含义。我找到了一个独特的解决方法。我实际上使用了另一个管道以编程方式启动主管道。 "预处理管道" 查找所有值并通过 API 将它们传递给其他管道(我已经为其他原因完成了部分工作)。 https://learn.microsoft.com/en-us/rest/api/azure/devops/?view=azure-devops-rest-6.1 - el n00b
今天是10月22日,还是一样吗? - Tiju John

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接