Utilizando o Vagrant – parte 4

Vagrant-4_Docker

Esta é a parte final d(a introdução a)o Vagrant e antes convém relembrar que na parte anterior customizei uma box já existente para criar uma específica e de acordo com as minhas necessidades.

Agora, conforme prometido, é a vez de experimentar um outro provedor (provider) e falar sobre um recurso incorporado na versão 1.7 da ferramenta, o push.

Provedores

São nos provedores que as máquinas virtuais são criadas, executadas e gerenciadas e, com relação a eles, na primeira parte, comentei que:

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.

Sendo assim, após a instalação, o Vagrant já está apto a utilizar tanto o Docker quanto o VirtualBox — vou desconsiderar o Hyper-V já que não uso Windows e não tem nenhum aqui por perto no momento 🙂

Vagrant com Docker

Vamos tentar uma box em Docker:

$ mkdir -p ~/Vagrant/docker
$ cd ~/Vagrant/docker
$ vagrant init tknerr/baseimage-ubuntu-14.04
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.

O nome da box que estou utilizando é justamente por conta da necessidade de usar uma compatível com o Docker e a diferença fica na hora de levantar a máquina virtual:

$ vagrant up --provider docker
Bringing machine 'default' up with 'docker' provider...
==> default: Box 'tknerr/baseimage-ubuntu-14.04' could not be found.
Attempting to find and install...
    default: Box Provider: docker
    default: Box Version: >= 0
...
==> default: Creating the container...
    default:   Name: docker_default_1462365594
    default:  Image: tknerr/baseimage-ubuntu:14.04
    default: Volume: /home/giovanni/Vagrant/docker:/vagrant
    default:   Port: 127.0.0.1:2222:22
    default:  
    default: Container created: 57f701feec4a7a4e
==> default: Starting container...
...
==> default: Machine booted and ready!

Basta usar vagrant ssh para acessar o contêiner (ou máquina virtual se preferir), naturalmente e a única diferença mesmo é ter de explicitar o tipo do provedor — isto é importante para evitar que ele tente utilizar o padrão, ou seja, o VirtualBox.

Desejando não mais usar o contêiner basta usar vagrant destroy:

$ vagrant destroy
    default: Are you sure you want to destroy the 'default' VM? [y/N]
==> default: Stopping container...
==> default: Deleting the container...

E para todos os efeitos ele abstrai o funcionamento do Docker e te apresenta o mesmo modo de operação do Vagrant.

Novamente a idempotência

Peguei o script de instalação do Express usado nas segunda e terceira partes e alterei o nome da box no “Vagrantfile”:

$ cat Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(2) do |config|
  config.vm.box = "tknerr/baseimage-ubuntu-14.04"
  config.vm.box_check_update = true 
  config.vm.provider "virtualbox" do |vb|
    vb.customize ["modifyvm", :id, "--memory", "1024"]
    vb.customize ["modifyvm", :id, "--cpus", "2"]
  end  
  config.vm.provision "shell", path: "./vagrant_express_setup_2.sh"
  config.vm.network "forwarded_port", guest: 3000, host: 8000
end

Daí bastou usar  “vagrant up –provider=docker” e, após o término da instalação, usar “vagrant ssh -c /vagrant/run” para executar o servidor Express tal qual nos outros exemplos:

$ vagrant ssh -c /vagrant/run

> app@0.0.0 start /vagrant/app
> node ./bin/www

GET / 200 285.153 ms - 170
GET /stylesheets/style.css 200 4.474 ms - 111
GET /favicon.ico 404 32.562 ms - 964

E pronto o mesmo resultado que foi obtido em máquinas virtuais do VirtualBox também em um contêiner do Docker e utilizando apenas a estrutura do Vagrant.

Expandindo o Vagrant

Um recurso interessante do Vagrant é a possibilidade de expandi-lo com o auxílio de plugins. A documentação oficial explica detalhadamente como criá-los — obviamente que em Ruby — e uma lista detalhada destes pode ser obtida na Wiki do projeto no GitHub.

