Você está na página 1de 10

Gostou? Conheça formas de acompanhar o blog e não perca mais nenhum post, gratuitamente!

Fernando Jorge Mota


Dicas e ferramentas para facilitar o seu dia-a-dia como desenvolvedor

Vagrant – Máquinas virtuais automatizadas


para desenvolvimento
Quando você começa a trabalhar com programação, é a
principio normal que sua máquina fique um pouco
bagunçada. Bibliotecas pra cá, interpretadores pra lá,
compiladores ali, e assim vai. Depois de algum tempo,
você até se encontra de forma que consegue usar tudo o que você mesmo colocou e
dessa forma consegue fazer o que quer, ou seja, programar. O problema é quando
você precisa efetivamente replicar este mesmo ambiente em outras máquinas, como
a máquina dos seus colegas de trabalho,  por exemplo, ou quando você por algum
motivo perde todos os dados da máquina (como quando o HD resolve pifar, o que
costuma acontecer com certa frequência, pelo que vejo). É aí que a situação
complica, e por causa disso hoje vou falar um pouco sobre o Vagrant e inclusive
apresentar um breve tutorial sobre como usá-lo da maneira devida.

O Vagrant é, em poucas palavras, uma ferramenta para criar e distribuir


ambientes de desenvolvimento. Com esse propósito, sua real utilidade se mostra
mais clara: Facilitar o trabalho do desenvolvedor no teste de suas aplicações,
permitindo simular um ambiente mais fiel ao que será usado efetivamente em
produção, além de permitir o compartilhamento deste ambiente com outros
desenvolvedores. Tudo isso é feito com o uso de uma máquina virtual, que isola
todo um hardware virtual a partir da sua máquina física real, além de permitir uso
de sistema operacional e softwares próprios, por exemplo.

No caso do Vagrant, a plataforma de máquina virtual mais usada é o Virtualbox,


que, desenvolvido pela Oracle, é multi-plataforma e pode rodar uma grande
quantidade de sistemas operacionais facilmente, além de permitir limitar a
quantidade de memória RAM, CPU e disco livremente, por exemplo.  No caso, é o
Vagrant que, a partir de alguns poucos comandos (ou exatamente 1 comando, no
caso de máquinas virtuais já configuradas), inicia, provisiona e configura o
Virtualbox para que você possa usar a máquina virtual do jeito que bem preferir.
Gostou? Conheça formas de acompanhar o blog e não perca mais nenhum post, gratuitamente!

Um programador PHP, por exemplo, pode configurar a máquina para instalar o PHP,
Apache e MySQL da mesma forma que este o faria em um servidor real. E, ainda:
usando o mesmo sistema operacional do servidor real. Mas...qual a diferença entre
usar o Virtualbox diretamente e o Vagrant, nesse caso? Bom, usando o Vagrant, o
desenvolvedor consegue facilmente fazer configurações como redirecionamento de
portas (importante para um programador que trabalha com web), sincronizar pastas
entre a sua máquina física real e a máquina virtual de desenvolvimento e
provisionar a máquina virtual automaticamente de acordo com a sua vontade. Tudo
isso usando apenas alguns poucos arquivos de configuração e sem precisar repetir
procedimentos frequentemente. No fim, o Vagrant se destaca pela facilidade de
distribuição e manutenção das máquinas virtuais, garantindo assim um ambiente
de desenvolvimento eficiente e fácil de replicar.

Abaixo, segue um breve tutorial para iniciar os trabalhos com o Vagrant: (este
tutorial seja feito no Linux, mas se você tiver conhecimentos avançados em
Windows também é possível fazê-lo no Windows)

1) Primeiro, instale o Virtualbox, que é necessário para que o Vagrant possa criar
máquinas virtuais.
2) Depois, baixe e instale o Vagrant.
3) Agora, numa pasta vazia, execute o comando "vagrant init ubuntu/trusty64". O
resultado deve ser similar a esse:
fernando@fernando-notebook:~$
Gostou? # Primeiro,
Conheça formas de acompanhar vamos
o blog e não criar
perca maisuma pas
nenhum post, gratuitamente!
riada
fernando@fernando-notebook:~$ mkdir tutorial-vm
fernando@fernando-notebook:~$ cd tutorial-vm/
fernando@fernando-notebook:~/tutorial-vm$ # Agora, execute o

00:00

Recorded with asciinema

