Terraform plan未加载--var-file指定的tfvars值,如何解决?
问题解决:让Terraform正确读取tfvars文件及目录优化建议
一、tfvars未生效的核心原因及修复步骤
1. 子模块变量未传递
你的根模块(原modules目录下)虽然通过tfvars获取了变量,但在调用module-ecs子模块时,没有将这些变量传递给子模块,导致子模块只能使用自身定义的默认值。
修复操作:
修改原./modules/main.tf(后续会调整目录,暂时按当前路径),在调用子模块时显式传递变量:
provider "aws" { region = var.aws_region shared_credentials_files = ["~/.aws/credentials"] profile = var.aws_profile } module "aws-ecr" { source = "./module-ecs" # 修正子模块路径,原路径为./ecs,与实际目录名不符 # 将根模块变量传递给子模块 app_name = var.app_name environment = var.environment aws_region = var.aws_region aws_profile = var.aws_profile }
同时可以移除./modules/module-ecs/variables.tf中的默认值,强制依赖父模块传递变量,避免默认值干扰:
variable "app_name" {} variable "environment" {} variable "aws_region" {} variable "aws_profile" {}
2. 根模块目录位置错误
Terraform的根模块(执行命令的工作目录)不应放在modules文件夹下——modules目录是用来存放可复用子模块的,根模块文件应放在项目根目录。
调整目录结构:
- 将
modules目录下的backend.tf、main.tf、variables.tf移动到项目根目录 - 保留
modules/module-ecs作为子模块目录 - 修正
vars目录下重复的prod-useast1.tfvars为prod-uswest2.tfvars
调整后的目录:
. ├── backend.tf ├── main.tf ├── variables.tf ├── config │ ├── stg-useast1.config │ ├── stg-uswest2.config │ ├── prod-useast1.config │ └── prod-uswest2.config ├── vars │ ├── stg-useast1.tfvars │ ├── stg-uswest2.tfvars │ ├── prod-useast1.tfvars │ └── prod-uswest2.tfvars └── modules └── module-ecs ├── main.tf └── variables.tf
执行命令(项目根目录下):
# 初始化backend terraform init --backend-config=./config/stg-useast1.config # 执行plan terraform plan --var-file=./vars/stg-useast1.tfvars
二、多环境多区域的目录结构优化建议
方案1:按环境+区域拆分独立工作目录(推荐生产环境)
每个环境/区域拥有独立的根模块目录,共享子模块,实现完全隔离:
. ├── modules │ └── module-ecs │ ├── main.tf │ └── variables.tf ├── environments │ ├── stg │ │ ├── us-east-1 │ │ │ ├── backend.tf │ │ │ ├── main.tf │ │ │ └── variables.tf │ │ └── us-west-2 │ │ ├── backend.tf │ │ ├── main.tf │ │ └── variables.tf │ └── prod │ ├── us-east-1 │ │ ├── backend.tf │ │ ├── main.tf │ │ └── variables.tf │ └── us-west-2 │ ├── backend.tf │ ├── main.tf │ └── variables.tf └── configs ├── stg-useast1.config ├── stg-uswest2.config ├── prod-useast1.config └── prod-uswest2.config
- 优势:彻底隔离各环境/区域的状态和配置,避免误操作风险
- 执行命令时进入对应环境/区域目录操作即可
方案2:根模块+Terraform工作区(适合非严格隔离场景)
使用工作区区分环境,配合变量文件,但仍需为每个区域配置独立backend:
. ├── backend.tf # 留空,通过--backend-config指定 ├── main.tf ├── variables.tf ├── modules │ └── module-ecs │ ├── main.tf │ └── variables.tf ├── vars │ ├── stg-useast1.tfvars │ ├── stg-uswest2.tfvars │ ├── prod-useast1.tfvars │ └── prod-uswest2.tfvars └── configs ├── stg-useast1.config ├── stg-uswest2.config ├── prod-useast1.config └── prod-uswest2.config
- 注意:工作区共享状态存储的逻辑前缀,隔离性不如独立目录,生产环境建议优先方案1
内容的提问来源于stack exchange,提问作者Rafiq
相关产品推荐
相关产品推荐

