Terraform子模块目录terraform.tfvars不生效报错解决方案
问题根因
Terraform 对 .tfvars 变量文件的自动加载范围仅限执行Terraform命令的当前工作目录(即根模块目录),子模块目录下存放的 terraform.tfvars 不会被Terraform自动读取加载。
你的场景中,三个变量都没有配置默认值,根模块调用子模块时没有显式传入对应参数,子模块目录下的tfvars又不生效,因此触发「缺少必填参数」的报错;给变量加default后能正常运行,正是因为变量有了内置默认值后不再需要外部传参。
可行解决方案
你可以根据自己的使用场景选以下任意一种方案:
- 方案1(模块开发推荐写法):调用模块时直接传参
修改根目录下的demo.tf,在module块中直接传入所有必填变量的值,示例:
这种写法符合Terraform模块的设计逻辑:模块只封装资源逻辑,变量值由调用方传入,模块本身不绑定固定配置,复用性最强。module "module" { source = "./module" database_name = "mydatabase" bucket_location = "kgvjgfkjhglbg" table_name = "mytable" } - 方案2:将tfvars文件迁移到根目录,做变量透传
把module目录下的terraform.tfvars移动到和demo.tf、provider.tf同级的根目录。注意:Terraform不会自动把根模块的变量值传递给子模块,你需要先在根目录声明对应变量,再在调用子模块时透传:- 根目录新建
variables.tf,声明和子模块一致的三个变量 - 修改
demo.tf的module块,传入变量引用:module "module" { source = "./module" database_name = var.database_name bucket_location = var.bucket_location table_name = var.table_name }
terraform.tfvars会自动给根模块的变量赋值,再通过透传传入子模块。 - 根目录新建
- 方案3:执行命令时手动指定变量文件路径
执行Terraform命令时通过-var-file参数手动指定要加载的tfvars文件路径,示例:
注意:这种方式加载的变量依然属于根模块,你还是需要按照方案2的写法,在module块中完成变量透传,不能省略传参步骤。terraform plan -var-file=./module/terraform.tfvars
额外修复提示
你贴出的module/main.tf代码存在几处引号未闭合的语法错误,修复变量问题后记得同步修改,否则会触发语法解析报错:
- 列定义处的
name = "filekey"、name = "reead_dt"缺少右侧闭合双引号 - 分区键定义处的
name = "load_dt"缺少右侧闭合双引号
内容的提问来源于stack exchange,提问作者Arghya Roy
相关产品推荐
相关产品推荐

