Terraform条件替换实现类case逻辑时括号不匹配报错如何解决
问题原因
你遇到的括号报错本质是语法错误触发的解析异常:在source == "#Env_customer_cidr" && env == "test"后面你错把三元运算符要求的?写成了:,导致Terraform解析器无法识别后续的表达式结构,误判为括号没有闭合。
另外冗余的嵌套三元判断也完全没有必要,你的结构化配置本身就支持直接用env作为key取值。
修复后的原始写法(仅解决括号报错)
source_ranges = distinct(flatten([for source in v.source_ranges_names : source == "#Env" ? replace(source, "#Env", env) : (source == "#Env_customer_cidr" && env == "prod" ? var.customer_ranges["prod"]["customer_cidr"] : (source == "#Env_customer_cidr" && env == "test" ? var.customer_ranges["test"]["customer_cidr"] : local.defined_ranges[source])) ]))
注:Terraform 0.12+版本中直接引用变量不需要额外套${}插值语法,已删除冗余写法。
更合理的实现方案
直接用env变量作为key读取customer_ranges的对应值,不需要嵌套判断环境,后续新增环境也不用修改这段逻辑,可读性和可维护性都更高:
source_ranges = distinct(flatten([ for source in v.source_ranges_names : source == "#Env" ? replace(source, "#Env", env) : source == "#Env_customer_cidr" ? var.customer_ranges[env]["customer_cidr"] : local.defined_ranges[source] ]))
如果需要兼容非法env值的场景,可以加try做容错处理:
# 示例:env非法时默认返回本地回环地址,可根据业务需求调整默认值 source == "#Env_customer_cidr" ? try(var.customer_ranges[env]["customer_cidr"], "127.0.0.1/32") :
内容的提问来源于stack exchange,提问作者djsmiley2kStaysInside
相关产品推荐
相关产品推荐

