You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform中基于列表变量创建并扩展map(any)类型vms变量

Terraform 动态生成并扩展vms映射变量

问题背景

现有不可修改的Terraform变量定义如下:

variable vms {
  description = "Individual VM settings, like ip address and master/worker"
  type        = map(any)
  default     = null
}

需求:

  1. 从其他列表变量中提取IP地址,计算得到master的布尔值,生成如下结构的映射:
vms = {
  m1 = {
    ip_address = "172.16.201.1"
    master     = true
  }
  w1 = {
    ip_address = "172.16.201.2"
    master     = false
  }
}
  1. 后续如何向已生成的映射中添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 06:52:36