Feat/deploy k8s vms #8
@@ -32,15 +32,19 @@ locals {
|
|||||||
# Per-role simple overrides merged over vm_attr defaults (null keeps the default)
|
# Per-role simple overrides merged over vm_attr defaults (null keeps the default)
|
||||||
role_overrides = {
|
role_overrides = {
|
||||||
for role, cfg in var.vm_attr : role => lookup({
|
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 }
|
"master" = { count = var.master_count, 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 }
|
"worker" = { count = var.worker_count, ram = var.worker_ram != null ? var.worker_ram * 1024 : null, cpu = var.worker_cpu, vlan = var.worker_vlan }
|
||||||
}, role, {})
|
}, 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 = {
|
effective_vm_attr = {
|
||||||
for role, cfg in var.vm_attr : role => merge(cfg, {
|
for role, cfg in var.vm_attr : role => merge(cfg, {
|
||||||
for attr, value in local.role_overrides[role] : attr => value if value != null
|
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
|
# Control plane (max_per_node = 1): one VM per node, only on nodes with enough free memory
|
||||||
|
|||||||
@@ -22,32 +22,32 @@ variable "proxmox_ssh_password" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
variable "vm_attr" {
|
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({
|
type = map(object({
|
||||||
ram = number
|
ram = number
|
||||||
cpu = number
|
cpu = number
|
||||||
vlan = number
|
vlan = number
|
||||||
count = number
|
count = number
|
||||||
max_per_node = number
|
|
||||||
}))
|
}))
|
||||||
default = {
|
default = {
|
||||||
"master" = { ram = 2048, cpu = 2, vlan = 66, count = 3, max_per_node = 1 }
|
"master" = { ram = 2048, cpu = 2, vlan = 66, count = 3 }
|
||||||
"worker" = { ram = 4096, cpu = 2, vlan = 66, count = 3, max_per_node = 0 }
|
"worker" = { ram = 4096, cpu = 2, vlan = 66, count = 3 }
|
||||||
}
|
}
|
||||||
|
|
||||||
validation {
|
validation {
|
||||||
condition = alltrue([for v in values(var.vm_attr) : v.count >= 1])
|
condition = alltrue([for v in values(var.vm_attr) : v.count >= 1])
|
||||||
error_message = "Each role must deploy at least 1 VM."
|
error_message = "Each role must deploy at least 1 VM."
|
||||||
}
|
}
|
||||||
|
|
||||||
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."
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
variable "master_count" {
|
||||||
|
description = "Master role VM count override. null keeps the vm_attr default."
|
||||||
|
type = number
|
||||||
|
default = null
|
||||||
|
|
||||||
validation {
|
validation {
|
||||||
condition = length([for v in values(var.vm_attr) : v if v.max_per_node == 1]) == 1
|
condition = var.master_count == null || var.master_count >= 1
|
||||||
error_message = "Exactly one role must have max_per_node = 1 (the control-plane role)."
|
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" {
|
variable "worker_cpu" {
|
||||||
description = "Worker role CPU override. null keeps the vm_attr default."
|
description = "Worker role CPU override. null keeps the vm_attr default."
|
||||||
type = number
|
type = number
|
||||||
|
|||||||
Reference in New Issue
Block a user