Nas séries anteriores usamos templates prontas baixadas do site do Debian. Este tutorial mostra como construir a sua própria com HashiCorp Packer: uma VM efêmera faz a instalação automatizada via preseed, recebe um script de customização e é desligada — o disco resultante vira a template qcow2 que alimenta o pool /datastore/templates consumido pela série Terraform + KVM/Libvirt.
Código completo: pasta
debian/do repositório no GitLab — inclui todos os preseeds, os.pkr.hcl, o script de customização e os arquivos de demo.
sudo apt install ovmf);wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" \
| sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install packer
packer --version # Packer v1.16.0
packer build
│
├─ sobe um HTTP server local servindo http/ (preseed.cfg)
├─ cria VM QEMU (UEFI, disco qcow2, ISO netinst do Debian)
│ └─ boot_command tecla: auto=true url=http://<ip-packer>/preseed.cfg
├─ instalador lê o preseed → instalação 100% automática
├─ Packer conecta via SSH (usuário criado pelo preseed)
├─ provisioners: sobe e executa scripts/customizing-image.sh
└─ shutdown → build/<nome>-<data>/debian-trixie.qcow2
O detalhe elegante do projeto: o preseed não é servido cru — o source "qemu" usa http_content + templatefile(), então as diretivas d-i recebem variáveis do Packer (${var.locale}, ${var.ssh_username}, ${var.timezone}...). Trocar teclado, fuso ou hostname é mudar variável, não editar preseed.
debian/
├── http/ # respostas do instalador
│ ├── preseed.cfg # padrão: sem swap, sem LVM
│ ├── template-recita-auto-sem-lvm-preseed.cfg # receita "atomic" (≥ 16 GB)
│ ├── template-recita-sem-lvm-preseed.cfg
│ ├── template-recita-com-lvm-preseed.cfg
│ └── template-recita-com-aut-lvm-preseed.cfg
├── scripts/customizing-image.sh # otimização pós-instalação
├── demo/ # validação da template (seção 6)
├── packer.pkr.hcl # plugin qemu + versão
├── debian-template.pkr.hcl # source "qemu" (boot, hardware, EFI, SSH)
├── debian-variables.pkr.hcl # ISO, checksum, recursos da VM
├── global-variables.pkr.hcl
├── locals.pkr.hcl # caminhos OVMF, diretório de saída
├── provisioners.pkr.hcl # build: file + shell
└── secrets.pkrvars.hcl.template # modelo de segredos (copiar e preencher)
efi_boot = true com firmware OVMF resolvido em locals.pkr.hcl — coerente com o firmware = "efi" que usamos nos domains da série Terraform;boot_command: interrompe o boot da ISO e carrega o kernel do instalador com auto=true url=... — é a linha que torna tudo desassistido;secrets.pkrvars.hcl) para rodar os provisioners;customizing-image.sh: deixa a imagem "cloud-like" — remove kernels antigos, firmware e microcode (desnecessários em VM), limpa locales, instala/ajusta cloud-init e qemu-guest-agent, zera logs e histórico e limpa o machine-id (essencial: sem isso, toda VM clonada nasce com a mesma identidade);preseed_file — sem precisar editar HCL.| Receita | Particionamento | Crescimento pelo cloud-init |
|---|---|---|
preseed.cfg (padrão) |
Sem LVM, sem swap (EFI + ext4) | Sim (growpart) |
template-recita-auto-sem-lvm |
atomic do debian-installer — exige disco ≥ 16 GB |
Sim |
template-recita-com-lvm / com-aut-lvm |
LVM | Não — exige expansão manual de PV/LV |
O erro clássico da receita
atomicem disco pequeno é "Unable to satisfy all constraints" no particionamento. Se vir isso, aumentedisk_sizeou use a receita sem LVM.
cp secrets.pkrvars.hcl.template secrets.pkrvars.hcl
# edite: ssh_username/ssh_password temporários (valem só durante o build)
packer init .
packer validate -var-file=secrets.pkrvars.hcl .
PACKER_LOG=1 packer build -var-file=secrets.pkrvars.hcl .
# Publicar no pool de templates do Libvirt
sudo mv build/debian-trixie.qcow2-*/debian-trixie.qcow2 /datastore/templates/debian-trixie-base.qcow2
sudo virsh pool-refresh templates
A pasta demo/ contém o trio cloud-init (user-data, meta-data, network-config) e o virt-install.sh. O fluxo:
cd demo
# 1. Gere a ISO de seed com o trio (user-data com sua chave SSH)
genisoimage -output cidata.iso -volid cidata -joliet -rock user-data meta-data network-config
# 2. Copie a template como disco da VM de teste
sudo cp /datastore/templates/debian-trixie-base.qcow2 /datastore/images/demo.qcow2
# 3. Crie a VM (script no repo; ajuste nome, rede e caminhos)
./virt-install.sh
# 4. Confirme IP e acesso
virsh domifaddr debian-trixie
ssh -i ~/.ssh/kvm gean@<ip>
# 5. Limpeza da demo
virsh undefine --domain debian-trixie --nvram
sudo rm /datastore/images/demo.qcow2
O
osinfo-query os | grep debianmostra o identificador correto para o--os-variantdo virt-install (ex.:debian13) — vale conferir antes de rodar o script.
boot_command, http_content, EFId-iatomic, home, multi e expert_recipe