Com isso, o Vagrantfile será criado, e portanto a configuração básica da máquina


virtual está disponível. O conteúdo do Vagrantfile criado está disponível abaixo:

1 # -*- mode: ruby -*-


2 # vi: set ft=ruby :
3
4 # All Vagrant configuration is done below. The "2" in Vagrant.configure

5 # configures the configuration version (we support older styles for


6 # backwards compatibility). Please don't change it unless you know what

7 # you're doing.

8 Vagrant.configure(2) do |config|

9 # The most common configuration options are documented and commented below.

10 # For a complete reference, please see the online documentation at

11 # https://docs.vagrantup.com.

12
13 # Every Vagrant development environment requires a box. You can search for

14 # boxes at https://atlas.hashicorp.com/search.

15 config.vm.box = "ubuntu/trusty64"

16
17 # Disable automatic box update checking. If you disable this, then

18 # boxes will only be checked for updates when the user runs
19 # `vagrant box outdated`. This is not recommended.
20 # config.vm.box_check_update = false

21
22 # Create a forwarded port mapping which allows access to a specific port
23 # within the machine from a port on the host machine. In the example below,
Gostou? Conheça formas de acompanhar o blog e não perca mais nenhum post, gratuitamente!
24 # accessing "localhost:8080" will access port 80 on the guest machine.

25 # config.vm.network "forwarded_port", guest: 80, host: 8080


26
27 # Create a private network, which allows host-only access to the machine
28 # using a specific IP.

29 # config.vm.network "private_network", ip: "192.168.33.10"

30
31 # Create a public network, which generally matched to bridged network.
32 # Bridged networks make the machine appear as another physical device on

33 # your network.

34 # config.vm.network "public_network"

35
36 # Share an additional folder to the guest VM. The first argument is
37 # the path on the host to the actual folder. The second argument is

38 # the path on the guest to mount the folder. And the optional third

39 # argument is a set of non-required options.


40 # config.vm.synced_folder "../data", "/vagrant_data"

41
42 # Provider-specific configuration so you can fine-tune various
43 # backing providers for Vagrant. These expose provider-specific options.

44 # Example for VirtualBox:


45 #

46 # config.vm.provider "virtualbox" do |vb|

47 # # Display the VirtualBox GUI when booting the machine


48 # vb.gui = true

49 #

50 # # Customize the amount of memory on the VM:


51 # vb.memory = "1024"

52 # end

53 #

54 # View the documentation for the provider you are using for more

55 # information on available options.

56
57 # Define a Vagrant Push strategy for pushing to Atlas. Other push strategies

58 # such as FTP and Heroku are also available. See the documentation at

59 # https://docs.vagrantup.com/v2/push/atlas.html for more information.

60 # config.push.define "atlas" do |push|

61 # push.app = "YOUR_ATLAS_USERNAME/YOUR_APPLICATION_NAME"

62 # end

63
64 # Enable provisioning with a shell script. Additional provisioners such as

65 # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the

66 # documentation for more information about their specific syntax and use.

67 # config.vm.provision "shell", inline: <<-SHELL


68 # sudo apt-get update
Gostou? Conheça formas de acompanhar o blog e não perca mais nenhum post, gratuitamente!
69 # sudo apt-get install -y apache2
70 # SHELL

71 end

Vagrantfile hosted with by GitHub view raw

4) Agora, experimente apagar o # do inicio das linhas 25, 67, 68, 69 e 70. O arquivo
deverá ficar assim:

1 # -*- mode: ruby -*-


2 # vi: set ft=ruby :

3
4 # All Vagrant configuration is done below. The "2" in Vagrant.configure

5 # configures the configuration version (we support older styles for

6 # backwards compatibility). Please don't change it unless you know what

7 # you're doing.
8 Vagrant.configure(2) do |config|
9 # The most common configuration options are documented and commented below.

10 # For a complete reference, please see the online documentation at


11 # https://docs.vagrantup.com.
12
13 # Every Vagrant development environment requires a box. You can search for
14 # boxes at https://atlas.hashicorp.com/search.
15 config.vm.box = "ubuntu/trusty64"

16
17 # Disable automatic box update checking. If you disable this, then

18 # boxes will only be checked for updates when the user runs
19 # `vagrant box outdated`. This is not recommended.
20 # config.vm.box_check_update = false

21
22 # Create a forwarded port mapping which allows access to a specific port
23 # within the machine from a port on the host machine. In the example below,

