From 9ec3412c2d5be6aebb37859a8705d8541aa9b999 Mon Sep 17 00:00:00 2001 From: hrmny <8845940+ForsakenHarmony@users.noreply.github.com> Date: Wed, 19 Mar 2025 10:48:00 +0100 Subject: [PATCH] feat: support multiple disk per vm --- modules/vm/main.tf | 27 +++++++++++++++------------ modules/vm/variables.tf | 18 +++++++++++++----- proxmox/100-home-assistant.tf | 11 ++++++----- proxmox/101-docker.tf | 7 +++---- proxmox/102-netboot.tf | 7 +++---- proxmox/103-kristall-miai-vm.tf | 7 +++---- proxmox/104-cbtelbot.tf | 7 +++---- proxmox/105-mecci.tf | 7 +++---- proxmox/106-streaming.tf | 7 +++---- proxmox/107-ci-runners.tf | 7 +++---- proxmox/108-cwace.tf | 7 +++---- 11 files changed, 58 insertions(+), 54 deletions(-) diff --git a/modules/vm/main.tf b/modules/vm/main.tf index b0efdb4..e008a8f 100644 --- a/modules/vm/main.tf +++ b/modules/vm/main.tf @@ -54,22 +54,25 @@ resource "proxmox_virtual_environment_vm" "vm" { scsi_hardware = "virtio-scsi-single" # data disk - disk { - size = var.disk.size - datastore_id = var.disk.storage + dynamic "disk" { + for_each = var.disks + content { + size = disk.value["size_gb"] + datastore_id = disk.value["storage"] - file_format = "raw" + file_format = "raw" - interface = "scsi0" + interface = "scsi0" - iothread = true - ssd = true - discard = "on" + iothread = true + ssd = true + discard = "on" + } } # efi disk efi_disk { - datastore_id = var.disk.storage + datastore_id = var.disks[0].storage type = "4m" } @@ -88,16 +91,16 @@ resource "proxmox_virtual_environment_vm" "vm" { dynamic "clone" { for_each = var.clone != null ? [var.clone] : [] content { - datastore_id = var.disk.storage + datastore_id = var.disks[0].storage vm_id = clone.value } } initialization { - datastore_id = var.disk.storage + datastore_id = var.disks[0].storage # this is necessary when using machine type q35 or ovmf bios - interface = "scsi1" + interface = "scsi23" user_account { password = random_password.default_root_password.result diff --git a/modules/vm/variables.tf b/modules/vm/variables.tf index aaea8d8..6ee6047 100644 --- a/modules/vm/variables.tf +++ b/modules/vm/variables.tf @@ -45,12 +45,16 @@ variable "memory" { description = "how much memory should be available to the VM" } -variable "disk" { - type = object({ - size = string +variable "disks" { + type = list(object({ + size_gb = number storage = string - }) - description = "the disk size and storage" + })) + description = "sizes and storage for all disks" + validation { + condition = length(var.disks) != 0 + error_message = "should have at least one disk configured" + } } variable "network" { @@ -78,6 +82,10 @@ variable "admins" { username = string ssh_key = string })) + validation { + condition = length(var.admins) != 0 + error_message = "should have at least one admin configured" + } } variable "template" { diff --git a/proxmox/100-home-assistant.tf b/proxmox/100-home-assistant.tf index d29d916..58e634f 100644 --- a/proxmox/100-home-assistant.tf +++ b/proxmox/100-home-assistant.tf @@ -9,11 +9,12 @@ module "home_assistant_vm" { cores = 4 memory = 8192 - disk = { - // gigabytes - size = 64 - storage = var.storage.disk - } + disks = [ + { + size_gb = 64 + storage = var.storage.disk + } + ] network = { bridge = var.network.bridge diff --git a/proxmox/101-docker.tf b/proxmox/101-docker.tf index 5f8e139..1e65c62 100644 --- a/proxmox/101-docker.tf +++ b/proxmox/101-docker.tf @@ -11,11 +11,10 @@ module "docker_vm" { cores = 4 memory = 8192 - disk = { - // gigabytes - size = 64 + disks = [{ + size_gb = 64 storage = var.storage.disk - } + }] network = { bridge = var.network.bridge diff --git a/proxmox/102-netboot.tf b/proxmox/102-netboot.tf index d6294d2..d02d505 100644 --- a/proxmox/102-netboot.tf +++ b/proxmox/102-netboot.tf @@ -11,11 +11,10 @@ module "netboot_vm" { cores = 1 memory = 2048 - disk = { - // gigabytes - size = 48 + disks = [{ + size_gb = 48 storage = var.storage.disk - } + }] network = { bridge = var.network.bridge diff --git a/proxmox/103-kristall-miai-vm.tf b/proxmox/103-kristall-miai-vm.tf index 4bd584c..702da19 100644 --- a/proxmox/103-kristall-miai-vm.tf +++ b/proxmox/103-kristall-miai-vm.tf @@ -11,11 +11,10 @@ module "kristall-miai_vm" { cores = 6 memory = 36864 - disk = { - // gigabytes - size = 15 + disks = [{ + size_gb = 15 storage = var.storage.disk - } + }] network = { bridge = var.network.bridge diff --git a/proxmox/104-cbtelbot.tf b/proxmox/104-cbtelbot.tf index 26e6a6c..e6a4707 100644 --- a/proxmox/104-cbtelbot.tf +++ b/proxmox/104-cbtelbot.tf @@ -11,11 +11,10 @@ module "cbtelbot_vm" { cores = 1 memory = 1024 - disk = { - // gigabytes - size = 48 + disks = [{ + size_gb = 48 storage = var.storage.disk - } + }] network = { bridge = var.network.bridge diff --git a/proxmox/105-mecci.tf b/proxmox/105-mecci.tf index 27a9390..6f970bd 100644 --- a/proxmox/105-mecci.tf +++ b/proxmox/105-mecci.tf @@ -11,11 +11,10 @@ module "mecci_vm" { cores = 4 memory = 8192 - disk = { - // gigabytes - size = 64 + disks = [{ + size_gb = 64 storage = var.storage.disk - } + }] network = { bridge = var.network.bridge diff --git a/proxmox/106-streaming.tf b/proxmox/106-streaming.tf index 261f344..14cb615 100644 --- a/proxmox/106-streaming.tf +++ b/proxmox/106-streaming.tf @@ -11,11 +11,10 @@ module "streaming_vm" { cores = 2 memory = 4096 - disk = { - // gigabytes - size = 32 + disks = [{ + size_gb = 32 storage = var.storage.disk - } + }] network = { bridge = var.network.bridge diff --git a/proxmox/107-ci-runners.tf b/proxmox/107-ci-runners.tf index 34f393e..3260f5e 100644 --- a/proxmox/107-ci-runners.tf +++ b/proxmox/107-ci-runners.tf @@ -12,11 +12,10 @@ module "ci_runners_vm" { memory = 4096 weight = 128 - disk = { - // gigabytes - size = 32 + disks = [{ + size_gb = 32 storage = var.storage.disk - } + }] network = { bridge = var.network.bridge diff --git a/proxmox/108-cwace.tf b/proxmox/108-cwace.tf index 2edc130..a650967 100644 --- a/proxmox/108-cwace.tf +++ b/proxmox/108-cwace.tf @@ -11,11 +11,10 @@ module "cwace" { clone = data.proxmox_virtual_environment_vm.debian_cloud_vm_template.vm_id - disk = { - // gigabytes - size = 32 + disks = [{ + size_gb = 32 storage = var.storage.disk - } + }] network = { bridge = var.network.bridge