Terraform中基于列表变量创建并扩展map(any)类型vms变量
Terraform 动态生成并扩展vms映射变量
问题背景
现有不可修改的Terraform变量定义如下:
variable vms { description = "Individual VM settings, like ip address and master/worker" type = map(any) default = null }
需求:
- 从其他列表变量中提取IP地址,计算得到
master的布尔值,生成如下结构的映射:
vms = { m1 = { ip_address = "172.16.201.1" master = true } w1 = { ip_address = "172.16.201.2" master = false } }
- 后续如何向已生成的映射中添加
m3这类新元素?
实现方案
1. 动态生成初始vms映射
先定义存储主、工作节点IP的列表变量,再通过Terraform的for表达式和merge函数构建目标结构:
步骤1:定义输入IP列表
# 主节点IP列表 variable master_ips { type = list(string) default = ["172.16.201.1"] } # 工作节点IP列表 variable worker_ips { type = list(string) default = ["172.16.201.2"] }
步骤2:用本地值构建vms结构
通过for表达式分别生成主、工作节点的子映射,再用merge合并为最终结构:
locals { # 生成主节点映射,键命名为m1、m2... master_vms = { for idx, ip in var.master_ips : "m${idx + 1}" => { ip_address = ip master = true } } # 生成工作节点映射,键命名为w1、w2... worker_vms = { for idx, ip in var.worker_ips : "w${idx + 1}" => { ip_address = ip master = false } } # 合并生成最终vms结构 vms = merge(local.master_vms, local.worker_vms) }
后续在资源或模块中直接引用local.vms即可;如果原vms是模块输入,调用模块时传递vms = local.vms。
2. 向现有映射添加新元素
利用merge函数的合并特性,将原有映射与新元素的映射合并即可:
方式1:添加单个元素
locals { # 在原有vms基础上添加m3节点 vms_updated = merge(local.vms, { m3 = { ip_address = "172.16.201.3" master = true } }) }
方式2:批量添加多个元素
定义额外变量存储新节点配置,再合并到原有结构:
# 新节点配置变量 variable new_vms { type = map(object({ ip_address = string master = bool })) default = { m3 = { ip_address = "172.16.201.3" master = true }, w2 = { ip_address = "172.16.201.4" master = false } } } locals { # 合并原有vms与新节点 vms_updated = merge(local.vms, var.new_vms) }
内容的提问来源于stack exchange,提问作者Peter Talen
相关产品推荐
相关产品推荐

