如何在 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列出四种设置根模块变量值的可能性:
- 在 Terraform Cloud 工作区中,
- 通过命令行选项,
- 作为环境变量,
- 在变量定义文件中。
下面我将详细介绍如何在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
我在 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列出四种设置根模块变量值的可能性:
- 在 Terraform Cloud 工作区中,
- 通过命令行选项,
- 作为环境变量,
- 在变量定义文件中。
下面我将详细介绍如何在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