如何在 Terraform 文件中使用 Azure DevOps 变量组引用

How to use Azure DevOps Variable Group references in Terraform File

我在 Azure Devops 中定义了一个变量组,其中变量很少。我想在我的 Terraform 配置中使用它们。谁能告诉我如何使用 ADO 变量组值引用我的 Terraform 文件中的值。

我有以下代码

terraform {
  required_version = "~> 1.0"
  backend "azurerm" {
    container_name       = "demo-generator-terraform"
    storage_account_name = "test-stor"
    resource_group_name  = "Test-Rg"
  }

  required_providers {
    azuread = "~> 1.0"
    azurerm = "~> 2.0"
    azuredevops =  { source = "registry.terraform.io/microsoft/azuredevops", version = "~> 0.0" }
  }
}



provider "azurerm" {
  tenant_id       = var.tenant_id
  client_id       = var.client_id
  client_secret   = var.client_secret
  subscription_id = var.subscription_id
  features {}
}



data "azuredevops_project" "demo-project" {
  name = "DemoGenerator"
}

data "azuredevops_variable_group" "default" {
  name = "demo-variable"
}

variable "client_id" {
  default = "290xxxx-xxxx-xxxx-bx25-xxxxxx4"
}



variable "subscription_id" {
}

variable "client_secret" {
 }

 variable "appserviceplan" {
}

variable "appservicename" {
}

variable "tenant_id" {
}
    


locals {
  custom_tags = {
    Environment = "Dev"
    Department  = "Finance"
    Owner       = "Self"
  }
}

资源块

resource "azurerm_resource_group" "dev" {
  name     = "PULTerraform"
  location = "West US"
  tags     = local.custom_tags
}

resource "azurerm_app_service_plan" "dev" {
  name                =  
  location            = "${azurerm_resource_group.dev.location}"
  resource_group_name = "${azurerm_resource_group.dev.name}"
  tags                = local.custom_tags

  sku {
    tier = "Free"
    size = "F1"
  }
}


resource "azurerm_app_service" "dev" {
  name                = 
  location            = "${azurerm_resource_group.dev.location}"
  resource_group_name = "${azurerm_resource_group.dev.name}"
  app_service_plan_id = "${azurerm_app_service_plan.dev.id}"
  tags                = local.custom_tags
}

我的 ADO 中定义的变量组附加在屏幕截图中,其中很少有值标记为敏感,因此它们被屏蔽了

我想知道如何在 Terraform 中定义应用服务计划和应用服务的名称,以便它引用 ADO 变量组变量中已经存在的值

补充一下,我创建了一个terraform.tfvars文件,文件内容如下所示

client_id       = "290ca8c5-d706-4f3c-b525-cc8c51b63694"
client_secret   = __secret__
tenant_id       = __tenant_id__
subscription_id = __sub__
appservicename  = __appservicename__
appserviceplan  = __appserviceplan__

我的管道中还有一个替换标记任务,其中包含目标文件 --> '**/*.tfvars' 和标记模式 --> ... ,但任务没有找到任何东西,输出在该任务的下方给出

2022-04-15T23:58:24.8107669Z ##[section]Starting: Replace tokens in terraform file
2022-04-15T23:58:24.8272887Z ==============================================================================
2022-04-15T23:58:24.8273218Z Task         : Replace Tokens
2022-04-15T23:58:24.8273453Z Description  : Replace tokens in files
2022-04-15T23:58:24.8273648Z Version      : 5.1.0
2022-04-15T23:58:24.8273848Z Author       : Guillaume Rouchon
2022-04-15T23:58:24.8275170Z Help         : [Learn more about this task](https://github.com/qetza/vsts-replacetokens-task/blob/master/ReplaceTokens/ReplaceTokensV4/README.md) (v5.1.0)
2022-04-15T23:58:24.8275655Z ==============================================================================
2022-04-15T23:58:25.1628403Z replaced 0 tokens out of 0 in 0 file(s) in 0.022 seconds.
2022-04-15T23:58:26.1647462Z ##[section]Finishing: Replace tokens in terraform file

知道这里发生了什么

这个问题基本上可以概括为“如何从 Azure DevOps 变量组设置在根模块中声明的 Terraform 变量的值?”

Terraform docs列出四种设置根模块变量值的可能性:

  1. 在 Terraform Cloud 工作区中,
  2. 通过命令行选项,
  3. 作为环境变量,
  4. 在变量定义文件中。

下面我将详细介绍如何在Azure Devops中使用后一种方式。

在 Terraform 中,您可以在 Variable Definitions File (.tfvars) 中为根模块的变量指定值。 在您的情况下,这将如下所示:

appservicename  = "appservicename" 
appserviceplan  = "PULTerraformplan"
tenant_id       = "your_tenant_id"
subscription_id = "your_subscription_id"

现在,为了从您的变量组生成此 .tfvars 文件,您可以使用市场上名为 Replace Tokens 的 Azure Pipelines 扩展。只需将它安装在您的 ADO 组织中。

接下来,将 .tfvars 文件的模板添加到您的存储库中。在下文中,我将假设您的 Terraform 代码位于存储库根目录下的 terraform 文件夹中。在此文件夹中创建包含以下内容的文件 terraform.tfvars

appservicename  = "#{appservicename}#" 
appserviceplan  = "#{appserviceplan}#"
subscription_id = "#{subscription_id}#"
tenant_id       = "#{tenant_id}#"

最后,通过引用变量组并添加 replacetokens 任务来扩展您的管道:

variables:
- group: myvargroup

stages:
- stage: Test
  jobs:
  - job: Test
    steps:
    - task: replacetokens@5
      inputs:
        targetFiles: 'terraform/terraform.tfvars'
        encoding: 'auto'
        tokenPattern: 'default'
        writeBOM: true
        actionOnMissing: 'warn'
        keepToken: false
        actionOnNoFiles: 'continue'
        enableTransforms: false
        enableRecursion: false
        useLegacyPattern: false
        enableTelemetry: true