如何使用Terraform按条件跳过资源指定配置段的创建与生效
实现方案
实现逻辑
- 新增环境标识变量,区分当前部署的环境类型
- 新增本地值判断是否需要启用VNet配置,仅dev、stg环境返回true
- 对
virtual_network_type参数用三元表达式赋值,prod环境固定设置为None - 用Terraform动态块语法控制
virtual_network_configuration块的生成,仅dev、stg环境生成该配置块 - 可选优化:给VNet、子网的数据源添加计数条件,prod环境不拉取对应资源,避免不必要的资源校验报错
修改后的完整配置
variables.tf 文件
variable "vnet_type" {} # 新增环境变量,可选值为dev、stg、prod variable "env" {}
terraform.tfvars 文件(按环境调整对应取值)
# dev环境示例 vnet_type = "External" env = "dev" # prod环境示例 # vnet_type 可任意配置,不会生效 # env = "prod"
main.tf 文件
locals { vnet_type = (var.vnet_type != "" ? var.vnet_type : "None") # 判断是否需要启用VNet配置 enable_vnet = contains(["dev", "stg"], var.env) } # 数据源加计数条件,仅需要启用VNet的环境拉取资源 data "azurerm_virtual_network" vnet { count = local.enable_vnet ? 1 : 0 name = "testvnet" resource_group_name = "rest1" } data "azurerm_subnet" subnets { count = local.enable_vnet ? 1 : 0 name = "testSubnet" resource_group_name = "rest1" virtual_network_name = data.azurerm_virtual_network.vnet[0].name } resource "azurerm_api_management" "apim_demo" { name = "test-apim" location = "East US" resource_group_name = "rest1" publisher_name = "admin" publisher_email = "admin@gmail.com" sku_name = "Developer_1" identity { type = "SystemAssigned" } # vnet_Type 可选值为External、None或Internal,prod环境固定设为None virtual_network_type = local.enable_vnet ? local.vnet_type : "None" # 动态块,仅非prod环境生成该配置段 dynamic "virtual_network_configuration" { for_each = local.enable_vnet ? [1] : [] content { subnet_id = data.azurerm_subnet.subnets[0].id } } }
注意事项
- 不同部署环境只需修改
terraform.tfvars里的env取值即可自动适配配置 - prod环境下即使配置了
vnet_type也不会生效,优先级以环境判断为准 - 数据源加了计数条件后,prod环境不存在VNet、子网资源也不会报错
内容的提问来源于stack exchange,提问作者devops-admin
相关产品推荐
相关产品推荐

