Vagrant: Crie sua própria box e disponibilize-a na Vagrant Cloud – DevOps Parte 2

Em DevOps, Sistemas operacionais por Jonathan Maia

No artigo anterior sobre ferramentas de apoio a times DevOps, vimos como turbinar nossas máquinas virtuais com o Vagrant, que é um gerenciador de máquinas virtuais bastante versátil e com centenas de boxes (máquinas) já disponíveis para uso. Mas como podemos gerar nossa própria box do Vagrant ? E como disponibilizá-la para terceiros ?

Existem duas formas de criar uma box do Vagrant: através do próprio Vagrant (abordaremos neste artigo) e utilizando o Packer (abordaremos em um próximo artigo). O Packer é a ferramenta oficial (também mantida pela HashiCorp) para a construção de boxes do Vagrant.

Antes de colocar a mão na massa, vamos refletir um pouco. Já vimos que o Vagrant pode chamar ferramentas de provisionamento (ex: Shell, Puppet, Chef, etc) para a configuração do ambiente logo após a inicialização da máquina. Daí, surge a dúvida: por que criar uma box específica se eu posso utilizar apenas o provisionamento ?

Por que gerar uma box se eu tenho o provisionamento ?

Por que gerar uma box se eu tenho o provisionamento ?

O interessante do provisionamento é a possibilidade de versioná-lo (em um Git da vida), mas existem algumas situações que justificam a criação de uma box própria:

  • Se você precisa de uma alteração no Kernel, que é uma tarefa complexa de integrar ao provisionamento do Vagrant (pode ter que recompilar o Kernel, reiniciar a máquina, etc). Aqui, você pode usar sua máquina virtual base (ou uma box já pronta), fazer as alterações no Kernel e disponibilizar uma nova box já com a versão desejada do Kernel;
  • Se o seu provisionamento leva muito tempo, pode ser interessante já gerar uma box com a máquina provisionada para agilizar o acesso ao ambiente. Mas lembre, é sempre interessante manter o processo de provisionamento versionado para quando você desejar modificá-lo (daí, é só gerar uma nova versão da box com a máquina já provisionada);
  • Se você já tem uma máquina virtual pronta e quer apenas utilizá-la no Vagrant. O Packer é capaz de converter uma appliance OVF ou OVA do VirtualBox para uma box do Vagrant. Só é necessário obedecer a alguns critérios, que veremos quando abordarmos o Packer;
  • Se sua distribuição favorita não está disponível no repositório do Vagrant . Nesse caso, obrigatoriamente, você precisará utilizar o Packer para a criação da box.
Criando uma box com o próprio Vagrant

A primeira opção (e mais simples) é utilizar o próprio Vagrant.

Um dos comandos do Vagrant é o package, que transforma uma máquina em execução no Vagrant em uma box para reutilizações futuras.

Vamos utilizar a máquina que já provisionamos na postagem como turbinar nossas máquinas virtuais com o Vagrant. Apenas para fins didáticos, imagine que o provisionamento do Apache fosse bem demorado (levando mais de 30 minutos), e quiséssemos já deixar uma box pronta para rápido acesso dos desenvolvedores. Já pensou, se todas as vezes que desejassem subir um ambiente, os desenvolvedores tivessem que aguardar 30 minutos?

30 minutos de espera ? No Way

30 minutos de espera ?

O código base para o provisionamento da máquina do artigo anterior está disponível no Github. Entre na pasta do Vagrantfile e faça um up:

D:\git\devops\01_vagrant_ubuntu_apache> vagrant up

Aguarde e em poucos minutos a máquina já deve estar provisionada e com o Apache sendo executado.

Agora, vamos observar as boxes que estão disponíveis em nosso ambiente:

D:\git\devops\01_vagrant_ubuntu_apache> vagrant box list
ubuntu/trusty64 (virtualbox, 20170811.0.1)
D:\git\devops\01_vagrant_ubuntu_apache>

Apenas a box ubuntu/trusty64 está disponível. Se você abrir a interface do VirtualBox, deve existir uma máquina virtual sendo executada:

VirtualBox

Uma máquina sendo executada no VirtualBox

O que queremos agora é gerar uma nova box a partir dessa máquina virtual. Para isso, vamos usar o vagrant package:

D:\git\devops\01_vagrant_ubuntu_apache> vagrant package
==> default: Attempting graceful shutdown of VM...
==> default: Clearing any previously set forwarded ports...
==> default: Exporting VM...
==> default: Compressing package to: D:/git/devops/01_vagrant_ubuntu_apache/package.box

Observe que o arquivo package.box foi criado e ficou com 445MB de tamanho. Fácil, né ?

Utilizando uma box criada

E agora, já posso usar a box ? Ainda não, temos primeiro que instalá-la localmente ou disponibilizá-la externamente (na Vagrant Cloud ou em um servidor web local).

Para instalar a box localmente é muito simples:

D:\git\devops\01_vagrant_ubuntu_apache> vagrant box add --name eunati/apache2 package.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'eunati/apache2' (v0) for provider:
    box: Unpacking necessary files from: file://D:/git/devops/01_vagrant_ubuntu_apache/package.box
    box: Progress: 100% (Rate: 1114M/s, Estimated time remaining: --:--:--)
