Vagrant Multi Machines

1. Conceito Multi Machines

Após a introdução ao vagrant no post anterior, vamos falar rapidamente sobre multi machines.

O conceito é simples, com “multi machines” você pode subir várias VMs de uma vez só.

Imagine um ambiente LAMP, você pode ter uma VM para o Apache e outra para o MYSQL, tudo no mesmo projeto/diretório/vagranfile.

1.1 Características do ambiente

VM1

VM1 (apache)
Base box CentOS 6.5 64Bits
1 Processador
600 MB de RAM
NIC 1 em modo NAT
NIC 2 c/ ip 192.168.200.30, rede privada
Encaminhamento de porta 80 do guest paraporta 9090 no host (osx)

VM2

VM2 (mysql)
Base box CentOS 6.5 64Bits
1 Processador
600 MB de RAM
NIC 1 em modo NAT
NIC 2 c/ ip 192.168.200.31, rede privada
Encaminhamento de porta 3306 do guest paraporta 9091 no host (osx)

2. Criando Multi Machines

Deixo claro que eu estou partindo da ideia que você já leu o post anterior e já configurou o vagrant em seu ambiente, então vamos lá

mkdir ~/vagrant/projects/lamp
cd ~/vagrant/projects/lamp
vim Vagrantinit

Vamos traduzir as características da seção 1.1 para o Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  # Apache
  config.vm.define "apache" do |apache|

    apache.vm.hostname = "apache.hacklab"

    apache.vm.box = "centos6x64"

    apache.vm.network "forwarded_port", guest: 80, host: 9090

    apache.vm.network "private_network", ip: "192.168.200.30"

    apache.vm.provider "virtualbox" do |v|
        v.customize [ "modifyvm", :id, "--cpus", "1" ]
        v.customize [ "modifyvm", :id, "--memory", "600" ]
    end

  end
  # End apache

  # Mysql
  config.vm.define "mysql" do |mysql|

    mysql.vm.hostname = "mysql.hacklab"

    mysql.vm.box = "centos6x64"

    mysql.vm.network "forwarded_port", guest: 3306, host: 9091

    mysql.vm.network "private_network", ip: "192.168.200.31"

    mysql.vm.provider "virtualbox" do |y|
        y.customize [ "modifyvm", :id, "--cpus", "1" ]
        y.customize [ "modifyvm", :id, "--memory", "600" ]
    end

  end
  # End Mysql

end

Agora vamos iniciar as duas VMs

vagrant up

Acompanhe a saída

==> apache: Importing base box 'centos6x64'...
==> apache: Matching MAC address for NAT networking...
==> apache: Setting the name of the VM: lamp_apache_1399901503605_21761
==> apache: Fixed port collision for 22 => 2222. Now on port 2200.
==> apache: Clearing any previously set network interfaces...
==> apache: Preparing network interfaces based on configuration...
    apache: Adapter 1: nat
    apache: Adapter 2: hostonly
==> apache: Forwarding ports...
    apache: 22 => 2200 (adapter 1)
    apache: 80 => 9090 (adapter 1)
==> apache: Running 'pre-boot' VM customizations...
==> apache: Booting VM...
==> apache: Waiting for machine to boot. This may take a few minutes...
    apache: SSH address: 127.0.0.1:2200
    apache: SSH username: vagrant
    apache: SSH auth method: private key
    apache: Warning: Connection timeout. Retrying...
    apache: Warning: Connection timeout. Retrying...
    apache: Warning: Remote connection disconnect. Retrying...
==> apache: Machine booted and ready!
==> apache: Checking for guest additions in VM...
==> apache: Setting hostname...
==> apache: Configuring and enabling network interfaces...
==> apache: Mounting shared folders...
    apache: /vagrant => /Users/gutocarvalho/vagrant/projects/lamp
==> mysql: Importing base box 'centos6x64'...
==> mysql: Matching MAC address for NAT networking...
==> mysql: Setting the name of the VM: lamp_mysql_1399901623062_42651
==> mysql: Fixed port collision for 22 => 2200. Now on port 2201.
==> mysql: Clearing any previously set network interfaces...
==> mysql: Preparing network interfaces based on configuration...
    mysql: Adapter 1: nat
    mysql: Adapter 2: hostonly
==> mysql: Forwarding ports...
    mysql: 22 => 2201 (adapter 1)
    mysql: 3306 => 9091 (adapter 1)
==> mysql: Running 'pre-boot' VM customizations...
==> mysql: Booting VM...
==> mysql: Waiting for machine to boot. This may take a few minutes...
    mysql: SSH address: 127.0.0.1:2201
    mysql: SSH username: vagrant
    mysql: SSH auth method: private key
    mysql: Warning: Connection timeout. Retrying...
    mysql: Warning: Connection timeout. Retrying...
    mysql: Warning: Remote connection disconnect. Retrying...
    mysql: Warning: Remote connection disconnect. Retrying...
==> mysql: Machine booted and ready!
==> mysql: Checking for guest additions in VM...
==> mysql: Setting hostname...
==> mysql: Configuring and enabling network interfaces...
==> mysql: Mounting shared folders...
    mysql: /vagrant => /Users/gutocarvalho/vagrant/projects/lamp

Em cerca de 4 minutos as duas VMs subiram, vamos verificar o status das VMs

vagrant status

Acompanhe a saída

Current machine states:

apache                    running (virtualbox)
mysql                     running (virtualbox)

This environment represents multiple VMs. The VMs are all listed
above with their current state. For more information about a specific
VM, run `vagrant status NAME`.

Perfeito, estão funcionando :)

3. Manipulando Multi Machines

Subindo todas as VMs

vagrant up

Subindo apenas a VM apache

vagrant up apache

Parando todas as VMs

vagrant halt

Parando apenas a VM mysql

 vagrant mysql halt

Recarregando todas as VMs

 vagrant reload

Recarregando apenas a VM apache

 vagrant reload apache

Você pode usar expressões regulares se quiser ( no caso de várias vms )

 vagrant up /apache[0-9]/

Para entrar na VM mysql

 vagrant ssh mysql

Para entrar na VM apache

 vagrant ssh apache

É bastante simples!

4. Dicas soltas

4.1 Primary machine

Observe a ordem em que as máquinas subiram, foi a mesma ordem declarada no Vagranfile, contudo, você pode definir uma VM que deve subir antes das outras, isto é chamado de primary, veja o exemplo de sintaxe abaixo

config.vm.define "mysql" primary: true do |web|
  code
end

Basta especificar isto e ela subirá primeiro que as outras.

4.2 Autostart

Se quiser que uma das VMs não inicie automaticamente, especifique isso no define dela

config.vm.define "db_slave", autostart: false

Feito isto, o vagrant up vai ignorar ela.

5. Multi Machines com diferentes boxes

É possível usar diferentes tipos de box, basta especificar, eu tenho aqui um projeto que sobe um puppetmaster em centos e mais 3 vms com agentes, um debian, um ubuntu e um centos, funciona muito, muito bem.

6. Conclusão

Quanto mais estudo o vagrant, melhor entendo o seu funcionamento e acabo conhecendo novas e excelentes características como esta.

Com multi machines, construir ambientes complexos passa a ser fácil e rápido, imagina na hora que eu integrar com o o Puppet :)

Será o mesmo que juntar o queijo e a goiabada, perfeição.

7. Referências