Terraform中无法跨模块获取模块内定义的变量值
问题解决:Terraform模块间变量引用失败
错误原因
模块内部定义的变量(即便带有默认值)属于模块私有属性,外部模块无法直接访问。必须在被引用模块中通过output明确暴露需要对外提供的属性,外部才能正常调用。
解决步骤
1. 在被引用模块中添加输出配置
在../modules/dev_env目录下创建outputs.tf文件,将需要外部访问的变量定义为输出:
# ../modules/dev_env/outputs.tf output "INSTANCE_TYPE" { value = var.INSTANCE_TYPE } output "AWS_MUMBAI_REGION" { value = var.AWS_MUMBAI_REGION } output "AMIS" { value = var.AMIS }
2. 修正主模块的引用方式
主模块中直接引用模块输出的属性,建议使用Terraform 0.12+的新式语法(无需${}插值):
module "mydemomodule" { source = "../modules/dev_env" } resource "aws_instance" "demo" { ami = module.mydemomodule.AMIS.LINUX_MUMBAI region = module.mydemomodule.AWS_MUMBAI_REGION instance_type = module.mydemomodule.INSTANCE_TYPE key_name = aws_key_pair.ssshkey.key_name tags = { Name = "${terraform.workspace}_server" } }
3. 规范变量文件(可选但建议)
你当前把变量定义写在了dev.tfvars里,不符合Terraform规范:
- 变量定义应放在
variables.tf文件中(模块内) .tfvars文件仅用于赋值变量值,比如需要覆盖默认值时使用
调整后模块内的文件结构:
../modules/dev_env/ ├── variables.tf # 存放变量定义 ├── outputs.tf # 存放输出定义 └── dev.tfvars # 可选,存放变量的自定义值
variables.tf内容如下:
# ../modules/dev_env/variables.tf variable "INSTANCE_TYPE"{ default = "t2.micro" } variable "AWS_MUMBAI_REGION"{ default = "ap-south-1" } variable "AWS_SINGAPORE_REGION"{ default = "us-southeast-1" } variable "AMIS" { type = map default = { LINUX_MUMBAI = "ami-0cca134ec43cf708f" UBUNTU_MUMBAI = "ami-07ffb2f4d65357b42" LINUX_SGP = "ami-005835d578c62050d" UBUNTU_SGP = "ami-02045ebddb047018b" } }
验证执行
完成修改后,重新执行以下命令:
terraform init terraform plan
内容的提问来源于stack exchange,提问作者Rajiv Verma
相关产品推荐
相关产品推荐

