From d6ae654a80ca80a0d67dd53ad66583f34a9fde8f Mon Sep 17 00:00:00 2001 From: Vezpi Date: Sat, 12 Sep 2026 11:17:07 +0000 Subject: [PATCH] add: master and worker count --- terraform/projects/kubernetes_vms/main.tf | 10 +++-- .../projects/kubernetes_vms/variables.tf | 41 ++++++++++++------- 2 files changed, 33 insertions(+), 18 deletions(-) diff --git a/terraform/projects/kubernetes_vms/main.tf b/terraform/projects/kubernetes_vms/main.tf index 32d4d67..a78a3b3 100644 --- a/terraform/projects/kubernetes_vms/main.tf +++ b/terraform/projects/kubernetes_vms/main.tf @@ -32,15 +32,19 @@ locals { # Per-role simple overrides merged over vm_attr defaults (null keeps the default) role_overrides = { for role, cfg in var.vm_attr : role => lookup({ - "master" = { ram = var.master_ram != null ? var.master_ram * 1024 : null, cpu = var.master_cpu, vlan = var.master_vlan } - "worker" = { ram = var.worker_ram != null ? var.worker_ram * 1024 : null, cpu = var.worker_cpu, vlan = var.worker_vlan } + "master" = { count = var.master_count, ram = var.master_ram != null ? var.master_ram * 1024 : null, cpu = var.master_cpu, vlan = var.master_vlan } + "worker" = { count = var.worker_count, ram = var.worker_ram != null ? var.worker_ram * 1024 : null, cpu = var.worker_cpu, vlan = var.worker_vlan } }, role, {}) } + # Internal placement rule: the control-plane role (master) sits one per node, pack roles are unlimited + cp_role_name = "master" + role_max_per_node = { for role, cfg in var.vm_attr : role => role == local.cp_role_name ? 1 : 0 } + effective_vm_attr = { for role, cfg in var.vm_attr : role => merge(cfg, { for attr, value in local.role_overrides[role] : attr => value if value != null - }) + }, { max_per_node = local.role_max_per_node[role] }) } # Control plane (max_per_node = 1): one VM per node, only on nodes with enough free memory diff --git a/terraform/projects/kubernetes_vms/variables.tf b/terraform/projects/kubernetes_vms/variables.tf index f3ce432..fff808f 100644 --- a/terraform/projects/kubernetes_vms/variables.tf +++ b/terraform/projects/kubernetes_vms/variables.tf @@ -22,32 +22,32 @@ variable "proxmox_ssh_password" { } variable "vm_attr" { - description = "VM attributes per role. max_per_node = 0 means unlimited VMs per node." + description = "VM attributes per role. The control-plane role (master) is placed one per node; other roles are packed without a per-node limit." type = map(object({ - ram = number - cpu = number - vlan = number - count = number - max_per_node = number + ram = number + cpu = number + vlan = number + count = number })) default = { - "master" = { ram = 2048, cpu = 2, vlan = 66, count = 3, max_per_node = 1 } - "worker" = { ram = 4096, cpu = 2, vlan = 66, count = 3, max_per_node = 0 } + "master" = { ram = 2048, cpu = 2, vlan = 66, count = 3 } + "worker" = { ram = 4096, cpu = 2, vlan = 66, count = 3 } } validation { condition = alltrue([for v in values(var.vm_attr) : v.count >= 1]) error_message = "Each role must deploy at least 1 VM." } +} + +variable "master_count" { + description = "Master role VM count override. null keeps the vm_attr default." + type = number + default = null validation { - condition = alltrue([for v in values(var.vm_attr) : v.max_per_node >= 0]) - error_message = "max_per_node must be 0 (unlimited) or a positive number." - } - - validation { - condition = length([for v in values(var.vm_attr) : v if v.max_per_node == 1]) == 1 - error_message = "Exactly one role must have max_per_node = 1 (the control-plane role)." + condition = var.master_count == null || var.master_count >= 1 + error_message = "master_count must be null or at least 1." } } @@ -84,6 +84,17 @@ variable "master_vlan" { } } +variable "worker_count" { + description = "Worker role VM count override. null keeps the vm_attr default." + type = number + default = null + + validation { + condition = var.worker_count == null || var.worker_count >= 1 + error_message = "worker_count must be null or at least 1." + } +} + variable "worker_cpu" { description = "Worker role CPU override. null keeps the vm_attr default." type = number