Terraform调用本地模块时父目录terraform.tfvars文件不生效如何解决
Terraform 父目录 terraform.tfvars 不生效原因
核心底层规则
Terraform 的terraform.tfvars(含*.auto.tfvars)仅对执行命令时工作目录下的根模块生效,既不会自动向下传递给被调用的子模块,也不会跨目录加载任意子目录下的变量文件。
具体触发问题的原因
- 子模块无自动继承父模块变量的机制:所有子模块中声明的变量,必须在调用子模块的代码块中显式传值,无法直接读取父目录
terraform.tfvars中的取值。 - 你观测到的「模块优先读取自身目录下的变量文件」属于误判:Terraform 默认不会加载子模块目录内的任何tfvars文件,你看到的子模块取值实际是子模块
variables.tf中声明的变量default默认值。 - 常见错误场景:父目录根模块调用子模块时仅指定了source参数,没有给子模块变量赋值,导致子模块直接走默认值,看起来就像父目录的tfvars没有生效。
修复方法
- 首先在父目录的根模块
variables.tf中,声明和子模块需要用到的同名变量 - 调用子模块时,将父模块加载到的变量值显式传递给子模块,示例代码如下:
# 父目录根模块 variables.tf 先声明变量,会自动读取同目录 terraform.tfvars 的赋值 variable "instance_count" { type = number } variable "instance_type" { type = string } # 父目录根模块 main.tf 中调用子模块时传值 module "service" { source = "./modules/your-local-module" instance_count = var.instance_count instance_type = var.instance_type }
如果需要传递的变量较多,也可以直接将根模块的所有变量批量传递给子模块:
module "service" { source = "./modules/your-local-module" vars = var }
额外注意事项
不要在子模块目录下存放terraform.tfvars文件,该文件放置在子模块目录下不会生效,子模块的默认取值统一在子模块的variables.tf中通过default字段声明即可。
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

