Este tutorial constrói a template Oracle Linux 9 com HashiCorp Packer e o builder QEMU — a mesma ol9-base.qcow2 referenciada no perfil "oracle" da série Terraform + KVM/Libvirt. O mecanismo é o mesmo do template Debian, mas o instalador automatizado muda: no lugar do preseed, o kickstart do Anaconda (família RHEL).
Código completo: pasta
oracle/do repositório no GitLab — todos os kickstarts, os.pkr.hcl, o script de customização e os arquivos de demo.
packer build
│
├─ HTTP server local servindo http/ (ks.cfg)
├─ VM QEMU (UEFI, qcow2, ISO OL9)
│ └─ boot_command: inst.ks=http://<ip-packer>/ks.cfg
├─ Anaconda lê o kickstart → instalação automática
├─ SSH up → provisioners (scripts/customizing-image.sh)
└─ shutdown → build/ol9.qcow2-<data>/ol9.qcow2
Como no projeto Debian, o kickstart é servido via http_content + templatefile() — as seções do ks.cfg são parametrizadas por variáveis do Packer (locale, teclado, usuário, senha, timezone).
oracle/
├── http/ # respostas do Anaconda
│ ├── ks.cfg # padrão: sem LVM
│ ├── template-receita-sem-lvm-ks.cfg
│ ├── template-receita-auto-ks.cfg # autopart do Anaconda
│ ├── template-receita-com-lvm-ks.cfg
│ └── template-multi-receita-com-lvm-ks.cfg # LVM com volumes separados
├── scripts/customizing-image.sh # otimização pós-instalação
├── demo/ # validação (seção 6)
├── packer.pkr.hcl
├── oraclelinux-template.pkr.hcl # source "qemu"
├── oracle-variables.pkr.hcl
├── global-variables.pkr.hcl
├── locals.pkr.hcl
├── provisioners.pkr.hcl
└── secrets.pkrvars.hcl.template
boot_command: o Anaconda é acionado com inst.ks=http://... (em vez do auto=true url=... do debian-installer);wheel — não sudo como no Debian. Coerente com o default_groups = ["users", "wheel"] dos nossos projetos Terraform;eth0 na configuração gerada pelo cloud-init (NetworkManager/ifcfg), em vez do enp1s0 do Debian — lembre disso ao parametrizar interface_name nos .tfvars;customizing-image.sh faz a limpeza equivalente à do Debian (pacotes, logs, machine-id) e garante cloud-init + qemu-guest-agent ativos;| Receita | Particionamento | Crescimento pelo cloud-init |
|---|---|---|
ks.cfg / template-receita-sem-lvm |
Sem LVM | Sim (growpart) |
template-receita-auto |
autopart do Anaconda |
Sim |
template-receita-com-lvm / multi-receita-com-lvm |
LVM (volumes separados na multi) | Não — expansão manual de PV/LV |
Disco: a template OL9 de referência tem dezenas de GiB virtuais — defina
disk_sizeconfortável (o build falha ou a template nasce apertada se o virtual size ficar abaixo do que o Anaconda espera para as receitas com volumes separados).
cp secrets.pkrvars.hcl.template secrets.pkrvars.hcl # preencha usuário/senha temporários
packer init .
packer validate -var-file=secrets.pkrvars.hcl .
PACKER_LOG=1 packer build -var-file=secrets.pkrvars.hcl .
sudo mv build/ol9.qcow2-*/ol9.qcow2 /datastore/templates/ol9-base.qcow2
sudo virsh pool-refresh templates
Mesmo fluxo do Debian, com ajustes de nome — a pasta demo/ já traz o virt-install.sh adaptado:
cd demo
genisoimage -output cidata.iso -volid cidata -joliet -rock user-data meta-data network-config
sudo cp /datastore/templates/ol9-base.qcow2 /datastore/images/demo.qcow2
./virt-install.sh # --os-variant: confira com osinfo-query os | grep -i oracle
virsh domifaddr ol9
ssh -i ~/.ssh/kvm gean@<ip> # prompt [gean@ol9 ~]$ — estilo RHEL
# Limpeza
virsh undefine --domain ol9 --nvram
sudo rm /datastore/images/demo.qcow2
ks.cfgol9-base.qcow2 usada no perfil "oracle" (nesta wiki)