24 # accessing "localhost:8080" will access port 80 on the guest machine.

25 # config.vm.network "forwarded_port", guest: 80, host: 8080


26
27 # Create a private network, which allows host-only access to the machine

28 # using a specific IP.

29 config.vm.network "private_network", ip: "192.168.33.10"

30
31 # Create a public network, which generally matched to bridged network.

32 # Bridged networks make the machine appear as another physical device on


33 # your network.

34 # config.vm.network "public_network"

35
36 # Share an additional folder to the guest VM. The first argument is
Gostou? Conheça formas de acompanhar o blog e não perca mais nenhum post, gratuitamente!
37 # the path on the host to the actual folder. The second argument is
38 # the path on the guest to mount the folder. And the optional third

39 # argument is a set of non-required options.

40 # config.vm.synced_folder "../data", "/vagrant_data"


41
42 # Provider-specific configuration so you can fine-tune various
43 # backing providers for Vagrant. These expose provider-specific options.

44 # Example for VirtualBox:

45 #
46 # config.vm.provider "virtualbox" do |vb|

47 # # Display the VirtualBox GUI when booting the machine

48 # vb.gui = true
49 #

50 # # Customize the amount of memory on the VM:

51 # vb.memory = "1024"

52 # end

53 #
54 # View the documentation for the provider you are using for more

55 # information on available options.

56
57 # Define a Vagrant Push strategy for pushing to Atlas. Other push strategies

58 # such as FTP and Heroku are also available. See the documentation at

59 # https://docs.vagrantup.com/v2/push/atlas.html for more information.

60 # config.push.define "atlas" do |push|


61 # push.app = "YOUR_ATLAS_USERNAME/YOUR_APPLICATION_NAME"

62 # end

63
64 # Enable provisioning with a shell script. Additional provisioners such as

65 # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the

66 # documentation for more information about their specific syntax and use.

67 config.vm.provision "shell", inline: <<-SHELL

68 sudo apt-get update

69 sudo apt-get install -y apache2

70 SHELL

71 end

Vagrantfile hosted with by GitHub view raw

5) Alterado o arquivo, salve-o e experimente rodar o comando "vagrant up" na


pasta onde o arquivo está localizado. O resultado deverá ser algo do tipo:
fernando@fernando-notebook:~/tutorial-vm$
Gostou? ls perca mais nenhum post, gratuitamente!
Conheça formas de acompanhar o blog e não
Vagrantfile
fernando@fernando-notebook:~/tutorial-vm$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'ubuntu/trusty64' could not be found. Attempting to find and instal
default: Box Provider: virtualbox
default: Box Version: >= 0
==> default: Loading metadata for box 'ubuntu/trusty64'
default: URL: https://atlas.hashicorp.com/ubuntu/trusty64
==> default: Adding box 'ubuntu/trusty64' (v20160107.1.0) for provider: virtualbox
default: Downloading: https://atlas.hashicorp.com/ubuntu/boxes/trusty64/versions
0/providers/virtualbox.box
default: Progress: 61% (Rate: 308k/s, Estimated time remaining: 0:05:49)

00:00

Recorded with asciinema

Note que o download da máquina virtual inicial demora um bocado, pois o Vagrant
precisa baixar uma imagem com todo o Ubuntu Trusty já configuradinho e tal. Mas,
depois que esse download é feito, a importação é bem rápida e depois o Vagrant
assume e instala o pacote apache2, correspondente ao servidor web Apache,
automagicamente após o boot da máquina virtual.

Não custa lembrar, claro, que esse download da imagem é feito apenas uma vez por
imagem. Portanto, se você desligar a máquina (usando vagrant halt) e iniciar ela
novamente (usando vagrant up), somente o boot vai ser realizado (o Vagrant é
esperto e não re-executa os comandos de instalação do Apache pois sabe que a
máquina já tinha sido criada e portanto esses comandos já foram executados
anteriormente na máquina).

No fim, eu ainda acesso o IP da máquina diretamente (conforme configurado


no Vagrantfile, na linha 25) via CURL para que este exiba na tela o HTML da página
de bem vindo do Apache. Já nas linhas 67 a 70, estão os comandos de instalação do
Apache no Ubuntu.

