From 270028981bf0a79be4e2294b7c2ad3509323f4a9 Mon Sep 17 00:00:00 2001 From: CC Date: Wed, 20 May 2026 23:37:12 +0100 Subject: [PATCH] n8n module test --- terraform/main.tf | 2 +- .../proxmox_ubuntu_cloudinit_template/main.tf | 126 ++++++++++++++++ .../output.tf | 3 + .../variables.tf | 137 ++++++++++++++++++ 4 files changed, 267 insertions(+), 1 deletion(-) create mode 100644 terraform/modules/proxmox_ubuntu_cloudinit_template/main.tf create mode 100644 terraform/modules/proxmox_ubuntu_cloudinit_template/output.tf create mode 100644 terraform/modules/proxmox_ubuntu_cloudinit_template/variables.tf diff --git a/terraform/main.tf b/terraform/main.tf index c2d633a..edef38c 100644 --- a/terraform/main.tf +++ b/terraform/main.tf @@ -6,7 +6,7 @@ locals { module "vm" { for_each = local.instance_map - source = "git::https://tea.charcarservices.uk/CC/TerraformModules.git//proxmox_ubuntu_cloudinit_template?ref=main" + source = "./modules/proxmox_ubuntu_cloudinit_template" vm_name = each.value.vm_name node_name = each.value.node_name diff --git a/terraform/modules/proxmox_ubuntu_cloudinit_template/main.tf b/terraform/modules/proxmox_ubuntu_cloudinit_template/main.tf new file mode 100644 index 0000000..1bc862d --- /dev/null +++ b/terraform/modules/proxmox_ubuntu_cloudinit_template/main.tf @@ -0,0 +1,126 @@ +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 + + disk { + datastore_id = var.node_datastore # Datastore to hold the disk + interface = "scsi0" # Primary disk interface + size = var.vm_size + file_id = "local:iso/ubuntu-22.04-minimal-cloudimg-amd64.img" + } + + efi_disk { + datastore_id = var.node_datastore + type = "4m" + } + + 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 + } + + 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 + } + + operating_system { + type = "l26" # Linux 2.6+ kernel + } + + lifecycle { + ignore_changes = [ # Ignore initialization section after first depoloyment for idempotency + initialization + ] + } +} + + + + + + + diff --git a/terraform/modules/proxmox_ubuntu_cloudinit_template/output.tf b/terraform/modules/proxmox_ubuntu_cloudinit_template/output.tf new file mode 100644 index 0000000..30d83b4 --- /dev/null +++ b/terraform/modules/proxmox_ubuntu_cloudinit_template/output.tf @@ -0,0 +1,3 @@ +output "vm_ipv4_address" { + value = proxmox_virtual_environment_vm.ubuntu_22_minimal_template.ipv4_addresses[1][0] +} \ No newline at end of file diff --git a/terraform/modules/proxmox_ubuntu_cloudinit_template/variables.tf b/terraform/modules/proxmox_ubuntu_cloudinit_template/variables.tf new file mode 100644 index 0000000..c5f1b5a --- /dev/null +++ b/terraform/modules/proxmox_ubuntu_cloudinit_template/variables.tf @@ -0,0 +1,137 @@ +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 "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