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

Terraform CLI如何为不同模块的同一变量设置不同值

问题原因

Terraform的根变量是全局作用域的,CLI传入的-var参数不会和-target指定的目标模块做绑定,重复传入同名变量时,后传入的值会直接覆盖前面的所有同变量赋值,最终所有引用该根变量的模块都会拿到最后一次传入的值,这就是你两个模块都拿到152.67.25.237的根本原因。
-target参数的作用只是限定本次执行要操作的资源/模块范围,不会改变变量的全局作用域规则。

解决方案

你可以根据自己的使用场景选以下两种方案:

方案1:使用Map类型根变量(推荐,符合Terraform声明式设计,单次执行即可完成)

将原本单值的cg_ip_address根变量改为Map类型,用模块名作为key存储不同模块对应的IP值,各模块分别读取对应key的取值即可。

  1. 修改变量定义(通常在variables.tf中):
variable "cg_ip_address" {
  type        = map(string)
  description = "各区域模块对应的CG公网IP,key与模块名保持一致"
}

variable "is_second_execution" {
  type    = bool
  default = false
}
  1. 修改main.tf中各模块的传参逻辑:
module "mumbai" {
  source                    = "./site-to-site-vpn-setup"
  providers                 = { aws = aws.mumbai }
  vpc_cidr                  = local.vpc_cidr
  public_subnets_cidr_list  = local.public_subnets_cidr_list
  private_subnets_cidr_list = local.private_subnets_cidr_list
  oci_vcn_cidr              = local.oci_vcn_cidr
  cg_ip_address             = var.cg_ip_address["mumbai"]
  is_second_execution       = var.is_second_execution
}

module "saopaulo" {
  source                    = "./site-to-site-vpn-setup"
  providers                 = {aws = aws.saopaulo}
  vpc_cidr                  = local.vpc_cidr
  public_subnets_cidr_list  = local.public_subnets_cidr_list
  private_subnets_cidr_list = local.private_subnets_cidr_list
  oci_vcn_cidr              = local.oci_vcn_cidr
  cg_ip_address             = var.cg_ip_address["saopaulo"]
  is_second_execution       = var.is_second_execution
}

module "us" {
  source                    = "./site-to-site-vpn-setup"
  providers                 = {aws = aws.us}
  vpc_cidr                  = local.vpc_cidr
  public_subnets_cidr_list  = local.public_subnets_cidr_list
  private_subnets_cidr_list = local.private_subnets_cidr_list
  oci_vcn_cidr              = local.oci_vcn_cidr
  cg_ip_address             = var.cg_ip_address["us"]
  is_second_execution       = var.is_second_execution
}
  1. 执行命令时直接传入完整的Map值即可,单次命令就能给所有模块传对应值:
terraform plan \
  -var "is_second_execution=true" \
  -var 'cg_ip_address={us="152.67.25.238", mumbai="152.67.25.237", saopaulo="对应IP值"}'

方案2:分模块多次执行(无需修改现有配置,适合临时操作场景)

如果你不想调整现有变量结构,可以每次执行只指定单个目标模块,传入该模块对应的cg_ip_address值,分批次完成plan和apply操作:

  1. 先操作us模块:
# 规划
terraform plan -target=module.us -var "is_second_execution=true" -var "cg_ip_address=152.67.25.238"
# 确认结果无误后执行应用
terraform apply -target=module.us -var "is_second_execution=true" -var "cg_ip_address=152.67.25.238"
  1. 再操作mumbai模块:
# 规划
terraform plan -target=module.mumbai -var "is_second_execution=true" -var "cg_ip_address=152.67.25.237"
# 确认结果无误后执行应用
terraform apply -target=module.mumbai -var "is_second_execution=true" -var "cg_ip_address=152.67.25.237"

注意:分批次执行时要仔细核对plan输出结果,避免误修改非目标模块的资源,生产环境优先选择方案1。


内容的提问来源于stack exchange,提问作者Gautam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:01:06