Перейти к содержанию

▍Packer

Packer, Proxmox и Cloud-Init

Настройка Packer

Устанавливаем последнюю версию Packer:

wget -O - https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(grep -oP '(?<=UBUNTU_CODENAME=).*' /etc/os-release || lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install packer

Устанавливаем плагин поддержки Proxmox:

packer plugins install github.com/hashicorp/proxmox

Создадим рабочий каталог:

mkdir ~/packer

и там же директорию с настройками нового шаблона, в нашем случае это будет ubuntu server 25.04:

➜   tree packer
packer
└── ubuntu-2504-server
    ├── files
    │   ├── 99-disable-ubuntu.cfg
    │   └── 99-pve.cfg
    ├── http
    │   ├── meta-data
    │   └── user-data
    └── ubuntu-2504-server.pkr.hcl

Листинг настроек по файлам:

cat ~/packer/ubuntu-2504-server/ubuntu-2504-server.pkr.hcl
# Packer Template to create an Ubuntu Server on Proxmox

# Variable Definitions
variable "proxmox_api_url" {
    type = string
    default = env("PM_API_URL")
}

variable "proxmox_api_token_id" {
    type = string
    default = env("PM_API_TOKEN_ID")
}

variable "proxmox_api_token_secret" {
    type = string
    sensitive = true
    default = env("PM_API_TOKEN_SECRET")
}

# Resource Definiation for the VM Template
source "proxmox-iso" "ubuntu-2504-server" {
    # Proxmox Connection Settings
    proxmox_url = "https://${var.proxmox_api_url}:8006/api2/json"
    username = "${var.proxmox_api_token_id}"
    token = "${var.proxmox_api_token_secret}"
    # (Optional) Skip TLS Verification
    insecure_skip_tls_verify = true

    # VM General Settings
    node = "srv-pve1"
    vm_id = "9007"
    vm_name = "ubuntu-2504-server-packer"
    template_description = "Ubuntu Server 25.04"

    # VM OS Settings
    # Local ISO File
    iso_file = "iso:iso/ubuntu-24.04.3-live-server-amd64.iso"
    unmount_iso = true
    # VM System Settings
    qemu_agent = true

    # VM Hard Disk Settings
    scsi_controller = "virtio-scsi-single"

    disks {
        disk_size = "10G"
        storage_pool = "cephpool01"
        type = "scsi"
    }

    # VM CPU Settings
    cores = "2"

    # VM Memory Settings
    memory = "4096"
    machine = "q35"
    cpu_type = "host"
    # VM Network Settings
    network_adapters {
        model = "virtio"
        bridge = "vmbr0"
    }

    # VM Cloud-Init Settings
    cloud_init = true
    cloud_init_storage_pool = "cephpool01"

    # PACKER Boot Commands
  boot_command = [
  "<esc><esc><esc><esc>e<wait>", "<del><del><del><del><del><del><del><del>", "<del><del><del><del><del><del><del><del>", "<del><del><del><del><del><del><del><del>", "<del><del><del><del><del><del><del><del>", "<del><del><del><del><del><del><del><del>", "<del><del><del><del><del><del><del><del>", "<del><del><del><del><del><del><del><del>", "<del><del><del><del><del><del><del><del>", "<del><del><del><del><del><del><del><del>", "<del><del><del><del><del><del><del><del>", "<del><del><del><del><del><del><del><del>", "<del><del><del><del><del><del><del><del>", "<del><del><del><del><del><del><del><del>", "<del><del><del><del><del><del><del><del>", "linux /casper/vmlinuz --- autoinstall ds=\"nocloud-net;s=http://{{ .HTTPIP }}:{{ .HTTPPort }}/\"<enter><wait>", "initrd /casper/initrd<enter><wait>", "boot<enter>", "<enter><f10><wait>"
    ]
    boot_key_interval = "30ms"
    boot_wait = "5s"

    # PACKER Autoinstall Settings
    http_directory = "http"
    # (Optional) Bind IP Address and Port
    http_bind_address = "0.0.0.0"
    http_port_min = 8802
    http_port_max = 8802

    ssh_username = "daffin"
    # (Option 1) Add your Password here
    #ssh_password = "ubuntu"
    # - or -
    # (Option 2) Add your Private SSH KEY file here
    ssh_private_key_file = "~/.ssh/id_ed25519"

    # Raise the timeout, when installation takes longer
    ssh_timeout = "20m"
}

# Build Definition to create the VM Template
build {

    name = "ubuntu-2504-server-packer"
    sources = ["source.proxmox-iso.ubuntu-2504-server"]

    # Provisioning the VM Template for Cloud-Init Integration in Proxmox #1
    provisioner "shell" {
        inline = [
            "while [ ! -f /var/lib/cloud/instance/boot-finished ]; do echo 'Waiting for cloud-init...'; sleep 1; done",
            "sudo cloud-init clean",
            "sudo rm /etc/ssh/ssh_host_*",
            "sudo truncate -s 0 /etc/machine-id",
            "sudo sync"
        ]
    }

    # Provisioning the VM Template for Cloud-Init Integration in Proxmox #2
    provisioner "file" {
      source      = "files/99-pve.cfg"
      destination = "/tmp/99-pve.cfg"
    }

    provisioner "file" {
      source      = "files/99-disable-ubuntu.cfg"
      destination = "/tmp/99-disable-ubuntu.cfg"
    }

    # Provisioning the VM Template for Cloud-Init Integration in Proxmox #3
    provisioner "shell" {
        inline = [
          "sudo cp /tmp/99-pve.cfg /etc/cloud/cloud.cfg.d/99-pve.cfg",
          "sudo cp /tmp/99-disable-ubuntu.cfg /etc/cloud/cloud.cfg.d/99-disable-ubuntu.cfg"
        ]
    }
}
cat ~/packer/ubuntu-2504-server/files/99-disable-ubuntu.cfg
# Disable default ubuntu user creation
system_info:
  default_user:
    name: ""
cat ~/packer/ubuntu-2504-server/files/99-pve.cfg
datasource_list: [ NoCloud, ConfigDrive ]
cat ~/packer/ubuntu-2504-server/http/user-data
#cloud-config
autoinstall:
  version: 1
  identity:
    hostname: ubuntu-server
    username: daffin
    password: "$6$puO34................"
  ssh:
    install-server: true
  storage:
    layout:
      name: direct
    swap:
      size: 0
  user-data:
    package_upgrade: false
    timezone: Europe/Moscow
    users:
      - name: daffin
        groups: [adm, sudo]
        lock-passwd: false
        sudo: ALL=(ALL) NOPASSWD:ALL
        shell: /bin/bash
        passwd: "$6$puO34................"
        ssh_authorized_keys:
          - ssh-ed25519 AAAA..........
    write_files:
      - path: /etc/ssh/sshd_config
        content: |
          Port 22
          Protocol 2
          HostKey /etc/ssh/ssh_host_rsa_key
          HostKey /etc/ssh/ssh_host_ecdsa_key
          KexAlgorithms diffie-hellman-group-exchange-sha256,curve25519-sha256,diffie-hellman-group14-sha256
          MACs hmac-sha2-512,hmac-sha2-256
          Ciphers aes256-ctr,aes192-ctr,aes128-ctr
          AuthorizedKeysFile %h/.ssh/authorized_keys
          SyslogFacility AUTH
          LogLevel INFO
          LoginGraceTime 20
          PermitRootLogin yes
          StrictModes yes
          # To disable tunneled clear text passwords, change to no here!
          PasswordAuthentication no
          PubkeyAuthentication yes
          IgnoreRhosts yes
          HostbasedAuthentication no
          PermitEmptyPasswords no
          ChallengeResponseAuthentication no
          X11Forwarding no
          X11DisplayOffset 10
          PrintMotd yes
          PrintLastLog yes
          TCPKeepAlive yes
          AcceptEnv LANG LC_*
          Subsystem sftp /usr/lib/sftp-server
          UsePAM yes
  locale: en_US.UTF-8
  keyboard:
    layout: us
  packages:
    - qemu-guest-agent
  late-commands:
    - curtin in-target --target=/target -- systemctl enable qemu-guest-agent
    - curtin in-target --target=/target -- systemctl start qemu-guest-agent

Файл meta-data оставляем пустым.

Для генерации пароля можно воспользоваться следующей командой:

openssl passwd -6 "your_password"
, где "-6" - это SHA-512

Чтобы Packer смог подключиться к Proxmox выполним команды:

export PM_API_URL=192.168.0.21
export PM_API_TOKEN_ID="terraform@pve!terraform-token"
export PM_API_TOKEN_SECRET="474a4cea-68d5-4b31-8d3c-09b28b4b7430"

как создать роль на стороне Proxmox можно глянуть в заметке про Terraform.

Всё, теперь находясь в директории ~/packer/ubuntu-2504-server можно запускать сборку

➜   packer build ubuntu-2504-server.pkr.hcl

ubuntu-2504-server-packer.proxmox-iso.ubuntu-2504-server: output will be in this color.

==> ubuntu-2504-server-packer.proxmox-iso.ubuntu-2504-server: Creating VM
==> ubuntu-2504-server-packer.proxmox-iso.ubuntu-2504-server: Starting VM
==> ubuntu-2504-server-packer.proxmox-iso.ubuntu-2504-server: Starting HTTP server on port 8802
==> ubuntu-2504-server-packer.proxmox-iso.ubuntu-2504-server: Waiting 5s for boot
==> ubuntu-2504-server-packer.proxmox-iso.ubuntu-2504-server: Typing the boot command
==> ubuntu-2504-server-packer.proxmox-iso.ubuntu-2504-server: Waiting for SSH to become available...
==> ubuntu-2504-server-packer.proxmox-iso.ubuntu-2504-server: Connected to SSH!
==> ubuntu-2504-server-packer.proxmox-iso.ubuntu-2504-server: Provisioning with shell script: /tmp/packer-shell3862865990
==> ubuntu-2504-server-packer.proxmox-iso.ubuntu-2504-server: Uploading files/99-pve.cfg => /tmp/99-pve.cfg
    ubuntu-2504-server-packer.proxmox-iso.ubuntu-2504-server: 99-pve.cfg 42 B / 42 B [===================================================================] 100.00% 0s
==> ubuntu-2504-server-packer.proxmox-iso.ubuntu-2504-server: Uploading files/99-disable-ubuntu.cfg => /tmp/99-disable-ubuntu.cfg
    ubuntu-2504-server-packer.proxmox-iso.ubuntu-2504-server: 99-disable-ubuntu.cfg 81 B / 81 B [========================================================] 100.00% 0s
==> ubuntu-2504-server-packer.proxmox-iso.ubuntu-2504-server: Provisioning with shell script: /tmp/packer-shell3744545008
==> ubuntu-2504-server-packer.proxmox-iso.ubuntu-2504-server: Stopping VM
==> ubuntu-2504-server-packer.proxmox-iso.ubuntu-2504-server: Converting VM to template
==> ubuntu-2504-server-packer.proxmox-iso.ubuntu-2504-server: Adding a cloud-init cdrom in storage pool cephpool01
Build 'ubuntu-2504-server-packer.proxmox-iso.ubuntu-2504-server' finished after 8 minutes 30 seconds.

==> Wait completed after 8 minutes 30 seconds

==> Builds finished. The artifacts of successful builds are:
--> ubuntu-2504-server-packer.proxmox-iso.ubuntu-2504-server: A template was created: 9007

Ждём и в Proxmox должен появиться наш новый шаблон.

Packer template

На этом всё! 😎 🤘

К началу