如何在Terraform中复用变量蓝图,避免变量声明代码重复?
Terraform 复用变量蓝图实现多实例的方案
核心思路
不用重复声明同类型变量,而是将变量定义为集合类型(list(object) 或 map(object)),一次性容纳多个同结构的实例,从根本上解决代码重复问题。HCL完全支持这种写法。
方案1:使用 list(object) 类型变量
适合不需要给每个实例设置唯一标识键的场景。
1. 修改 variables.tf
定义一个可容纳多个项目信息的列表变量:
variable "project_infos" { type = list(object({ name = string id = string })) description = "存储多个项目的基础信息" }
2. 配置 variables.tfvars
用数组格式填入多个实例:
project_infos = [ { name = "prj-1" id = "prj-1-192388" }, { name = "prj-2" id = "prj-2-120917" } ]
3. 在 main.tf 中实例化资源
用 count 遍历列表创建资源:
# 示例:根据实际资源类型调整 resource "your_resource_type" "projects" { count = length(var.project_infos) name = var.project_infos[count.index].name id = var.project_infos[count.index].id }
方案2:使用 map(object) 类型变量
适合需要给每个实例设置唯一标识键的场景(更贴合你原本的 project_1_info 命名习惯)。
1. 修改 variables.tf
定义一个以项目标识为键、项目信息为值的映射变量:
variable "project_infos" { type = map(object({ name = string id = string })) description = "以项目标识为键,存储多个项目的基础信息" }
2. 配置 variables.tfvars
用键值对格式填入多个实例,键可自定义:
project_infos = { project_1_info = { name = "prj-1" id = "prj-1-192388" } project_2_info = { name = "prj-2" id = "prj-2-120917" } }
3. 在 main.tf 中实例化资源
用 for_each 遍历映射创建资源(推荐此方式,键唯一稳定,避免列表顺序变化导致资源重建):
# 示例:根据实际资源类型调整 resource "your_resource_type" "projects" { for_each = var.project_infos name = each.value.name id = each.value.id }
关键优势
- 避免重复声明同结构变量,提升代码可维护性
- 新增实例只需在
variables.tfvars中添加条目,无需修改变量定义 for_each方式确保资源实例与变量键绑定,变更更安全
内容的提问来源于stack exchange,提问作者Imad
相关产品推荐
相关产品推荐

