diff --git a/terraform/modules/pve_vm/main.tf b/terraform/modules/pve_vm/main.tf index 2255f6e..06b02ef 100644 --- a/terraform/modules/pve_vm/main.tf +++ b/terraform/modules/pve_vm/main.tf @@ -1,92 +1,109 @@ +# Retrieve VM templates available in Proxmox that match the specified name data "proxmox_virtual_environment_vms" "template" { filter { name = "name" - values = ["${var.vm_template}"] + values = ["${var.vm_template}"] # The name of the template to clone from } } +# Create a cloud-init configuration file as a Proxmox snippet resource "proxmox_virtual_environment_file" "cloud_config" { - content_type = "snippets" - datastore_id = "local" - node_name = var.node_name + content_type = "snippets" # Cloud-init files are stored as snippets in Proxmox + datastore_id = "local" # Local datastore used to store the snippet + node_name = var.node_name # The Proxmox node where the file will be uploaded + source_raw { - file_name = "${var.vm_name}.cloud-config.yaml" + file_name = "vm.cloud-config.yaml" # The name of the snippet file data = <<-EOF #cloud-config hostname: ${var.vm_name} package_update: true package_upgrade: true packages: - - qemu-guest-agent + - qemu-guest-agent # Ensures the guest agent is installed users: - default - name: ${var.vm_user} groups: sudo shell: /bin/bash ssh-authorized-keys: - - "${var.vm_user_sshkey}" + - "${var.vm_user_sshkey}" # Inject user's SSH key sudo: ALL=(ALL) NOPASSWD:ALL runcmd: - systemctl enable qemu-guest-agent - - reboot + - reboot # Reboot the VM after provisioning EOF } } +# Define and provision a new VM by cloning the template and applying initialization resource "proxmox_virtual_environment_vm" "vm" { - name = var.vm_name - node_name = var.node_name - tags = var.vm_tags + name = var.vm_name # VM name + node_name = var.node_name # Proxmox node to deploy the VM + tags = var.vm_tags # Optional VM tags for categorization + agent { - enabled = true + enabled = true # Enable the QEMU guest agent } - stop_on_destroy = true + + stop_on_destroy = true # Ensure VM is stopped gracefully when destroyed + clone { - vm_id = data.proxmox_virtual_environment_vms.template.vms[0].vm_id - node_name = data.proxmox_virtual_environment_vms.template.vms[0].node_name + vm_id = data.proxmox_virtual_environment_vms.template.vms[0].vm_id # ID of the source template + node_name = data.proxmox_virtual_environment_vms.template.vms[0].node_name # Node of the source template } - bios = var.vm_bios - machine = var.vm_machine + + bios = var.vm_bios # BIOS type (e.g., seabios or ovmf) + machine = var.vm_machine # Machine type (e.g., q35) + cpu { - cores = var.vm_cpu - type = "host" + cores = var.vm_cpu # Number of CPU cores + type = "host" # Use host CPU type for best compatibility/performance } + memory { - dedicated = var.vm_ram + dedicated = var.vm_ram # RAM in MB } + disk { - datastore_id = var.node_datastore - interface = "scsi0" - size = 4 + datastore_id = var.node_datastore # Datastore to hold the disk + interface = "scsi0" # Primary disk interface + size = 4 # Disk size in GB } + initialization { - user_data_file_id = proxmox_virtual_environment_file.cloud_config.id + user_data_file_id = proxmox_virtual_environment_file.cloud_config.id # Link the cloud-init file datastore_id = var.node_datastore - interface = "scsi1" + interface = "scsi1" # Separate interface for cloud-init ip_config { ipv4 { - address = "dhcp" + address = "dhcp" # Get IP via DHCP } } } + network_device { - bridge = "vmbr0" - vlan_id = var.vm_vlan + bridge = "vmbr0" # Use the default bridge + vlan_id = var.vm_vlan # VLAN tagging if used } + operating_system { - type = "l26" + type = "l26" # Linux 2.6+ kernel } + vga { - type = "std" + type = "std" # Standard VGA type } + lifecycle { - ignore_changes = [ + ignore_changes = [ # Ignore initialization section after first depoloyment for idempotency initialization ] } } +# Output the assigned IP address of the VM after provisioning output "vm_ip" { - value = proxmox_virtual_environment_vm.vm.ipv4_addresses[1][0] + value = proxmox_virtual_environment_vm.vm.ipv4_addresses[1][0] # Second network interface's first IP description = "VM IP" -} +} \ No newline at end of file diff --git a/terraform/modules/pve_vm/provider.tf b/terraform/modules/pve_vm/provider.tf index 518dd4c..e5901a2 100644 --- a/terraform/modules/pve_vm/provider.tf +++ b/terraform/modules/pve_vm/provider.tf @@ -5,14 +5,3 @@ terraform { } } } - -provider "proxmox" { - endpoint = var.proxmox_endpoint - api_token = var.proxmox_api_token - insecure = false - ssh { - agent = false - private_key = file("~/.ssh/id_ed25519") - username = "root" - } -} diff --git a/terraform/modules/pve_vm/variables.tf b/terraform/modules/pve_vm/variables.tf index fe3f64a..16708f9 100644 --- a/terraform/modules/pve_vm/variables.tf +++ b/terraform/modules/pve_vm/variables.tf @@ -1,15 +1,3 @@ - -variable "proxmox_endpoint" { - description = "Proxmox URL endpoint" - type = string -} - -variable "proxmox_api_token" { - description = "Proxmox API token" - type = string - sensitive = true -} - variable "node_name" { description = "Proxmox host for the VM" type = string diff --git a/terraform/projects/multiple-vm/main.tf b/terraform/projects/multiple-vm/main.tf index b02d419..5d845bc 100644 --- a/terraform/projects/multiple-vm/main.tf +++ b/terraform/projects/multiple-vm/main.tf @@ -6,25 +6,20 @@ module "pve_vm" { vm_cpu = each.value.vm_cpu vm_ram = each.value.vm_ram vm_vlan = each.value.vm_vlan + proxmox_endpoint = var.proxmox_endpoint + proxmox_api_token = var.proxmox_api_token } locals { - vm_attr = { - "master" = { ram = 2048, cpu = 2, vlan = 66 } - "worker" = { ram = 1024, cpu = 1, vlan = 66 } - } - vm_list = { for vm in flatten([ - for node in data.proxmox_virtual_environment_nodes.pve_nodes.names : [ - for role, config in local.vm_attr : { - node_name = node - vm_name = "${role}-${node}" - vm_cpu = config.cpu - vm_ram = config.ram - vm_vlan = config.vlan - } - ] + for node in data.proxmox_virtual_environment_nodes.pve_nodes.names : { + node_name = node + vm_name = "${role}-${node}" + vm_cpu = config.cpu + vm_ram = config.ram + vm_vlan = config.vlan + } ]) : vm.vm_name => vm } } diff --git a/terraform/projects/simple-vm-with-module/main.tf b/terraform/projects/simple-vm-with-module/main.tf index 9efae02..6fa4d1a 100644 --- a/terraform/projects/simple-vm-with-module/main.tf +++ b/terraform/projects/simple-vm-with-module/main.tf @@ -5,8 +5,6 @@ module "pve_vm" { vm_cpu = 2 vm_ram = 2048 vm_vlan = 66 - proxmox_endpoint = var.proxmox_endpoint - proxmox_api_token = var.proxmox_api_token } output "vm_ip" { diff --git a/terraform/projects/simple-vm-with-module/provider.tf b/terraform/projects/simple-vm-with-module/provider.tf new file mode 100644 index 0000000..518dd4c --- /dev/null +++ b/terraform/projects/simple-vm-with-module/provider.tf @@ -0,0 +1,18 @@ +terraform { + required_providers { + proxmox = { + source = "bpg/proxmox" + } + } +} + +provider "proxmox" { + endpoint = var.proxmox_endpoint + api_token = var.proxmox_api_token + insecure = false + ssh { + agent = false + private_key = file("~/.ssh/id_ed25519") + username = "root" + } +}