Terraform模块源路径是否支持条件判断设置?
Terraform模块source参数能否设置条件判断逻辑?
不行,Terraform不支持直接在module块的source参数里写条件表达式,你贴的那种三元语法会直接报错。原因是source属于Terraform配置加载阶段就必须确定的内容,而条件表达式要等到规划阶段才会求值,两者的执行顺序不兼容,Terraform没办法提前预判你要加载哪个模块。
给你两个可行的替代方案:
方案1:用count控制模块实例的创建
创建两个模块块,分别指向不同的source,通过count来控制只有符合条件的模块会被实例化:
module "infra_deployment_sfo" { count = local.region == "SFO" ? 1 : 0 source = "./modules/SFO_repo" # 传递所有需要的参数,保持两个模块的参数一致 env = var.env instance_type = var.instance_type } module "infra_deployment_standard" { count = local.region != "SFO" ? 1 : 0 source = "./modules/standard_repo" # 同样传递参数 env = var.env instance_type = var.instance_type }
如果需要引用模块的输出,可以用one()函数统一获取结果,避免区分两个模块:
output "infra_public_ip" { value = one([ module.infra_deployment_sfo[*].public_ip, module.infra_deployment_standard[*].public_ip ]) }
方案2:统一模块封装差异逻辑
如果两个模块的核心逻辑差不多,只是部分资源有差异,建议把它们合并成一个模块,通过变量来控制差异部分。比如在standard_repo模块里加入对local.region的判断,当region为SFO时加载特定资源,否则用标准配置:
# ./modules/standard_repo/main.tf resource "aws_instance" "standard" { count = local.region != "SFO" ? 1 : 0 ami = var.standard_ami instance_type = var.instance_type } resource "aws_instance" "sfo_specific" { count = local.region == "SFO" ? 1 : 0 ami = var.sfo_ami instance_type = var.sfo_instance_type }
这种方式不需要切换模块source,维护起来更简单,也避免了多模块实例的引用问题。
内容的提问来源于stack exchange,提问作者Datta
相关产品推荐
相关产品推荐

