Utilizando o Vagrant – parte 1

Vagrant-1

Há algum tempo comecei a olhar com alguma atenção ao Vagrant mas então o Docker cruzou meu caminho e como parecia “mais interessante” e fazendo a “mesma coisa” acabei mudando o foco e deixando-o de lado. Mas como nunca é tarde de mais, resolvi dar alguma atenção para ele e para o Packer — outra ferramenta produzida pelo HashiCorp e que até me ajudou a preencher algumas dúvidas que tinha com relação ao Vagrant.

O que é o Vagrant?

O Vagrant é uma ferramenta desenvolvida pela HashiCorp, escrita em Ruby¹ e que permite automatizar o processo de criação e customização de máquinas virtuais. Tornando estas tarefas idempotentes²,  isto é, aplicáveis em um número indefinido de vezes sem que o resultado seja alterado.

Por padrão são suportados Docker, Hyper-V e VirtualBox mas outros “provedores” poder ser adicionados através de plugins — aliás, a própria HashiCorp desenvolve e comercializa um específico para VMware mas se você quiser pode até desenvolver um “provedor” só seu.

Assim ele permite a criação de máquinas virtuais que são “prontas para o uso”, com versões específicas de sistema operacional e ferramentas já previamente instaladas e que podem rapidamente ser utilizadas para o teste de novas versões de uma aplicação — as tais golden images são basicamente isto.

(¹) Já citar a linguagem de programação utilizada ajudará bastante, os arquivos do Vagrant são código em Ruby.

(²) O pessoal de DevOps parece curtir esta palavra… 🙂

Instalação

Como ele não está oficialmente disponível no CentOS e as versões 1.6.5 e 1.7.4 as disponíveis, respectivamente, nos repositórios da Debian e Ubuntu, convém baixar a versão 1.8.1 — a mais atual — diretamente da página do projeto.

Lá estão disponíveis pacotes RPM e DEB nas versões de 32-bit e 64-bit, para baixar e instalar.

A documentação do Vagrant cita que ele está também disponível como um RubyGem mas este método de instalação não é mais suportado, não deve ser utilizado e versões instaladas deste modo devem ser removidas antes de se atualizar.

Usando o Vagrant

Por pura praticidade inverti a ordem e assim, sem muitas explicações e mostrando o Vagrant na prática:

$ mkdir -p ~/Vagrant/Trusty64
$ cd ~/Vagrant/Trusty64
$ vagrant init ubuntu/trusty64
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

Primeiro crio um diretório para armazenar meu novo projeto e depois inicializo-o ao mesmo tempo em que já defino qual máquina virtual pré-configurada, ou box (para usar a nomenclatura do Vagrant), que usarei.

Daí executo:

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'ubuntu/trusty64' could not be found.
Attempting to find and install...
    default: Box Provider: virtualbox
    default: Box Version: >= 0
==> default: Loading metadata for box 'ubuntu/trusty64'
...
==> default: Importing base box 'ubuntu/trusty64'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'ubuntu/trusty64' is up to date...
==> default: Setting the name of the VM:
Trusty64_default_1459089911177_65326
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few
minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
    default: The guest additions on this VM do not match the
...
    default: Guest Additions Version: 4.2.0
    default: VirtualBox Version: 5.0
==> default: Mounting shared folders...
    default: /vagrant => /home/giovanni/Vagrant/Trusty64

No final do processo ele terá baixado, configurado, colocado em execução uma máquina virtual contendo a versão 14.04 LTS do Ubuntu Server e até mesmo montado o diretório do projeto em “/vagrant”.

Claro, como não indiquei nenhum outro, ele considerou o Virtualbox como o provedor (nomenclatura do Vagrant) padrão e executou a máquina virtual em modo headless — logo não apareceu janela alguma na tela mas isto é configurável.

Para acessar a máquina virtual recém-criada use:

$ vagrant ssh
Welcome to Ubuntu 14.04.4 LTS (GNU/Linux 3.13.0-83-generic x86_64)
...
vagrant@vagrant-ubuntu-trusty-64:~$ ls -la /vagrant/
total 16
drwxrwxr-x 1 vagrant vagrant 4096 Mar 27 14:44 .
drwxr-xr-x 23 root root 4096 Mar 27 14:45 ..
drwxrwxr-x 1 vagrant vagrant 4096 Mar 27 14:44 .vagrant
-rw-rw-r-- 1 vagrant vagrant 3027 Mar 27 14:38 Vagrantfile

Quando ela não for mais necessária, basta destruí-la:

$ vagrant destroy
    default: Are you sure you want to destroy the 'default' VM? [y/N]
==> default: Forcing shutdown of VM...
==> default: Destroying VM and associated drives...

E pronto, ela será devidamente desligada e até mesmo removida da lista do seu VirtualBox.

Conceitos do Vagrant

Agora que ele foi apresentado mais algumas informações e explicações.

O arquivo “Vagrantfile”

