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 ?
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?
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:
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:
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.
Informe o nome da box (eunati/apache2), adicione uma breve descrição e clique em Create box.
Depois, crie uma versão e adicione o Virtualbox como provider. Nesse momento, você escolherá o arquivo package.box para upload.
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.
Olá, sou Jonathan Maia, marido, pai, apaixonado por tecnologia, gestão e produtividade. Ocupo o cargo de Secretário de Tecnologia da Informação e Comunicação do Tribunal Regional do Trabalho do Ceará (TRT7) desde 2021, onde ingressei como servidor público federal (analista de TIC) no ano de 2010. Fui diretor da Divisão de Sistemas de TIC do TRT7 entre 2018 e 2020 e também tenho experiência prévia na Dataprev, Serpro e Ponto de Presença da Rede Nacional de Ensino e Pesquisa (RNP) no Ceará.
Graduado em ciências da computação pela Universidade Federal do Ceará e especialista em gerenciamento de projetos de TIC pela Universidade do Sul de Santa Catarina. Detentor das certificações em gestão e inovação: Project Management Professional © (PMP), Professional Scrum Master II © (PSM II), Professional Scrum Master I © (PSM I), Professional Scrum Product Owner I © (PSPO I), Kanban Management Professional © (KMP II), Certified Lean Inception Facilitator® (CLF), ISO 31000:2018 Risk Management Professional © e Project Thinking Essentials.
Desenvolvedor Full Stack, possuo experiência em diversas arquiteturas / plataformas de desenvolvimento. Já tive experiências profissionais em redes metropolitanas de alta velocidade (GigaFOR/RNP), business intelligence, desenvolvimento de sistemas, gestão de projetos e produtos, governança, etc. Experiência em dezenas de projetos com abordagens de gestão ágeis, híbridas e tradicionais, incluindo projeto com menção honrosa no Prêmio de Excelência em Governo Eletrônico (e-Gov).
Com dezenas de turmas de capacitação, oficinas ou palestras ministradas nas temáticas de gestão ágil, gestão de projetos, tecnologia, inovação e produtividade nas seguintes instituições: Conselho Superior da Justiça do Trabalho (CSJT), Tribunal de Justiça do Distrito Federal e Territórios (TJDFT), Tribunais Regionais do Trabalho do Ceará (TRT7), Pará e Amapá (TRT8), Sergipe (TRT20), Rio Grande do Norte (TRT21), Tribunais Regionais Eleitorais do Ceará (TRE-CE), Mato Grosso do Sul (TRE-MS) e da Bahia (TRE-BA), Justiça Federal em Sergipe (JF-SE), Justiça Federal no Ceará (JF-CE), Companhia Siderúrgica do Pecém (CSP), Instituto Federal do Ceará (IF-CE), Instituto Federal do Rio Grande do Norte (IF-RN), Banco do Nordeste do Brasil (BNB), Gagliardi (Mobil), Udemy, Companhia Cearense de Gás (CEGÁS), Agile Trends Gov, Project Management Institute (PMI-CE), Cagece, Faculdade Estácio e Associação de Gerenciamento de Projetos do Mato Grosso do Sul (AGPMS).