通过 azure devops 中的管道将 terraform 部署到 azure

时间:2021-04-30 14:10:52

标签: azure azure-devops yaml terraform azure-pipelines

我已经将 terraform 部署到本地从 azure cli 到成功,所以我知道 TF 正在工作 我现在正在尝试构建一个管道来自动化这个过程,但是我收到了这个错误......

错误:构建 ARM 配置时出错:从 Azure CLI 获取订阅(xxxxxx):从 Azure CLI 解析 json 结果时出错:等待 Azure CLI 时出错:退出状态 1

当 init 在管道中运行时出现此错误。

这就是管道的样子...

pool:
  vmImage: ubuntu-latest

stages :
  - stage: validate
    jobs:
    - job: validate
      continueOnError: false
      steps:
      - task: ms-devlabs.custom-terraform-tasks.custom-terraform-installer-task.TerraformInstaller@0
        displayName: 'install'
        inputs:
          terraformVersion: '0.14.10'
      
      - bash: echo $(ls -latR)
        
      - task: TerraformTaskV1@0
        displayName: 'init'
        inputs:
          provider: 'azurerm'
          command: 'init'
          workingDirectory: "$(System.DefaultWorkingDirectory)"
          backendServiceArm: 'Service-Fabric'
          backendAzureRmResourceGroupName: 'fvs-uks-sf-rg-02'
          backendAzureRmStorageAccountName: 'fvsukssfstorage'
          backendAzureRmContainerName: 'fvs-uks-sf-backend01'
          backendAzureRmKey: 'terraform.tfstate'
              
      - task: TerraformTaskV1@0
        displayName: 'validate'
        inputs:
         provider: 'azurerm'
         command: 'validate'

      - task: TerraformTaskV1@0
        displayName: 'plan'
        inputs:
          provider: 'azurerm'
          command: 'plan'
          workingDirectory: "$(System.DefaultWorkingDirectory)"
          environmentServiceNameAzureRM: 'test'
          environmentServiceNameAWS: 'AWS-Azure-VPN'

这是 backend.tf 的样子...

provider "azurerm" {
  alias   = "hub"
  subscription_id = "xxxxxxx"
  features {}
}

provider "azurerm" {
  features {}
}

terraform {
  backend "azurerm" {
    subscription_id      = "xxxxxx"
    resource_group_name  = "xxxxxx"
    storage_account_name = "xxxxxx"
    container_name       = "xxxxxx"
    key                  = "terraform.tfstate"
  }
}

我还通过服务主体建立了到 azure 的服务连接,当通过身份验证连接成功时。

非常感谢任何帮助

1 个答案:

答案 0 :(得分:0)

<块引用>

通过 azure devops 中的管道将 terraform 部署到 azure

这个问题应该和授权有关。

当我们使用服务连接进行授权时,它使用服务主体而不是用户名/密码进行身份验证。

然后根据terraform docs

<块引用>

如果您使用服务主体进行身份验证,那么它必须具有 读取和写入所有应用程序以及登录和 在 Windows Azure Active Directory API 中读取用户配置文件

请尝试为您用于创建服务连接的主体添加 API 权限:

enter image description here

<块引用>

导航到 Azure 中的 Azure Active Directory 概述 门户并选择应用程序注册边栏选项卡。找到您的注册 应用程序并点击其显示名称进行管理。

转到应用程序的 API 权限边栏选项卡,然后单击“添加 权限”按钮。在打开的窗格中,选择“Azure Active Directory Graph”(在 Supported Legacy APIs 副标题下)。不要 选择“Microsoft Graph”,因为提供程序当前不使用

权限类型选择“应用权限”,勾选 您要分配的权限。您需要的权限 将取决于您要管理的目录对象 地形。我们建议使用以下权限:

AddEntityFrameworkStores

Application.ReadWrite.All