É o componente principal do Vagrant contendo toda a informação necessária para que a ferramenta saiba o que fazer. Assim como acontece com o Chef ele é um programa em Ruby contendo uma  DSL e cada “Vagrantfile” corresponde a um projeto e assim, por razões óbvias, precisará ficar em um diretório distinto dos demais projetos.

Diversas funções do Vagrant consultam este arquivo para justamente saber o “que” e “com quem” fazer. Por exemplo “vagrant up” ou “vagrant destroy” consultarão o “Vagrantfile” para justamente saber de quem se trata as ações de inicialização ou destruição, assim como se elas podem ser realizadas.

As caixas

As boxes (manterei o gênero da palavra em português) funcionam como modelos que são utilizados pelo Vagrant para a criação das máquinas virtuais dos projetos, são geralmente baixadas por demanda do Atlas (já explico), de alguma URL customizada que você especifique ou mesmo a partir de um arquivo local — uma box que você tenha criado, por exemplo, a partir do Packer.

É possível obter uma lista das boxes que já estão disponíveis localmente com:

$ vagrant box list
hashicorp/precise32     (virtualbox, 1.0.0)
hashicorp/precise64     (virtualbox, 1.1.0)
ubuntu/trusty64         (virtualbox, 20160323.0.0)

Repare que a lista contém não só o nome de cada box como também o provedor — no caso apenas o VirtualBox — e também a versão desta.

Removendo uma box

Para remover use:

$ vagrant box remove hashicorp/precise32
Removing box 'hashicorp/precise32' (v1.0.0) with provider
'virtualbox'...

Ele removerá assim sem nem mesmo pedir confirmação? Pois é, vale lembrar que esta lista é um cache e que ele poderá baixar o arquivo novamente se for necessário. Portanto, exceto no caso de uma box  que esteja sendo utilizada, ele não reclamará.

Havendo algum projeto ativo, isto é, você usou “vagrant up” mas não “vagrant destroy” (ou seja, a máquinas virtual ainda aparece na lista do VirtualBox)  o resultado será algo mais ou menos assim:

$ vagrant box remove hashicorp/precise64
Box 'hashicorp/precise64' (v1.1.0) with provider 'virtualbox'
appears to still be in use by at least one Vagrant environment.
Removing the box could corrupt the environment. We recommend
destroying these environments first:

default (ID: 5c14b7ca3f7f421d8ad733bacfb77fa8)

Are you sure you want to remove this box? [y/N] _

Claro, aqui se que está sendo mal educado, ou apenas apressado. Basta confirmar a remoção e depois executar o devido “vagrant destroy” no projeto — eu recomendaria fazer o contrário, destruindo primeiro a máquina virtual e depois removendo a box mas a ordem fica a seu critério. 🙂

Adicionando boxes

Para acrescentar uma nova box use:

$ vagrant box add --provider virtualbox centos/7
==> box: Loading metadata for box 'centos/7'
 box: URL: https://atlas.hashicorp.com/centos/7
==> box: Adding box 'centos/7' (v1602.02) for provider: virtualbox
 box: Downloading: https://atlas.hashicorp.com/centos/boxes/7/
versions/1602.02/providers/virtualbox.box
==> box: Successfully added box 'centos/7' (v1602.02) for
'virtualbox'!

E só para confirmar se foi realmente adicionada:

$ vagrant box list
centos/7 (virtualbox, 1602.02)
ubuntu/trusty64 (virtualbox, 20160323.0.0)

Mas como é que eu “adivinho” o nome correto das boxes? Simples, pesquisando no Atlas.

Sobre o Atlas

Vagrant-1_CentOS7

O Atlas contém, além das ferramentas que a HashiCorp disponibiliza aos seus clientes corporativos, o serviço de catálogo e indexação das boxes do Vagrant disponibilizadas à comunidade de usuários. Você até pode criar uma conta e publicar suas próprias boxes por lá.

A primeira porção do nome de cada box identifica seu mantenedor, no caso eu estive basicamente trabalhando com imagens oficiais mantidas pela HashiCorp, Ubuntu e pelo projeto CentOS. Mas isto foi uma decisão minha, não há obrigatoriedade disto.

Fim da primeira parte

Algo interessante que vale a pena notar são algumas similaridades de operação e conceitos que o Vagrant guarda, ao seu modo, tanto como o Chef quanto com o Docker. Aliás estes se integram em algum nível com ele para ampliar funcionalidades. Na segunda parte será a vez de detalhar e mexer com o “Vagrantfile” fazendo-o customizar a máquina virtual de um projeto. Até lá!

Anúncios

7 comentários sobre “Utilizando o Vagrant – parte 1

  1. Pingback: Vagrant – parte 2 | giovannireisnunes

  2. Pingback: Vagrant – parte 4 | giovannireisnunes

  3. Pingback: Introdução ao Packer | giovannireisnunes

  4. Pingback: Usando o Git – parte 1 | giovannireisnunes

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

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

  7. Pingback: Jenkins – 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