▍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:
Создадим рабочий каталог:
и там же директорию с настройками нового шаблона, в нашем случае это будет 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/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 оставляем пустым.
Для генерации пароля можно воспользоваться следующей командой:
, где "-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 должен появиться наш новый шаблон.
На этом всё! 😎 🤘
