Introdução ao Packer

Packer-1_abertura

A partir do Vagrant é possível baixar a imagem de uma máquina virtual já pronta, criar uma versão customizada dela utilizando o vagrant package e até disponibilizá-la publicamente através do Atllas. Mas como fazer para criar uma box a partir do zero? É aqui que entra uma outra ferramenta da HashiCorp, o Packer. Que junto com o Vagrant compõe alguns dos ingredientes da ração para cachorro que eles produzem e consomem por lá.

O programa

Sua função é criar imagens de ambientes operacionais de forma automatizada, reproduzível, portátil e unificada. Isto é, novos ambientes são criados sem a necessidade de interferência humana, obtendo-se sempre o mesmo resultado¹ em diversas soluções de virtualização (Amazon EC2, Docker, QEMU, VirtualBox etc) e com toda a configuração centralizada em um só arquivo.

(¹) Novamente a tal da idempotência. 🙂

Conceitos básicos

O principal componente do Packer é o modelotemplate — que consiste em um arquivo JSON contendo as instruções e procedimentos necessários para a criação das imagens. A estrutura deste arquivo contém um conjunto pré-determinado de chaves:

  • Builders — É a única chave obrigatória em todo o arquivo e, literalmente, a principal delas. Contém as informações necessárias para a criação das imagens para cada uma das plataformas suportadas pelo Packer. É “mais ou menos” o que no Vagrant é chamado de Provider.
    • No momento em que escrevo a lista das plataformas suportadas é a seguinte: Amazon EC2, Azure Resource Manager, Custom³, DigitalOcean, Docker, Google Computer Engine, Null², OpenStack, Parallels, QEMU, VirtualBox e VMware.
  • Provisioners — Esta funciona da mesma forma que seu homônimo do Vagrant e é usado para a instalação e configuração de software dentro da nova imagem. São suportados, além do shell script, ferramentas como Ansible, Chef, Puppet, Salt etc.
  • Post-Processors — Após a imagem da máquina virtual ser criada com as informações contidas em builders e configuradas com o que está em provisioners elas são chamadas de artefatos (artifacts). Aqui que fica a informação sobre o que fazer com eles, ou seja, se ela será usada localmente como uma box do Vagrant, compartilhada no Amazon, Atlas, Docker, vSphere etc.
  • Variables — Por último, mas nem por isto menos importante, fica a parte do arquivo que contém as variáveis definidas pelo usuário para serem utilizadas pela ferramenta (útil para não codificar chaves, senhas ou mesmo URL — deixando o arquivo mais flexível e de fácil manutenção).

Existem outras chaves válidas mas preferi citar apenas aquelas que afetam mais diretamente a criação das imagens. E para maiores informações consulte a documentação da ferramenta.

(²) É usado para depuração dos modelos. Não criando imagens e apenas estabelecendo uma conexão SSH.

(³) Se a sua plataforma não está suportada é possível com o Custom adaptar a ferramenta para utilizá-lo sem necessariamente mexer na estrutura do código.

Instalação

A instalação do Packer é bastante simples, baixe a versão correspondente ao seu sistema operacional e arquitetura, descompacte, copie/mova para o local (correto) de sua preferência e está pronto.

Dentro do arquivo está tudo o que é necessário para sua execução e funcionamento.

Usando o Packer

Na verdade nada te impede de criar seu próprio arquivo de modelo do zero porém, por praticidade, fica mais simples adaptar um arquivo já existente para suas necessidades — mas compensar estudar os arquivos para ter uma ideia do que esta sendo realizado.

Para este exemplo usarei um dos modelos criados pelo Satoshi Matsumoto que estão disponíveis no GitHub. Então é clonar o repositório:

$ mkdir ~/Packer
$ cd ~/Packer
$ git clone https://github.com/kaorimatz/packer-templates.git
Cloning into 'packer-templates'...
remote: Counting objects: 1562, done.
remote: Total 1562 (delta 0), reused 0 (delta 0), pack-reused 1562
Receiving objects: 100% (1562/1562), 241.67 KiB | 231.00 KiB/s, done.
Resolving deltas: 100% (980/980), done.
Checking connectivity... done.

Ele contém modelos para a instalação das principais distribuições de Linux e também para FreeBSD e OpenBSD.

Criando uma imagem

Usando um dos modelos baixados para criar uma box com a versão 8.4 Jessie da Debian em 64-bit:

$ cd ~/Packer
$ packer build packer-templates/debian-8.4-amd64.json
virtualbox-iso output will be in this color.

==> virtualbox-iso: Cannot find "Default Guest Additions ISO" in
vboxmanage output (or it is empty)
==> virtualbox-iso: Downloading or copying Guest additions checksums
    virtualbox-iso: Downloading or copying: http://download.virtualbox.
