diff --git a/terraform/main.tf b/terraform/main.tf index c337a79..751fa6b 100644 --- a/terraform/main.tf +++ b/terraform/main.tf @@ -20,7 +20,7 @@ locals { module "vm-n8n" { for_each = local.instance_map - source = "./modules/proxmox_ubuntu_cloudinit_template" + source = "./modules/proxmox_ubuntu_cloudinit_clone" vm_name = each.value.vm_name node_name = each.value.node_name diff --git a/terraform/modules/proxmox_ubuntu_cloudinit_clone/main.tf b/terraform/modules/proxmox_ubuntu_cloudinit_clone/main.tf new file mode 100644 index 0000000..47f4797 --- /dev/null +++ b/terraform/modules/proxmox_ubuntu_cloudinit_clone/main.tf @@ -0,0 +1,123 @@ +locals { + selected_instance = one([ + for cfg in var.instance_configs : + cfg if cfg.crispy_name == var.node_name + ]) +} + +resource "proxmox_virtual_environment_file" "cloud_config" { + content_type = "snippets" + datastore_id = "local" + node_name = "pop" + + source_raw { + 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 + + system_info: + default_user: + groups: [ docker ] + + users: + - default + - name: cloud + groups: + - sudo + - docker + shell: /bin/bash + ssh-authorized-keys: + - "${var.vm_user_sshkey}" # Inject user's SSH key + sudo: ALL=(ALL) NOPASSWD:ALL + + packages: + - qemu-guest-agent + - apt-transport-https + - ca-certificates + - curl + - gnupg + - lsb-release + - unattended-upgrades + + runcmd: + - systemctl enable qemu-guest-agent + - mkdir -p /etc/apt/keyrings + - curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg + - echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null + - apt-get update + - apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin + - systemctl enable docker + - systemctl start docker + - reboot + EOF + } +} + +resource "proxmox_virtual_environment_vm" "ubuntu_22_minimal_template" { + 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 # Enable the QEMU guest agent + } + + stop_on_destroy = true # Ensure VM is stopped gracefully when destroyed + + + clone { + vm_id = local.selected_instance.vmid # ID of the source template + node_name = local.selected_instance.crispy_name # Node of the source template + } + + 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 # Number of CPU cores + type = "host" # Use host CPU type for best compatibility/performance + } + + memory { + dedicated = var.vm_ram # RAM in MB + } + + disk { + datastore_id = var.node_datastore # Datastore to hold the disk + interface = "scsi0" # Primary disk interface + size = var.vm_size + } + + + initialization { + user_data_file_id = proxmox_virtual_environment_file.cloud_config.id # Link the cloud-init file + datastore_id = var.node_datastore + interface = "scsi1" # Separate interface for cloud-init + ip_config { + ipv4 { + address = "dhcp" # Get IP via DHCP + } + } + } + + network_device { + bridge = var.bridge # Use the default bridge + } + + lifecycle { + ignore_changes = [ # Ignore initialization section after first depoloyment for idempotency + initialization + ] + } +} + + + + + + + diff --git a/terraform/modules/proxmox_ubuntu_cloudinit_clone/output.tf b/terraform/modules/proxmox_ubuntu_cloudinit_clone/output.tf new file mode 100644 index 0000000..7158cf7 --- /dev/null +++ b/terraform/modules/proxmox_ubuntu_cloudinit_clone/output.tf @@ -0,0 +1,3 @@ +output "vm_ipv4_address" { + value = proxmox_virtual_environment_vm.ubuntu_vm.ipv4_addresses[1][0] +} \ No newline at end of file diff --git a/terraform/modules/proxmox_ubuntu_cloudinit_clone/variables.tf b/terraform/modules/proxmox_ubuntu_cloudinit_clone/variables.tf new file mode 100644 index 0000000..2823e67 --- /dev/null +++ b/terraform/modules/proxmox_ubuntu_cloudinit_clone/variables.tf @@ -0,0 +1,140 @@ +variable "pm_api_url" { default = "https://192.168.10.201:8006/api2/json" } +variable "pm_api_token" { default = "terraform@pve!provider=760580c4-5c1f-462b-986a-dd244c6c95f2" } + +variable "storage" { default = "hlst" } +variable "bridge" { default = "vmbr0" } + +variable "os_type" { + default = "alpine" +} + +variable "instance_configs" { + type = list(object({ + crispy_name = string + vmid = string + })) + default = [ + { crispy_name = "snap", vmid = "9002" }, + { crispy_name = "crackle", vmid = "9000" }, + { crispy_name = "pop", vmid = "9001" } + ] +} + +variable "clone_count" { + type = number + default = 1 +} + +variable "vm_count" { default = 1 } +variable "name_prefix" { default = "dev" } +variable "vm_ram" { default = 2048 } +variable "vm_cpu" { default = 1 } +variable "vm_size" { default = 10 } +variable "vm_bios" { + description = "Type of BIOS used for the VM" + type = string + default = "ovmf" +} + +variable "vm_machine" { + description = "Type of machine used for the VM" + type = string + default = "q35" +} + +variable "vm_tags" { + description = "Tags for the VM" + type = list(any) + default = ["test", "terraform"] +} + +variable "ipconfig0" { default = "ip=dhcp" } + +variable "access_key" { + type = string + default = "GK242d456c0692a9d4cc102206" +} + +variable "secret_key" { + type = string + default = "1d7e22b7a8892cb11b569017659aa511b37b53287c4d1699c310d9f8ac76df09" +} + +variable "region" { + type = string + default = "garage" +} + +variable "endpoints_s3" { + type = string + description = "S3 endpoint" + default = "http://192.168.10.109:3909" +} + +variable "skip_credentials_validation" { + type = bool + default = true +} + +variable "skip_requesting_account_id" { + type = bool + default = true +} + +variable "skip_metadata_api_check" { + type = bool + default = true +} + +variable "skip_region_validation" { + type = bool + default = true +} + +variable "use_path_style" { + type = bool + default = true +} + +variable "use_lockfile" { + type = bool + default = true +} + +variable "vm_name" { + description = "Hostname of the VM" + type = string + default = "Lab" +} + +variable "vm_user_sshkey" { + description = "Admin user SSH key of the VM" + type = string + default = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDRlWaLBt/qmWY01Cd6jN/YxLnlT+6lg+evEdN/dIajirdTj1rCbAdlG3WYvo+4BpN17HK3/eGQpGUMbgI/8MVd8YPODcD34gaNX0w2v66BwHx+S6BZUpz5T2IoQT0JtSv/TtFICoff5gXdNRpfd4eWsmTioEqLA6oToJLE4dn3jvAzFi9y7fyLqvuoQMmPidYYJjGT30eiULtXNspoEP+GmuWmVEu+znzMWaKDWKdOsii4Cv1aWCRKSDDRzDBrZI2mP+Vm4HDQBdgDYRw4ehumMDtfaSjyJCnrk691bIM+wxzICuIEecg5kq5HcUPvo2mFyWPAEXb5xlXnuopYEBd7 Generated By NeoServer" +} + + +variable "node_name" { + description = "Proxmox host for the VM" + type = string + default = "pop" +} + +variable "node_datastore" { + description = "Datastore used for VM storage" + type = string + default = "hlst" +} + +variable "vm_template" { + description = "Template of the VM" + type = string + default = "ubuntu-cloud" +} + + +variable "vm_user" { + description = "Admin user of the VM" + type = string + default = "cloud" +} \ No newline at end of file