Por pura preguiça — ao menos estou assumindo — escolhi instalar o vagrant-lxc, o plugin que adiciona suporte a contêineres em LXC:

$ vagrant plugin install vagrant-lxc
Installing the 'vagrant-lxc' plugin. This can take a few minutes...
Installed the plugin 'vagrant-lxc (1.2.1)'!
$ vagrant plugin list
vagrant-lxc (1.2.1)
vagrant-share (1.1.5, system)
$ vagrant init fgrehm/trusty64-lxc
[sudo] senha para giovanni: 
Bringing machine 'default' up with 'lxc' provider...
...
==> default: Starting container...
...
==> default: Machine booted and ready!
$ vagrant ssh
Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 4.2.0-35-generic x86_64)

 * Documentation:  https://help.ubuntu.com/
vagrant@vagrant-base-trusty-amd64:~$ _

Para não ser repetitivo não repetirei a instalação do Express aqui mas se quiser fazê-lo não esqueça de instalar os pacotes bridge-utils e redir antes de usar o vagrant up — os dois pacotes são exigências do plugin para implementar, respectivamente, o redirecionamento de portas e as redes privadas.

A parte “chata” foi que ele não criou um contêiner não privilegiado (executado com permissões de usuário comum). Repare que há um sudo solicitando minha senha logo após o vagrant up mas em um ambiente de testes isto não constitui assim um pecado mortal. 🙂

Vagrant em produção?

Por mais que eu tenha evitado explicitamente de usar os termos, exceto no último parágrafo, fica claro que o Vagrant é uma ferramenta voltada para a criação de ambientes para a homologação, garantia de qualidade e testes em geral e, mas aí dependendo muito do modo como se trabalha, ambientes de desenvolvimento. Mas não é recomendado para ambientes de produção e por este motivo a própria HashiCorp veio a desenvolver o Otto que, nas palavras deles, é o sucessor do Vagrant.

Vagrant push

A partir da versão 1.7 o Vagrant recebeu um novo recurso, o push e com ele é possível transferir a aplicação — ou como alguns gostam de dizer por aí, fazer o deploy — para o local correto assim que “tudo aquilo que precisava ser testado o foi”. É suportado o envio para o Atlas (da própria HasiCorp), Heroku, (o bom e velho) FTP, SFTP ou então por execução local de um script que fará a transferência dos arquivos — rsync, scp, cp, etc.

Por padrão, o que ele faz é enviar o conteúdo do diretório que é compartilhado na máquina virtual como o “/vagrant” para um host remoto e para exemplificar eu adaptei o “Vagrantfile” para conter algo mais ou menos assim:

# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(2) do |config|
  ...
  config.push.define "ftp" do |push|
    push.host = "«o nome ou IP do host»"
    push.username = "«o login do usuário»"
    push.password = "«a senha do usuário»"
    push.destination = "«caminho da aplicação»"
  end
end

Exceto pela senha, as outras informações poderão ser facilmente “adivinhadas” logo abaixo. 🙂

Para usá-lo, basta executar:

$ vagrant push
Uploading /home/giovanni/Vagrant/express3 to giovanni@192.168.0.12:
/Users/giovanni/Vagrant

E pronto, os arquivos vão parar em outro lugar.

Vagrant-4_MacOSX

Claro, apenas lembrando que somente os dados da aplicação foram enviados e não a máquina virtual em si.

E finalizando

Aqui termina esta introdução ao Vagrant onde apresentei as principais características e recursos da ferramenta, ou seja, utilização, configuração, customização de máquinas virtuais (as boxes), adição de novas funcionalidades e atualização da aplicação em produção.

Claro, sobrou ainda bastante coisa mas que ficarão para uma outra oportunidade… 🙂

Anúncios

Um comentário sobre “Utilizando o Vagrant – parte 4

  1. Pingback: Utilizando o Vagrant, 4ª parte - Peguei do

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