如何在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
相关产品推荐
相关产品推荐

