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

如何在Terraform中按节点名称为Rancher集群配置不同动态磁盘

在vSphere上通过Terraform实现Rancher集群节点差异化磁盘配置

需求说明

需在vSphere部署多套Rancher集群,要求:

  • 每个Master节点添加1块60GB磁盘
  • 每个Worker节点添加2块磁盘(100GB+350GB)
  • 通过Terraform动态配置实现,不修改克隆模板

现有配置

terraform.tfvars 定义节点与磁盘参数

master_nodes = ["master101","master102","master103"]

worker_nodes = ["worker101","worker102","worker103","worker104","worker105","worker106"]

master_disks = [
  {
    number = 1
    size   = 60
  }
]

worker_disks = [
  {
    number = 1
    size   = 100
  },
  {
    number = 2
    size   = 350
  }
]

main.tf 现有磁盘配置代码(仅支持Worker节点)

dynamic "disk" {
  for_each = [
    for d in var.worker_disks : d
    if length(regexall("worker.*", each.value.name)) > 0
  ]
  content {
    label       = "disk${disk.value["number"]}"
    size        = disk.value["size"]
    unit_number = disk.value["number"]
  }
}

本地cluster_nodes数据结构

[root@dev-vm1011 terraform_k8s]# ./terraform console
> local.cluster_nodes
{
  "master_nodes-master_vm1" = {
    "name" = "master101"
    "node_key" = "master_nodes"
    "sub_node_key" = "master_vm1"
    "vcpu" = ""
    "vm_ip" = "192.168.50.66"
  }
  "master_nodes-master_vm2" = {
    "name" = "master102"
    "node_key" = "master_nodes"
    "sub_node_key" = "master_vm2"
    "vcpu" = ""
    "vm_ip" = "192.168.50.77"
  }
  "master_nodes-master_vm3" = {
    "name" = "master103"
    "node_key" = "master_nodes"
    "sub_node_key" = "master_vm3"
    "vcpu" = ""
    "vm_ip" = "192.168.50.88"
  }
  "worker_nodes-worker_vm1" = {
    "name" = "worker101"
    "node_key" = "worker_nodes"
    "sub_node_key" = "worker_vm1"
    "vcpu" = "4"
    "vm_ip" = "192.168.50.99"
  }
  "worker_nodes-worker_vm2" = {
    "name" = "worker102"
    "node_key" = "worker_nodes"
    "sub_node_key" = "worker_vm2"
    "vcpu" = "4"
    "vm_ip" = "192.168.50.103"
  }
  "worker_nodes-worker_vm3" = {
    "name" = "worker103"
    "node_key" = "worker_nodes"
    "sub_node_key" = "worker_vm3"
    "vcpu" = "2"
    "vm_ip" = "192.168.50.104"
  }
}

解决方案

可以通过两种方式实现差异化配置:

方式1:新增Master节点专属动态磁盘块

在main.tf中保留原Worker节点配置的同时,添加针对Master节点的动态磁盘块:

# 为Master节点配置动态磁盘
dynamic "disk" {
  for_each = [
    for d in var.master_disks : d
    if length(regexall("master.*", each.value.name)) > 0
  ]
  content {
    label       = "disk${disk.value["number"]}"
    size        = disk.value["size"]
    unit_number = disk.value["number"]
  }
}

# 为Worker节点配置动态磁盘
dynamic "disk" {
  for_each = [
    for d in var.worker_disks : d
    if length(regexall("worker.*", each.value.name)) > 0
  ]
  content {
    label       = "disk${disk.value["number"]}"
    size        = disk.value["size"]
    unit_number = disk.value["number"]
  }
}

方式2:利用node_key统一判断(更优雅)

借助local.cluster_nodes中的node_key字段(直接标识节点类型),合并配置逻辑,避免重复代码:

dynamic "disk" {
  for_each = merge(
    each.value.node_key == "master_nodes" ? var.master_disks : [],
    each.value.node_key == "worker_nodes" ? var.worker_disks : []
  )
  content {
    label       = "disk${disk.value["number"]}"
    size        = disk.value["size"]
    unit_number = disk.value["number"]
  }
}

验证

执行terraform plan或terraform console查看生成的资源配置,确认Master节点生成1块60GB磁盘,Worker节点生成100GB和350GB两块磁盘。

内容的提问来源于stack exchange,提问作者johnny bravo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 03:38:12