You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 11:24:04