Terraform CLI如何为不同模块的同一变量设置不同值
问题原因
Terraform的根变量是全局作用域的,CLI传入的-var参数不会和-target指定的目标模块做绑定,重复传入同名变量时,后传入的值会直接覆盖前面的所有同变量赋值,最终所有引用该根变量的模块都会拿到最后一次传入的值,这就是你两个模块都拿到152.67.25.237的根本原因。-target参数的作用只是限定本次执行要操作的资源/模块范围,不会改变变量的全局作用域规则。
解决方案
你可以根据自己的使用场景选以下两种方案:
方案1:使用Map类型根变量(推荐,符合Terraform声明式设计,单次执行即可完成)
将原本单值的cg_ip_address根变量改为Map类型,用模块名作为key存储不同模块对应的IP值,各模块分别读取对应key的取值即可。
- 修改变量定义(通常在
variables.tf中):
variable "cg_ip_address" { type = map(string) description = "各区域模块对应的CG公网IP,key与模块名保持一致" } variable "is_second_execution" { type = bool default = false }
- 修改
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 }
- 执行命令时直接传入完整的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操作:
- 先操作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"
- 再操作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
相关产品推荐
相关产品推荐

