Criação de Imagem Oracle Linux com Packer e Kickstart
Nota: Este tutorial é o segundo de uma série de 6 tutoriais sobre criação de imagens QEMU/KVM com Packer. Se você ainda não leu o primeiro tutorial sobre os fundamentos do Packer e QEMU/KVM, recomendamos que o faça antes de prosseguir. Fundamentos do Packer e QEMU/KVM: Criando Imagens Automatizadas.
Criação de Imagem Oracle Linux com Packer e Kickstart
Introdução
No tutorial anterior, exploramos os fundamentos do Packer e QEMU/KVM, preparamos nosso ambiente de desenvolvimento e criamos um arquivo Packer básico. Agora, vamos avançar para a criação de uma imagem completa e funcional do Oracle Linux utilizando o método Kickstart para automatizar a instalação.
O Oracle Linux é uma distribuição empresarial baseada no Red Hat Enterprise Linux (RHEL), oferecendo estabilidade, segurança e suporte de longo prazo. Combinar o Oracle Linux com o Packer nos permite criar imagens padronizadas e reproduzíveis para ambientes de produção, desenvolvimento ou testes.
Neste tutorial, vamos:
- Entender o que é o Kickstart e como ele funciona
- Criar um arquivo Kickstart personalizado para Oracle Linux
- Configurar o Packer para utilizar o Kickstart
- Adicionar scripts de provisionamento para personalização
- Construir e validar a imagem final
O que é Kickstart?
Kickstart é um método de automação desenvolvido pela Red Hat para instalações não assistidas do sistema operacional. Ele permite especificar todas as configurações que normalmente seriam definidas manualmente durante a instalação, como:
- Idioma e layout de teclado
- Fuso horário
- Particionamento de disco
- Pacotes a serem instalados
- Configurações de rede
- Usuários e senhas
- Scripts pós-instalação
Um arquivo Kickstart é essencialmente um arquivo de texto que contém todas essas configurações e é lido pelo instalador do sistema operacional durante o processo de boot.
Vantagens do Kickstart
- Automação completa: Elimina a necessidade de intervenção manual
- Consistência: Garante que todas as instalações sejam idênticas
- Eficiência: Reduz significativamente o tempo de instalação
- Flexibilidade: Permite personalização avançada
- Integração: Funciona perfeitamente com ferramentas como o Packer
Preparando o Ambiente
Antes de começarmos, vamos preparar nosso ambiente de trabalho:
1
2
3
4
5
6
# Criar diretório para o segundo tutorial
mkdir -p ~/packer-kvm-tutorial/tutorial2
cd ~/packer-kvm-tutorial/tutorial2
# Criar subdiretórios necessários
mkdir -p http scripts build/os-base
Criando o Arquivo Kickstart
O arquivo Kickstart é o coração da nossa automação. Vamos criar um arquivo ks.cfg
no diretório http
que será servido via HTTP durante a instalação:
1
nano http/ks.cfg
Adicione o seguinte conteúdo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# Configuração gráfica (não utilizada em instalações automatizadas)
graphical
# Configuração do kdump
%addon com_redhat_kdump --enable --reserve-mb='auto'
%end
# Configuração de teclado e idioma
keyboard --xlayouts='br'
lang pt_BR.UTF-8
# URL do repositório de instalação
url --url="http://yum.oracle.com/repo/OracleLinux/OL9/baseos/latest/x86_64"
# Pacotes a serem instalados
%packages
@^minimal-environment
%end
# Habilitar o firstboot (primeira inicialização)
firstboot --enable
# Configuração de disco
ignoredisk --only-use=vda
autopart
clearpart --none --initlabel
# Configuração de fuso horário
timezone America/Sao_Paulo --utc
# Configuração de usuários
rootpw --lock
user --groups=wheel --name=packer --password=$6$Jfl.H/kwDSeu7FWF$S/Mc/qsxM2DRupVkxKQawCgjQ3.i6beyCgY1fQCC0NUadW9pucgYnraGMWaCSg8g6t4GbozowE40X/FtAGert. --iscrypted --gecos="packer"
# Reiniciar após a instalação
reboot
# Script pós-instalação
%post
echo "packer ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/packer
/bin/chown root:root /etc/sudoers.d/packer
/bin/chmod 0440 /etc/sudoers.d/packer
%end
Vamos analisar as principais seções deste arquivo Kickstart:
Configurações Básicas
keyboard --xlayouts='br'
: Define o layout de teclado como brasileirolang pt_BR.UTF-8
: Define o idioma como português do Brasiltimezone America/Sao_Paulo --utc
: Define o fuso horário para São Paulo
Fonte de Instalação
url --url="http://yum.oracle.com/repo/OracleLinux/OL9/baseos/latest/x86_64"
: Especifica o repositório de onde os pacotes serão baixados
Particionamento
ignoredisk --only-use=vda
: Usa apenas o disco vda (padrão para QEMU/KVM)autopart
: Configura o particionamento automáticoclearpart --none --initlabel
: Inicializa o rótulo do disco sem remover partições
Usuários
rootpw --lock
: Bloqueia a conta root por segurançauser --groups=wheel --name=packer
: Cria um usuário chamado “packer” com acesso ao grupo wheel (sudo)
Pacotes
@^minimal-environment
: Instala apenas o ambiente mínimo para reduzir o tamanho da imagem
Pós-instalação
- O bloco
%post
executa comandos após a instalação - Configura o usuário “packer” para ter acesso sudo sem senha, necessário para o Packer funcionar
Criando o Script de Limpeza
Agora, vamos criar um script de limpeza que será executado após a instalação para otimizar a imagem:
1
nano scripts/cleanup.sh
Adicione o seguinte conteúdo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/usr/bin/env bash
# Atualização e instalação de pacotes
dnf update -y
dnf install -y cloud-init qemu-guest-agent
# Configura o NoCloud como fonte de dados
cat <<EOF > /etc/cloud/cloud.cfg.d/99-nocloud-datasource.cfg
datasource_list:
- NoCloud
- None
EOF
# Remoção de pacotes e dependências desnecessárias
dnf autoremove -y
dnf clean all
# Limpeza de cache, logs e arquivos temporários
rm -rf /var/cache/dnf
rm -rf /var/log/*
rm -rf /tmp/*
rm -rf /var/tmp/*
# Remoção de arquivos específicos da instância
truncate -s 0 /etc/machine-id
rm -f /etc/ssh/*key*
rm -f ~/.bash_history
# Zerar espaço livre
fstrim -av
Este script realiza várias tarefas importantes:
- Atualiza o sistema e instala pacotes essenciais (cloud-init, qemu-guest-agent)
- Configura o cloud-init para usar o datasource NoCloud
- Remove pacotes desnecessários e limpa caches
- Remove logs e arquivos temporários
- Remove identificadores únicos da máquina (machine-id, chaves SSH)
- Executa fstrim para otimizar o espaço em disco
Torne o script executável:
1
chmod +x scripts/cleanup.sh
Criando o Arquivo Packer
Agora, vamos criar o arquivo Packer que utilizará o Kickstart e o script de limpeza:
1
nano ol9-kvm.pkr.hcl
Adicione o seguinte conteúdo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
packer {
required_version = ">= 1.10.0"
required_plugins {
qemu = {
version = "= 1.1.0"
source = "github.com/hashicorp/qemu"
}
}
}
variable "vm_name" {
default = "ol9-kvm-template.raw"
}
variable "disk_size" {
default = "16384"
}
variable "iso_url" {
default = "https://yum.oracle.com/ISOS/OracleLinux/OL9/u4/x86_64/OracleLinux-R9-U4-x86_64-boot.iso"
}
variable "iso_checksum" {
default = "975de11be8761efa4aa2c87d7d3bedcb62c9dc956909b68f62c99062d11599e9"
}
source "qemu" "iso" {
vm_name = var.vm_name
iso_url = var.iso_url
iso_checksum = var.iso_checksum
disk_size = var.disk_size
memory = 2048
disk_image = false
output_directory = "build/os-base"
accelerator = "kvm"
disk_interface = "virtio"
format = "raw"
net_device = "virtio-net"
boot_wait = "3s"
boot_command = [
"<up>",
"<tab><wait>",
" inst.ks=http://{{.HTTPIP}}:{{.HTTPPort}}/ks.cfg",
"<enter>"
]
http_directory = "http"
cpu_model = "host"
shutdown_command = "echo 'packer' | sudo -S shutdown -P now"
ssh_username = "packer"
ssh_password = "packer"
ssh_timeout = "60m"
}
build {
sources = ["source.qemu.iso"]
# Envia o script de limpeza para a VM
provisioner "file" {
source = "scripts/cleanup.sh"
destination = "/tmp/cleanup.sh"
}
# Executa o script de limpeza na VM
provisioner "shell" {
inline = [
"chmod +x /tmp/cleanup.sh",
"echo 'packer' | sudo -S /tmp/cleanup.sh"
]
}
}
Vamos analisar as partes importantes deste arquivo:
Variáveis
vm_name
: Nome do arquivo de imagem resultantedisk_size
: Tamanho do disco em MB (16GB neste caso)iso_url
: URL da ISO do Oracle Linux 9iso_checksum
: Checksum SHA256 da ISO para verificação
Configuração QEMU
memory
: 2GB de RAM para a VMaccelerator
: Usa KVM para melhor desempenhodisk_interface
enet_device
: Usa dispositivos virtio para melhor desempenhoformat
: Formato raw para a imagem resultante
Boot Command
1
2
3
4
5
6
boot_command = [
"<up>",
"<tab><wait>",
" inst.ks=http://{{.HTTPIP}}:{{.HTTPPort}}/ks.cfg",
"<enter>"
]
Esta sequência de comandos:
- Pressiona a tecla “up” para selecionar a opção de instalação
- Pressiona “tab” para editar os parâmetros de boot
- Adiciona o parâmetro
inst.ks=http://{{.HTTPIP}}:{{.HTTPPort}}/ks.cfg
que aponta para nosso arquivo Kickstart - Pressiona “enter” para iniciar a instalação
Provisionadores
1
2
3
4
5
6
7
8
9
10
11
12
13
# Envia o script de limpeza para a VM
provisioner "file" {
source = "scripts/cleanup.sh"
destination = "/tmp/cleanup.sh"
}
# Executa o script de limpeza na VM
provisioner "shell" {
inline = [
"chmod +x /tmp/cleanup.sh",
"echo 'packer' | sudo -S /tmp/cleanup.sh"
]
}
Estes provisionadores:
- Copiam o script de limpeza para a VM
- Tornam o script executável
- Executam o script com privilégios sudo
Construindo a Imagem
Agora que temos todos os arquivos necessários, vamos construir nossa imagem:
1
2
3
4
5
6
7
8
# Inicializar o Packer (baixa os plugins necessários)
packer init .
# Validar a configuração
packer validate ol9-kvm.pkr.hcl
# Construir a imagem (com logs detalhados)
PACKER_LOG=1 packer build ol9-kvm.pkr.hcl
Este processo pode levar algum tempo, pois o Packer irá:
- Baixar a ISO do Oracle Linux (se ainda não estiver em cache)
- Iniciar uma VM QEMU/KVM
- Inicializar a instalação com o Kickstart
- Aguardar a conclusão da instalação
- Conectar-se via SSH
- Executar os provisionadores
- Desligar a VM
- Empacotar a imagem resultante
Verificando a Imagem Gerada
Após a conclusão do build, você terá uma imagem raw no diretório build/os-base
:
1
ls -lh build/os-base/
Você deve ver um arquivo como ol9-kvm-template.raw
.
Convertendo para QCOW2 (Opcional)
O formato raw é ótimo para desempenho, mas o formato QCOW2 oferece recursos adicionais como compressão e snapshots. Para converter a imagem:
1
qemu-img convert -O qcow2 -c build/os-base/ol9-kvm-template.raw ol9-kvm-template.qcow2
Testando a Imagem
Para testar a imagem, você pode iniciar uma VM usando o QEMU diretamente:
1
2
3
4
5
6
7
8
9
10
qemu-system-x86_64 \
-name "Test-OL9" \
-machine type=q35,accel=kvm \
-cpu host \
-m 2048 \
-drive file=build/os-base/ol9-kvm-template.raw,format=raw,if=virtio \
-net nic,model=virtio \
-net user,hostfwd=tcp::2222-:22 \
-display none \
-daemonize
Conecte-se à VM via SSH:
1
ssh -p 2222 packer@localhost
Personalizações Adicionais
Agora que temos uma imagem básica funcionando, vamos explorar algumas personalizações adicionais que você pode fazer:
Adicionando Pacotes
Você pode adicionar pacotes adicionais no arquivo Kickstart:
1
2
3
4
5
6
7
%packages
@^minimal-environment
vim
git
wget
curl
%end
Configurações de Rede
Para configurar a rede no Kickstart:
1
network --bootproto=dhcp --device=eth0 --activate
Particionamento Personalizado
Para um particionamento mais avançado:
1
2
3
4
5
6
7
8
9
10
11
# Limpar o disco
clearpart --all --initlabel
# Criar partições
part /boot --fstype=xfs --size=1024
part pv.01 --size=1 --grow
# Configurar LVM
volgroup vg_root pv.01
logvol / --vgname=vg_root --name=lv_root --fstype=xfs --size=8192
logvol swap --vgname=vg_root --name=lv_swap --size=2048
Scripts Pós-instalação Adicionais
Você pode adicionar scripts pós-instalação mais complexos:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
%post
# Configurar repositórios adicionais
cat > /etc/yum.repos.d/ol9-additional.repo << EOF
[ol9_addons]
name=Oracle Linux 9 Addons ($basearch)
baseurl=https://yum.oracle.com/repo/OracleLinux/OL9/addons/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=1
EOF
# Instalar pacotes adicionais
dnf install -y oracle-epel-release-el9
dnf install -y htop iotop
# Configurações de segurança
sed -i 's/^#PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
sed -i 's/^#PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
%end
Exercícios Práticos
Para fixar o conhecimento adquirido neste tutorial, tente os seguintes exercícios:
- Modifique o arquivo Kickstart para instalar pacotes adicionais de sua escolha
- Altere o particionamento para usar LVM com partições separadas para
/
,/var
e/home
- Adicione um script pós-instalação que configure o firewall (firewalld)
- Crie uma variável adicional no arquivo Packer para permitir a escolha entre Oracle Linux 8 e 9
Solução de Problemas Comuns
A instalação não inicia com o Kickstart
Verifique:
- Se o boot_command está correto
- Se o arquivo Kickstart está no diretório http
- Se há erros de sintaxe no arquivo Kickstart
Timeout de SSH
Se o Packer não conseguir se conectar via SSH:
- Aumente o valor de
ssh_timeout
- Verifique se o usuário e senha no Kickstart correspondem aos definidos no Packer
- Verifique se o firewall está permitindo conexões SSH
Erros no script de limpeza
Se o script de limpeza falhar:
- Verifique permissões do script
- Verifique se todos os comandos são compatíveis com Oracle Linux 9
- Tente executar os comandos manualmente para identificar o problema
Conclusão
Neste tutorial, aprendemos a criar uma imagem automatizada do Oracle Linux 9 usando Packer e Kickstart. Exploramos:
- Como criar um arquivo Kickstart para automação da instalação
- Como configurar o Packer para usar o Kickstart
- Como adicionar scripts de provisionamento para personalização
- Como construir e validar a imagem final
Esta abordagem permite criar imagens padronizadas e reproduzíveis do Oracle Linux, ideais para ambientes de produção, desenvolvimento ou testes.
No próximo tutorial, vamos explorar a criação de imagens para Debian usando o método Preseed, que oferece uma abordagem diferente para automação de instalações.