Terraform无法引用其他目录变量:no declaration found报错
问题根源
Terraform的根模块(即存放main.tf的./terraform目录)只会自动加载当前目录下的.tf文件,不会主动扫描子目录中的变量声明。你把env_name的变量定义移到./terraform/environment/dev/子目录后,根模块无法识别这个位置的变量声明,因此触发no declaration found for "var.env_name"错误。
解决办法
办法1:将变量声明移回根模块目录
如果只是想集中管理变量文件,无需放到子目录。直接在./terraform下新建variables.tf文件,把变量定义放在这里即可,根模块会自动加载该文件。
办法2:将子目录设为模块并引用
如果必须把变量放在environment/dev目录,可将该目录作为模块,在根模块中引用它获取变量值:
- 在
./terraform/environment/dev/variables.tf中保留变量定义,同时新增输出配置:
variable "env_name" { type = string } output "env_name" { value = var.env_name }
- 在根模块的
main.tf中引用该模块,并用其输出值给vpc模块传参:
module "dev_env" { source = "./environment/dev" # 给该模块的env_name变量传值,可直接写死或从根模块其他变量传入 env_name = "dev" } module "vpc" { source = "./modules/vpc" env_name = module.dev_env.env_name }
办法3:区分变量声明与赋值(若混淆概念)
如果你混淆了变量声明和变量赋值:变量声明(variable "env_name" {...})必须放在根模块或被引用的模块中;而变量的具体值可存放在*.tfvars文件里。若你的需求是集中存放变量值而非声明,可按以下操作:
- 在根模块的
variables.tf中保留变量声明:
variable "env_name" { type = string }
- 在
./terraform/environment/dev/dev.tfvars中写入变量值:
env_name = "dev"
- 执行Terraform命令时指定该tfvars文件:
terraform plan -var-file=./environment/dev/dev.tfvars
内容的提问来源于stack exchange,提问作者alikhantara
相关产品推荐
相关产品推荐