org/virtualbox/5.0.14/SHA256SUMS
==> virtualbox-iso: Downloading or copying Guest additions
    virtualbox-iso: Downloading or copying: http://download.virtualbox.
org/virtualbox/5.0.14/VBoxGuestAdditions_5.0.14.iso
    virtualbox-iso: Download progress: 1%
    ...
    virtualbox-iso: Download progress: 99%
==> virtualbox-iso: Downloading or copying ISO
    virtualbox-iso: Downloading or copying: http://cdimage.debian.org/
debian-cd/8.4.0/amd64/iso-cd/debian-8.4.0-amd64-netinst.iso
    virtualbox-iso: Download progress: 0%
    ...
    virtualbox-iso: Download progress: 100%
==> virtualbox-iso: Starting HTTP server on port 8220
==> virtualbox-iso: Creating virtual machine...
==> virtualbox-iso: Creating hard drive...
==> virtualbox-iso: Creating forwarded port mapping for communicator
(SSH, WinRM, etc) (host port 3312)
==> virtualbox-iso: Executing custom VBoxManage commands...
    virtualbox-iso: Executing: modifyvm packer-debian-8.4-amd64
--memory 512
    virtualbox-iso: Executing: modifyvm packer-debian-8.4-amd64
--cpus 1
==> virtualbox-iso: Starting the virtual machine...
==> virtualbox-iso: Waiting 5s for boot...
==> virtualbox-iso: Typing the boot command...

Neste momento que o VirtualBox aparecerá na sua tela.

Pac ker-1_Debian_boot.png

Como não custa avisar : não toque em nada! 🙂

Ah sim, deixando chave headless como “true” dentro de builders no arquivo de modelo o VirtualBox deixará de exibir a janela na tela.

O resto do procedimento é automático, ele “tomará conta” da máquina virtual e cuidará de “digitar” e enviar os parâmetros necessários; enquanto a instalação acontece o Packer ficará quietinho aguardando a instalação ser concluída e ocorrer o primeiro reboot do novo sistema operacional.

Aí ele fará o resto a partir de uma conexão SSH:

...
==> virtualbox-iso: Waiting for SSH to become available...
==> virtualbox-iso: Uploading VirtualBox version info (5.0.14)
==> virtualbox-iso: Uploading VirtualBox guest additions ISO...
==> virtualbox-iso: Provisioning with shell script: scripts/debian/
virtualbox.sh
    virtualbox-iso: + sudo apt-get -y install bzip2
    virtualbox-iso: Reading package lists...
    virtualbox-iso: Building dependency tree...
    virtualbox-iso: Reading state information...
...
==> virtualbox-iso: Running post-processor: vagrant
==> virtualbox-iso (vagrant): Creating Vagrant box for 'virtualbox'
provider
    virtualbox-iso (vagrant): Copying from artifact: output-debian-
8.4-amd64/packer-debian-8.4-amd64-disk1.vmdk
    virtualbox-iso (vagrant): Copying from artifact: output-debian-
8.4-amd64/packer-debian-8.4-amd64.ovf
    virtualbox-iso (vagrant): Renaming the OVF to box.ovf...
    virtualbox-iso (vagrant): Compressing: Vagrantfile
    virtualbox-iso (vagrant): Compressing: box.ovf
    virtualbox-iso (vagrant): Compressing: metadata.json
    virtualbox-iso (vagrant): Compressing: packer-debian-8.4-amd64-
disk1.vmdk
Build 'virtualbox-iso' finished.

==> Builds finished. The artifacts of successful builds are:
--> virtualbox-iso: 'virtualbox' provider box: debian-8.4-amd64.box

O resultado final é uma box pronta para ser utilizada no Vagrant.

Windows

Aliás, algo que não cheguei a citar com relação ao Vagrant é que ele também suporta a criação de boxes em Windows. Mas como o licenciamento proíbe que você crie boxes para disponibilizar publicamente você acaba tendo que obrigatoriamente fazer uma escala no Packer para produzir e disponibilizar boxes que você venha a precisar. Para tal use os modelos criados pelo Matt Wrock — há uma publicação do blog dele onde está detalhado o procedimento.

Encerrando

Vale ainda lembrar que o Packer não serve apenas para produzir as máquinas virtuais para o Vagrant criar os “ambientes de teste” dele como funciona para a automatização a criação destas também em ambientes como Amazon EC2, Docker ou mesmo VMware. Ampliando bastante suas opções de uso.

E antes de terminar esta publicação seria originalmente parte da série sobre o Vagrant mas como ela ficou maior que o planejado eu preferi destacá-la do conjunto. 🙂

Anúncios

3 comentários sobre “Introdução ao Packer

  1. Pingback: Introdução ao Packer - Peguei do

  2. Pingback: Primeiros passos em AWS e AWS CLI | giovannireisnunes

  3. Pingback: Usando o Consul – parte 1 | giovannireisnunes

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s