Terraform中如何将一个模块的列表型输出传递至另一个模块的变量?
在Terraform中传递列表型模块输出到另一个模块变量的正确方式
嘿,我来帮你搞定这个问题。在Terraform里把一个模块的列表输出传给另一个模块的变量其实非常直接,但要避开一个常见的小坑——不要做多余的嵌套,不然会导致类型不匹配。
第一步:确认源模块的输出是正确的列表类型
你提到的vpc_utility模块已经正确定义了列表类型的输出,这部分没问题:
# module1/outputs.tf output "vpc_id" { description = "The ID of the VPC" value = module.vpc_utility.vpc_id } output "private_subnets" { description = "List of IDs of private subnets" value = module.vpc_utility.private_subnets # 这个输出本身就是列表类型 }
第二步:确保目标模块的变量类型匹配
在module2/vars.tf里,你需要把接收的变量定义为列表类型,这样才能正确接收传递过来的值:
# module2/vars.tf variable "vpc_id" { description = "ID of the VPC to use" type = string } variable "private_subnets" { description = "List of private subnet IDs for resources" type = list(string) # Terraform 0.12+ 推荐用这种类型定义;旧版可以写 type = "list" }
第三步:正确传递列表输出(重点!)
你当前在thing.tf里的写法有个小问题:
# 错误写法 private_subnets = ["${module.vpc_utility.private_subnets}"]
这种写法会把原本的列表转换成一个包含单个字符串元素的新列表(相当于把原列表序列化成了字符串),导致模块2收到的变量类型不符合预期。
正确的做法是直接引用源模块的输出,不需要额外加方括号:
# thing.tf 正确写法 module "module2" { source = "./module2" vpc_id = module.vpc_utility.vpc_id # Terraform 0.12+ 可以省略插值语法${},直接引用 private_subnets = module.vpc_utility.private_subnets }
这样传递的就是原封不动的列表类型,模块2能完美接收。
小技巧:验证类型是否正确
如果你不确定传递的类型是否正确,可以用terraform console命令进入交互式控制台,输入module.vpc_utility.private_subnets查看它的类型,再输入module.module2.private_subnets确认传递后的类型是否一致。
内容的提问来源于stack exchange,提问作者TheRedSeth
相关产品推荐
相关产品推荐

