有没有办法在Azure服务连接中使用变量?

4
我一直在编写Terraform代码,并使用Azure DevOps部署管道。然而,如果我使用$(serviceconnection)变量来连接服务,则会出现以下错误:出现资源授权问题:“管道无效。部署作业DeployDev:步骤TerraformCLI1输入backendServiceArm引用了无法找到的服务连接$(serviceconnection)。服务连接不存在或未被授权使用。”我尝试过进行授权,但没有成功。是否有任何解决方法?
任务是一个YAML任务,使用如下Terraform命令:
- task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-cli.TerraformCLI@0
   displayName: 'Terraform Init'
   inputs:
     command: init
     workingDirectory: $(Agent.BuildDirectory)/a/azuredirectory/terraform
     backendType: azurerm
     backendServiceArm: $(serviceconnection)
     backendAzureRmResourceGroupName: $(ResourceGroupName)
     backendAzureRmStorageAccountName: $(StorageAccountName)
     backendAzureRmContainerName: $(ContainerName)
     backendAzureRmKey: $(AzureRmKey)

嗨,有更新了吗?我的或托马斯的回答能解决你的问题吗? - Bowman Zhu-MSFT
3个回答

4

您需要使用模板表达式语法来设置服务连接变量:

backendServiceArm: ${{ variables.serviceconnection }}

我想这是因为在运行管道之前需要知道服务连接。

示例用例。使用名为variable.dev.yaml的变量文件:

variables:
  serviceconnection: my-dev-service-connection-name
...

然后您可以在管道中引用它:

jobs:
- job: myJob
  ...
  variables:
  - template: ./variable.dev.yaml
  steps:
  - task: AzureCLI@2
    inputs:
      azureSubscription: ${{ variables.serviceconnection  }}
...

2
如果您想使用类似$(serviceconnection)的运行时变量,目前不支持。
可以使用Thomas推荐的${{ variables.serviceconnection }}。但这种做法意味着您必须提前指定变量(在运行管道之前)。
对于服务连接,您可以直接指定值或使用“编译时变量”${{xxx}},它会在运行之前扩展并填充服务连接部分的值。在使用$(xxx)的情况下,任务的服务连接无法获取,因为这是一个运行时值。
服务连接需要在运行之前指定。管道运行期间变量的更改(运行时更改)将不会被后续任务的服务连接部分获取。
您正在使用运行时变量。
但是运行时变量不支持服务连接或Azure订阅。该变量将在运行时初始化。

https://github.com/microsoft/azure-pipelines-tasks/issues/10376#issuecomment-514477023

您可以按照以下方法使用不同的服务连接:

https://dev59.com/fbXna4cB1Zd3GeqPP7_G#57520153

但仍需要指出的是,参数在管道运行之前被扩展,硬编码特定服务连接是不可避免的,这是按设计来的。
此外,在官方文档中也明确说明了这一点:

https://learn.microsoft.com/en-us/azure/devops/pipelines/library/service-endpoints?view=azure-devops&tabs=yaml#use-a-service-connection

enter image description here


这显然是错误的。我使用变量文件已经有2年了,总是使用变量来指定服务连接,一直运行得很好。 - Thomas
@Thomas 我理解原始问题是关于使用“变量”的,我知道你提到的内容。然而,由于服务连接的特性,在运行时生成的更改无法被服务连接部分获取。我认为此时服务连接部分中的'${{ variables.xxx}}'在这种情况下是一种常量。如果只是谈论如何使用“管道YAML结构”中的“变量”的值,你是正确的。 - Bowman Zhu-MSFT
@Thomas 但是这里的服务连接的值在管道运行中无法更改(它需要在启动前提供),我认为在此提供的东西不能被称为“变量”。如果我误解了什么,请随时让我知道,谢谢。:) - Bowman Zhu-MSFT
这个答案的问题在于它是误导性的。人们会认为这是不可能的,但99%的情况下我们只需要使用一个带有不同预定义变量集的作业来重新使用每个环境。 - Thomas

0
一个对我有效的解决方法。
创建一个通用的变量组(库),并定义一个或多个serviceconnection名称。

Pipeline variable group

现在,这个组需要被声明为根级别或管道级别。
name: Azure CI/CD

pr:
  branches:
    include:
      - develop

trigger:
  branches:
    include:
      - develop

pool:
  vmImage: ubuntu-latest

variables:
- group: CommonVariables

stages:
  - stage: Build        
    jobs:
      - job: B1
        steps:
          - task: AzureCLI@2
            displayName: Preview Bicep Changes
            inputs:
              azureSubscription: '$(azureResourceManagerServiceConnection)'
              scriptType: 'bash'
              scriptLocation: 'inlineScript'
              inlineScript: |
                az --version

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