Um ponto importante, também, é que qualquer pessoa que tiver tal Vagrantfile e
executar o vagrant up na pasta onde o arquivo se encontra terminará com uma
máquina virtual que, se não é igual, é muito similar (as vezes pode acontecer do
Apache acabar sendo atualizado nos repositórios do Ubuntu, por exemplo) à que foi
criada na sua máquina, permitindo assim a distribuição de ambientes de forma
muito facilmente (e sem a necessidade de transferir centenas de megabytes por aí).
6) Por
Gostou? último,
Conheça vamos
formas deacessar a máquina
acompanhar via
o blog e SSH
não usando
perca mais o comando
nenhum "vagrant
post, ssh" e,
gratuitamente!
com acesso ao sistema de arquivos interno da máquina virtual, modificar a página
de bem vindo do Apache para um simples "Olá Mundo". Segue a gravação:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />


<title>Apache2 Ubuntu Default Page: It works</title>
<style type="text/css" media="screen">
* {
margin: 0px 0px 0px 0px;
padding: 0px 0px 0px 0px;
}

body, html {
padding: 3px 3px 3px 3px;

background-color: #D8DBE2;

font-family: Verdana, sans-serif;


font-size: 11pt;
text-align: center;
}

div.main_page {
position: relative;
display: table;

width: 800px;

00:00 1,5

Recorded with asciinema

Com isso, acho que já dá para entender bem razoavelmente o funcionamento do


Vagrant e sua praticidade tanto na criação de ambientes de desenvolvimento,
quanto na sua distribuição e facilidade de uso. Faltou, apenas, mostrar como
funciona o sistema de compartilhamento de pastas no Vagrant, de forma que fosse
possível alterar uma pasta ou arquivo no host (ou seja, na sua máquina, física) e ter
essa pasta ou arquivo alterado também na máquina virtual. Só resolvi não
apresentar essa parte aqui pois, dependendo das configurações do seu sistema
operacional e do método escolhido, pode ser necessário a instalação de algumas
dependências extras, o que iriam tornar o tutorial complexo demais para um
primeiro momento. =)

Bom, espero que tenham gostado do post, do Vagrant e do tutorial como um todo
(fazia tempo que eu não descrevia algo assim, passo-a-passo). Quem quiser pesquisar
mais sobre a ferramenta, visite a documentação do Vagrant, que lá tem tudo
explicadinho detalhadamente. =)

Por fim, segue os links da ferramenta:

Site Oficial: http://vagrantup.com/


Repositório no Github: https://github.com/mitchellh/vagrant
Gostou
Gostou? do conteúdo
Conheça desse
formas de post? Apoie
acompanhar o blog
o blog e nãocontribuindo a partir
perca mais nenhum de R$1/mês
post, gratuitamente!
através da nossa página no Apoia.se! Isso me ajudará a manter o blog no ar, além de
trazer mais coisas legais para vocês! Obrigado desde já!
CURTIU O ARTIGO? ENTÃO COMPARTILHA PARA ESPALHAR MEU TRABALHO PELA INTERNET =)

Compartilhar 0 Tweetar SHARE  E-mail

CURTIR ISSO:

Carregando...

 13/01/2016  Fernando  Ferramentas  ambiente de desenvolvimento, desenvolvimento,


ferramentas, máquinas virtuais, vagrant

Comentários Comunidade  Ava

 Recomendar 1 t Tweet f Compartilhar

Ordenar por Mais votados

Participe da discussão...

Karson Adam • 2 anos atrás • edited


essa é a fermenta mais simples que já user para revolver
o problema de ambiente de desenvolvimento
△ ▽ • Responder • Compartilhar ›

Paulo A. Costa • 2 anos atrás


Muito bom! Não conhecia esta ferramenta. Será que é
possível a configuração mais detalhada da máquina
virtual, como por exemplo: regras de firewall,
configurações do apache, etc.?
△ ▽ • Responder • Compartilhar ›

TAMBÉM EM FERNANDO JORGE MOTA

Falando um pouco sobre Mustache – Templates


custos e a “melhor Universais
1 comentário • 4 anos atrás 2 comentários • 5 anos atrás
Braytiner Heggendorn — Henrique — Excelente post
AvatarMuito bom, simples direto Avatar!!
e atual!

Guake – Terminal com fácil Ngrok – Vá além do


acesso em qualquer lugar localhost
Gostou? Conheça formas de acompanhar o blog e não perca mais nenhum post, gratuitamente!
Orgulhosamente mantido com WordPress

Você também pode gostar