|
| 1 | +packer { |
| 2 | + required_plugins { |
| 3 | + qemu = { |
| 4 | + version = ">= 1.0.9" |
| 5 | + source = "github.com/hashicorp/qemu" |
| 6 | + } |
| 7 | + } |
| 8 | +} |
| 9 | + |
| 10 | +variable "vm_name" { default = "defguard" } |
| 11 | +variable "disk_size" { default = "20G" } |
| 12 | +variable "memory" { default = 2048 } |
| 13 | +variable "cpus" { default = 2 } |
| 14 | +variable "ssh_user" { default = "ubuntu" } |
| 15 | +variable "iso_url" { default = "https://releases.ubuntu.com/24.04.4/ubuntu-24.04.4-live-server-amd64.iso" } |
| 16 | +variable "core_tag" { type = string } |
| 17 | +variable "proxy_tag" { type = string } |
| 18 | +variable "gateway_tag" { type = string } |
| 19 | + |
| 20 | +source "qemu" "ubuntu24" { |
| 21 | + iso_url = var.iso_url |
| 22 | + iso_checksum = "sha256:e907d92eeec9df64163a7e454cbc8d7755e8ddc7ed42f99dbc80c40f1a138433" |
| 23 | + |
| 24 | + vm_name = var.vm_name |
| 25 | + memory = var.memory |
| 26 | + cpus = var.cpus |
| 27 | + disk_size = var.disk_size |
| 28 | + accelerator = "kvm" |
| 29 | + format = "qcow2" |
| 30 | + output_directory = "output/${var.vm_name}" |
| 31 | + |
| 32 | + net_device = "virtio-net" |
| 33 | + disk_interface = "virtio" |
| 34 | + machine_type = "q35" |
| 35 | + |
| 36 | + ssh_username = var.ssh_user |
| 37 | + ssh_password = "ubuntu" |
| 38 | + ssh_timeout = "40m" |
| 39 | + ssh_handshake_attempts = 100 |
| 40 | + |
| 41 | + http_content = { |
| 42 | + "/meta-data" = file("${path.root}/http/meta-data") |
| 43 | + "/user-data" = file("${path.root}/http/user-data") |
| 44 | + } |
| 45 | + boot_wait = "5s" |
| 46 | + boot_command = [ |
| 47 | + "c<wait5>", |
| 48 | + "linux /casper/vmlinuz autoinstall 'ds=nocloud-net;s=http://{{ .HTTPIP }}:{{ .HTTPPort }}/'<enter><wait5>", |
| 49 | + "initrd /casper/initrd<enter><wait5>", |
| 50 | + "boot<enter>" |
| 51 | + ] |
| 52 | + |
| 53 | + shutdown_command = "sudo shutdown -P now" |
| 54 | + headless = true |
| 55 | +} |
| 56 | + |
| 57 | +build { |
| 58 | + sources = ["source.qemu.ubuntu24"] |
| 59 | + |
| 60 | + provisioner "file" { |
| 61 | + source = "files/docker-setup.sh" |
| 62 | + destination = "/tmp/docker-setup.sh" |
| 63 | + } |
| 64 | + |
| 65 | + provisioner "file" { |
| 66 | + source = "files/99-defguard.cfg" |
| 67 | + destination = "/tmp/99-defguard.cfg" |
| 68 | + } |
| 69 | + |
| 70 | + provisioner "file" { |
| 71 | + source = "files/docker-compose.yaml" |
| 72 | + destination = "/tmp/docker-compose.yaml" |
| 73 | + } |
| 74 | + |
| 75 | + provisioner "file" { |
| 76 | + source = "files/docker-compose.standalone.yaml" |
| 77 | + destination = "/tmp/docker-compose.standalone.yaml" |
| 78 | + } |
| 79 | + |
| 80 | + provisioner "file" { |
| 81 | + source = "files/generate-env.sh" |
| 82 | + destination = "/tmp/generate-env.sh" |
| 83 | + } |
| 84 | + |
| 85 | + provisioner "file" { |
| 86 | + source = "files/start.sh" |
| 87 | + destination = "/tmp/start.sh" |
| 88 | + } |
| 89 | + |
| 90 | + provisioner "file" { |
| 91 | + source = "files/defguard-init.service" |
| 92 | + destination = "/tmp/defguard-init.service" |
| 93 | + } |
| 94 | + |
| 95 | + provisioner "shell" { |
| 96 | + inline = [ |
| 97 | + "sudo bash /tmp/docker-setup.sh", |
| 98 | + "sudo mkdir -p /opt/defguard", |
| 99 | + "sudo mv /tmp/docker-compose.yaml /opt/defguard/docker-compose.yaml", |
| 100 | + "sudo mv /tmp/docker-compose.standalone.yaml /opt/defguard/docker-compose.standalone.yaml", |
| 101 | + "sudo mv /tmp/generate-env.sh /opt/defguard/generate-env.sh", |
| 102 | + "sudo chmod +x /opt/defguard/generate-env.sh", |
| 103 | + "sudo mv /tmp/start.sh /opt/defguard/start.sh", |
| 104 | + "sudo chmod +x /opt/defguard/start.sh", |
| 105 | + "echo 'DEFGUARD_CORE_TAG=${var.core_tag}' | sudo tee /opt/defguard/.image-tags > /dev/null", |
| 106 | + "echo 'DEFGUARD_PROXY_TAG=${var.proxy_tag}' | sudo tee -a /opt/defguard/.image-tags > /dev/null", |
| 107 | + "echo 'DEFGUARD_GATEWAY_TAG=${var.gateway_tag}' | sudo tee -a /opt/defguard/.image-tags > /dev/null", |
| 108 | + "sudo mv /tmp/99-defguard.cfg /etc/cloud/cloud.cfg.d/99-defguard.cfg", |
| 109 | + "sudo mv /tmp/defguard-init.service /etc/systemd/system/defguard-init.service", |
| 110 | + "sudo systemctl daemon-reload", |
| 111 | + "sudo systemctl enable docker.service", |
| 112 | + "sudo chown -R ubuntu:ubuntu /opt/defguard", |
| 113 | + "sudo rm -f /etc/netplan/00-installer-config.yaml /etc/netplan/50-cloud-init.yaml", |
| 114 | + "sudo cloud-init clean --logs", |
| 115 | + "sudo rm -f /etc/ssh/ssh_host_*", |
| 116 | + "sudo rm -f /root/.ssh/authorized_keys", |
| 117 | + "sudo rm -f /home/ubuntu/.ssh/authorized_keys", |
| 118 | + "sudo truncate -s 0 /home/ubuntu/.bash_history || true", |
| 119 | + "sudo truncate -s 0 /root/.bash_history || true", |
| 120 | + # Expire default password so it must be changed on first login |
| 121 | + "sudo chage -d 0 ubuntu" |
| 122 | + ] |
| 123 | + } |
| 124 | + |
| 125 | + post-processor "shell-local" { |
| 126 | + inline = [ |
| 127 | + "qemu-img convert -f qcow2 -O vmdk output/${var.vm_name}/${var.vm_name} output/${var.vm_name}/${var.vm_name}.vmdk", |
| 128 | + "cp files/ubuntu.vmx output/${var.vm_name}/${var.vm_name}.vmx", |
| 129 | + "ovftool --lax --diskMode=thin output/${var.vm_name}/${var.vm_name}.vmx output/${var.vm_name}/${var.vm_name}.ova" |
| 130 | + ] |
| 131 | + } |
| 132 | +} |
0 commit comments