具有动态 azureSubscription 的 DevOps 管道 AzureCLI@2

el *_*00b 5 azure-devops azure-pipelines

我的 DevOps 管道给了我这个错误:

存在资源授权问题: “管道无效。作业执行Terraform:步骤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}"
Run Code Online (Sandbox Code Playgroud)

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

- template: execution-cli.yml
  parameters:
    azureSubscriptionId: $(subscriptionId)
    azureSubscriptionName: $(subscriptionName)
Run Code Online (Sandbox Code Playgroud)

在模板内,我的 CLI 步骤使用:

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

看起来 Pipelines 正在尝试先发制人地检查授权,而没有注意到其中存在变量。我在这里做错了什么,导致 Azure 在错误的时间尝试解决该问题?

我在其他管道中执行此操作没有出现任何问题,并且我不确定在这个特定实例中有何不同。

更新 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
Run Code Online (Sandbox Code Playgroud)

Krz*_*tof 3

这是不可能的,因为需要在编译时知道天蓝色订阅。您在运行时设置变量。

这里解释了类似情况的问题:

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

如果您定义变量如下:

variables:
  subscriptionId: someValue
  subscriptionName: someValue
Run Code Online (Sandbox Code Playgroud)

然后你就会使用它

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

Run Code Online (Sandbox Code Playgroud)

它应该有效。但由于您在运行时设置了变量,因此会导致您的问题。