Files
VMServiceTemplate/terraform/modules/proxmox_ubuntu_cloudinit_clone/main.tf

132 lines
3.6 KiB
Terraform
Raw Normal View History

2026-05-22 21:59:40 +01:00
resource "proxmox_virtual_environment_file" "cloud_config" {
content_type = "snippets"
2026-09-12 14:52:52 +01:00
datastore_id = "hlst"
node_name = var.node_name
2026-05-22 21:59:40 +01:00
source_raw {
2026-09-12 17:08:24 +01:00
file_name = "${var.vm_name}_vm.cloud-config.yaml"
2026-05-22 21:59:40 +01:00
data = <<-EOF
#cloud-config
hostname: ${var.vm_name}
package_update: true
package_upgrade: true
system_info:
default_user:
2026-09-12 17:44:50 +01:00
groups: [ cloud ]
2026-05-22 21:59:40 +01:00
users:
- default
- name: cloud
2026-09-12 17:08:24 +01:00
groups:
2026-05-22 21:59:40 +01:00
- sudo
- docker
shell: /bin/bash
ssh-authorized-keys:
2026-09-12 17:08:24 +01:00
- "${var.vm_user_sshkey}"
2026-05-22 21:59:40 +01:00
sudo: ALL=(ALL) NOPASSWD:ALL
packages:
2026-09-12 17:08:24 +01:00
- qemu-guest-agent
2026-05-22 21:59:40 +01:00
- apt-transport-https
- ca-certificates
- curl
- gnupg
- lsb-release
2026-09-12 17:08:24 +01:00
- unattended-upgrades
2026-06-15 22:29:26 +01:00
- rsync
2026-09-12 17:08:24 +01:00
- nano
bootcmd:
- mkdir -p /home/cloud/${var.service_name}
- chown cloud:cloud /home/cloud/${var.service_name}
write_files:
- path: /home/cloud/${var.service_name}/docker-compose.yml
owner: cloud:cloud
permissions: '0644'
encoding: b64
content: ${var.compose_file_content}
- path: /home/cloud/${var.service_name}/.env
owner: cloud:cloud
permissions: '0600'
encoding: b64
content: ${var.env_file_content}
2026-05-22 21:59:40 +01:00
runcmd:
2026-09-12 17:08:24 +01:00
- systemctl enable qemu-guest-agent
2026-05-22 21:59:40 +01:00
- mkdir -p /etc/apt/keyrings
2026-09-12 17:44:50 +01:00
- apt-add-repository ppa:fish-shell/release-3
2026-05-22 21:59:40 +01:00
- 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
2026-09-12 17:44:50 +01:00
- apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin fish
2026-05-22 21:59:40 +01:00
- systemctl enable docker
- systemctl start docker
2026-09-12 17:08:24 +01:00
- chown -R cloud:cloud /home/cloud/${var.service_name}
- cd /home/cloud/${var.service_name}
- sudo -u cloud docker compose up -d
- reboot
2026-05-22 21:59:40 +01:00
EOF
}
}
resource "proxmox_virtual_environment_vm" "ubuntu_22_minimal_clone" {
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
2026-05-22 21:59:40 +01:00
agent {
enabled = true # Enable the QEMU guest agent
2026-05-22 21:59:40 +01:00
}
stop_on_destroy = true # Ensure VM is stopped gracefully when destroyed
2026-05-22 21:59:40 +01:00
clone {
vm_id = local.selected_instance.vmid # ID of the source template
2026-05-22 21:59:40 +01:00
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)
2026-05-22 21:59:40 +01:00
cpu {
cores = var.vm_cpu # Number of CPU cores
type = "host" # Use host CPU type for best compatibility/performance
2026-05-22 21:59:40 +01:00
}
memory {
dedicated = var.vm_ram # RAM in MB
2026-05-22 21:59:40 +01:00
}
disk {
datastore_id = var.node_datastore # Datastore to hold the disk
interface = "scsi0" # Primary disk interface
size = var.vm_size
2026-05-22 21:59:40 +01:00
}
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
2026-05-22 21:59:40 +01:00
ip_config {
ipv4 {
address = "dhcp" # Get IP via DHCP
2026-05-22 21:59:40 +01:00
}
}
}
network_device {
bridge = var.bridge # Use the default bridge
2026-05-22 21:59:40 +01:00
}
lifecycle {
ignore_changes = [ # Ignore initialization section after first depoloyment for idempotency
2026-05-22 21:59:40 +01:00
initialization
]
}
2026-09-12 17:44:50 +01:00
}