==> box: Successfully added box 'eunati/apache2' (v0) for 'virtualbox'!

Observe que coloquei o nome da box eunati/apache2 e apontei para o arquivo package.box (gerado com vagrant package). Agora sim, a box está instalada:

D:\git\devops\01_vagrant_ubuntu_apache> vagrant box list
eunati/apache2 (virtualbox, 0)
ubuntu/trusty64      (virtualbox, 20170811.0.1)

Para usar a box em questão, vamos criar um novo Vagrantfile na pasta git\devops\02_vagrant_eunati_apache (conteúdo no Github). O Vagrantfile ficará assim:

Vagrant.configure("2") do |config|
  config.vm.box = "eunati/apache2"
  config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"
  config.vm.synced_folder "./html", "/var/www/html/hello"
end

Percebeu a diferença para o Vagrantfile do artigo anterior? Observe que não precisamos mais do provisionamento (config.vm.provision), pois o Apache já está instalado na box eunati/apache2.

Também observe que na nova versão do Vagrantfile não fica claro que o Apache está instalado na máquina (o que é ruim, por isso recomendo manter o Vagrantfile que gerou a box sempre versionado).

Certifique-se que a VM anterior (01_vagrant_ubuntu_apache) está desligada, faça um vagrant up da nova VM (02_vagrant_eunati_apache) e acesse http://localhost:8080/hello .

Apenas para garantir que tudo está funcionando na nova máquina virtual, edite o arquivo 02_vagrant_eunati_apache\html\index.html para apresentar o título “Hello World – Primeira Box Vagrant” e acesse novamente http://localhost:8080/hello . Você deve estar vendo:

Hello World - Nossa primeira Box do Vagrant

Hello World – Nossa primeira Box do Vagrant

Disponibilize sua box na Vagrant Cloud

Problema: nossa box só está disponível localmente.

Podemos disponibilizá-la na Cloud do Vagrant, assim, outras pessoas poderão localizar a box online.

Crie seu cadastro e clique em Create a new Vagrant Box.

Cloud Vagrant - Envie sua box

Cloud Vagrant – Envie sua box

Informe o nome da box (eunati/apache2), adicione uma breve descrição e clique em Create box.

Criar Box

Crie a Box

Depois, crie uma versão e adicione o Virtualbox como provider. Nesse momento, você escolherá o arquivo package.box para upload.

Escolha o provider e faça o upload do arquivo .box

Escolha o provider e faça o upload do arquivo .box

Após o upload, certifique-se que a versão está released e pronto. Nos seus Vagrantfiles, é só usar a box eunati/apache2 e o download da box será realizado a partir da Vagrant Cloud (que permite upload ilimitado para boxes públicas).

Se você não quiser disponibilizar sua box publicamente, é possível pagar uma mensalidade na Vagrant Cloud para poder fazer upload de boxes privadas (enquanto escrevo esse artigo: 5 dólares por mês para uso pessoal e 25 para uso organizacional).

Disponibilize sua box em um servidor web local

Se você não quiser gastar um centavo com a Vagrant Cloud, é possível disponibilizar um servidor web na sua rede local e colocar o arquivo .box nele (junto com um arquivo .json que descreve a box).

Como exemplo, vamos supor que a URL do servidor web na sua rede local é http://web . Coloque o arquivo .box no endereço:

http://web/vagrant/eunati_apache2.box

Na mesma pasta do arquivo .box, deve ser criado o arquivo eunati_apache2.json com o conteúdo:

Observe que é na propriedade url que indicamos o endereço do arquivo .box.

Daí, nos seus Vagrantfiles, utilize a propriedade adicional config.vm.box_url apontando para o arquivo .json que descreve a box:

Vagrant.configure("2") do |config|
  config.vm.box = "eunati/apache2"
  config.vm.box_url = "http://web/vagrant/eunati_apache2.json"
  config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"
  config.vm.synced_folder "./html", "/var/www/html/hello"
end

Por que o .json ? É nele onde as versões da box podem ser descritas, e o próprio Vagrant pode te notificar quando uma nova versão de uma box for disponibilizada. Legal, né?

Conclusão

Uma terceira possibilidade para armazenar suas boxes é no Atlas, mas aqui vou deixar apenas a referência, pois nunca trabalhei com ele.

Próximos artigos:

Gerenciamento de configuração e automação de servidores – DevOps Parte 3

Puppet: Instalação e fundamentos – DevOps Parte 4

Puppet: Subindo seus primeiros serviços e o Docker – DevOps Parte 5

Docker e containers: Fundamentos – DevOps Parte 6

Espero que você tenha gostado! Agradeço se você puder curtir e compartilhar esse artigo em suas redes sociais.

Curta nossas páginas nas redes sociais para acompanhar novas postagens.

Em breve, mais conteúdos de qualidade para você aqui no Blog Eu na TI, o seu Blog sobre Tecnologia da Informação.

Um forte abraço e até mais.

Deixe uma resposta