如何在多个Terraform模块之间共享通用输入变量
方案1:使用局部值(local)封装公共参数(最适合当前场景)
你可以把所有重复的输入参数统一存到一个局部值对象中,再通过Terraform的对象展开语法...批量传入模块,代码示例:
# 先定义公共参数局部值 locals { autoscaling_docker_common = { has_keychain = true instance_type = "t3.micro" certificate = var.certificate ami = var.ami account_id = var.account_id dns_zone_id = var.dns_zone_id environment = var.environment key_name = var.key_name subnets = var.subnets vpc_id = var.vpc_id policies = var.policies region = var.region security_groups_alb = var.security_groups_alb security_groups_ec2 = var.security_groups_ec2 } } # 模块调用直接展开公共参数,只传差异化参数 module "autoscaling_docker_frontend" { source = "../../_/autoscaling_docker" domain = "domain-1.com" name = "name-1" # 展开所有公共参数 ... = local.autoscaling_docker_common } module "autoscaling_docker_backend" { source = "../../_/autoscaling_docker" domain = "domain-2.com" name = "name-2" ... = local.autoscaling_docker_common }
方案2:使用for_each批量生成模块(适合后续需要扩展更多同类型模块的场景)
如果后续还会新增更多同配置的autoscaling_docker模块,可以直接用map定义所有差异化参数,批量生成模块,进一步减少重复代码:
locals { # 公共参数和上面一致 autoscaling_docker_common = { has_keychain = true instance_type = "t3.micro" # 其余公共参数同上,省略 } # 定义所有实例的差异化配置 autoscaling_docker_instances = { frontend = { domain = "domain-1.com" name = "name-1" } backend = { domain = "domain-2.com" name = "name-2" } # 后续新增实例直接在这里加条目即可 } } # 批量生成模块 module "autoscaling_docker" { source = "../../_/autoscaling_docker" for_each = local.autoscaling_docker_instances domain = each.value.domain name = each.value.name ... = local.autoscaling_docker_common }
生成后你可以通过module.autoscaling_docker["frontend"]和module.autoscaling_docker["backend"]分别引用两个模块的输出值。
方案3:跨文件/跨根模块共享配置
如果这些公共参数需要在多个根Terraform目录中共享,你可以:
- 把公共变量存入独立的
common.tfvars文件,执行apply时通过-var-file=common.tfvars参数加载 - 把公共配置写入独立的
locals.tf文件,在需要的根模块中直接引用即可
注意事项
- 使用对象展开语法时,要确保局部值中的键名和模块定义的输入参数名完全一致,否则会报参数不匹配错误
- 使用for_each批量生成模块时,不要随意修改
autoscaling_docker_instances的key值,否则会触发对应模块的销毁重建
内容的提问来源于stack exchange,提问作者Daniele
相关产品推荐
相关产品推荐

