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

如何在多个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 11:27:03