Post

Criação de Imagem Oracle Linux com Packer e Kickstart

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:

  1. Entender o que é o Kickstart e como ele funciona
  2. Criar um arquivo Kickstart personalizado para Oracle Linux
  3. Configurar o Packer para utilizar o Kickstart
  4. Adicionar scripts de provisionamento para personalização
  5. 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 brasileiro
  • lang pt_BR.UTF-8: Define o idioma como português do Brasil
  • timezone 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ático
  • clearpart --none --initlabel: Inicializa o rótulo do disco sem remover partições

Usuários

  • rootpw --lock: Bloqueia a conta root por segurança
  • user --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:

  1. Atualiza o sistema e instala pacotes essenciais (cloud-init, qemu-guest-agent)
  2. Configura o cloud-init para usar o datasource NoCloud
  3. Remove pacotes desnecessários e limpa caches
  4. Remove logs e arquivos temporários
  5. Remove identificadores únicos da máquina (machine-id, chaves SSH)
  6. 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 resultante
  • disk_size: Tamanho do disco em MB (16GB neste caso)
  • iso_url: URL da ISO do Oracle Linux 9
  • iso_checksum: Checksum SHA256 da ISO para verificação

Configuração QEMU

  • memory: 2GB de RAM para a VM
  • accelerator: Usa KVM para melhor desempenho
  • disk_interface e net_device: Usa dispositivos virtio para melhor desempenho
  • format: 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:

  1. Pressiona a tecla “up” para selecionar a opção de instalação
  2. Pressiona “tab” para editar os parâmetros de boot
  3. Adiciona o parâmetro inst.ks=http://{{.HTTPIP}}:{{.HTTPPort}}/ks.cfg que aponta para nosso arquivo Kickstart
  4. 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:

  1. Copiam o script de limpeza para a VM
  2. Tornam o script executável
  3. 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á:

  1. Baixar a ISO do Oracle Linux (se ainda não estiver em cache)
  2. Iniciar uma VM QEMU/KVM
  3. Inicializar a instalação com o Kickstart
  4. Aguardar a conclusão da instalação
  5. Conectar-se via SSH
  6. Executar os provisionadores
  7. Desligar a VM
  8. 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:

  1. Modifique o arquivo Kickstart para instalar pacotes adicionais de sua escolha
  2. Altere o particionamento para usar LVM com partições separadas para /, /var e /home
  3. Adicione um script pós-instalação que configure o firewall (firewalld)
  4. 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:

  1. Como criar um arquivo Kickstart para automação da instalação
  2. Como configurar o Packer para usar o Kickstart
  3. Como adicionar scripts de provisionamento para personalização
  4. 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.

Referências

This post is licensed under CC BY 4.0 by the author.