A idéia principal deste post é demonstrar, de forma prática, como é simples criarmos base boxes (aka templates de máquinas virtuais) utilizando as ferramentas Vagrant e Veewee.
Mas por que diabos criar templates?
Templates podem ser extremamente úteis para agilizarmos a criação de máquinas com configurações ou papéis específicos, como por exemplo, templates de máquinas web server, database server, proxy, mail server etc.
Agora que conhecemos um pouco da importância de máquinas template, mas ainda antes de irmos para a parte prática, vamos falar um pouco sobre as ferramentas Vagrant e Veewee.
O que é Vagrant (http://vagrantup.com/)?
De uma forma geral, o vagrant é uma abstração, criada sobre os comandos de linha do VirtualBox (http://www.virtualbox.org/), criada para facilitar a admnistração de templates e instâncias de máquinas virtuais.
O Vagrant é distribuído na forma binária e também através de uma gema Ruby.
Obs.: É importante deixar claro que o Vagrant depende do VirtualBox instalado na máquina para funcionar!
Como instalar o Vagrant?
Por questão de facilidade, vamos utilizar a gema Ruby do Vagrant.
Uma vez que você tenha o Ruby (1.8.7 ou 1.9) e o Rubygems instalados em sua máquina, basta instalar a gem do Vagrant utilizando o seguinte comando:
1 2 3 4 5 |
> $ gem install vagrant Fetching: vagrant-1.0.3.gem (100%) Successfully installed vagrant-1.0.3 1 gem installed |
O que é Veewee (https://github.com/jedi4ever/veewee)?
O Veewee é uma gema Ruby que estende o Vagrant adicionando suporte para criação de máquinas base (base boxes).
Como instalar o Veewee?
De forma similar a instalação do Vagrant, instalaremos o Veewee com o comando:
1 2 3 4 5 |
> $ gem install veewee Fetching: veewee-0.2.3.gem (100%) Successfully installed veewee-0.2.3 1 gem installed |
Mãos a massa!
Uma vez que temos as gemas do Vagrant e do Veewee instaladas, vamos listar todos os templates de sistema operacional disponibilizados pelo Veewee:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
> $ veewee templates The following templates are available: vagrant basebox define '' 'CentOS-4.8-i386' vagrant basebox define '' 'CentOS-5.5-x86_64-netboot' vagrant basebox define '' 'CentOS-5.6-i386' vagrant basebox define '' 'CentOS-5.6-i386-netboot' vagrant basebox define '' 'CentOS-5.6-x86_64-netboot' vagrant basebox define '' 'CentOS-5.7-i386-netboot' vagrant basebox define '' 'CentOS-5.7-x86_64-netboot' vagrant basebox define '' 'CentOS-6.0-i386' vagrant basebox define '' 'CentOS-6.0-i386-netboot' vagrant basebox define '' 'CentOS-6.0-x86_64' vagrant basebox define '' 'CentOS-6.0-x86_64-minimal' vagrant basebox define '' 'CentOS-6.0-x86_64-netboot' vagrant basebox define '' 'CentOS-6.1-x86_64-minimal' vagrant basebox define '' 'CentOS-6.2-x86_64-minimal' vagrant basebox define '' 'Debian-5.0.8-amd64-netboot' vagrant basebox define '' 'Debian-5.0.8-i386-netboot' vagrant basebox define '' 'Debian-6.0.3-amd64-netboot' vagrant basebox define '' 'Debian-6.0.3-i386-netboot' vagrant basebox define '' 'Fedora-14-amd64' vagrant basebox define '' 'Fedora-14-amd64-netboot' vagrant basebox define '' 'Fedora-14-i386' vagrant basebox define '' 'Fedora-14-i386-netboot' vagrant basebox define '' 'Fedora-15-i386' vagrant basebox define '' 'Fedora-15-i386-netboot' vagrant basebox define '' 'Fedora-15-x86_64' vagrant basebox define '' 'Fedora-15-x86_64-netboot' vagrant basebox define '' 'Fedora-16-i386' vagrant basebox define '' 'Fedora-16-x86_64' vagrant basebox define '' 'SLES-11-SP1-DVD-i586-GM' vagrant basebox define '' 'SLES-11-SP1-DVD-x86_64-GM' vagrant basebox define '' 'Sysrescuecd-2.0.0-experimental' vagrant basebox define '' 'archlinux-i386' vagrant basebox define '' 'archlinux-i386-netboot' vagrant basebox define '' 'archlinux-x86_64' vagrant basebox define '' 'archlinux-x86_64-netboot' vagrant basebox define '' 'freebsd-8.2-experimental' vagrant basebox define '' 'freebsd-8.2-pcbsd-i386' vagrant basebox define '' 'freebsd-8.2-pcbsd-i386-netboot' vagrant basebox define '' 'funtoo-latest-generic_64-stable' vagrant basebox define '' 'gentoo-latest-i386-experimental' vagrant basebox define '' 'gentoo-latest-x86_64-experimental' vagrant basebox define '' 'openSUSE-11.4-DVD-i586' vagrant basebox define '' 'openSUSE-11.4-DVD-x86_64' vagrant basebox define '' 'openSUSE-11.4-NET-i586' vagrant basebox define '' 'openSUSE-11.4-NET-x86_64' vagrant basebox define '' 'openSUSE-12.1-DVD+NET-i586' vagrant basebox define '' 'openSUSE-12.1-DVD+NET-x86_64' vagrant basebox define '' 'openbsd50_amd64' vagrant basebox define '' 'openbsd50_i386' vagrant basebox define '' 'openindiana-148-ai-x86' vagrant basebox define '' 'opensuse-11.4-i386-experimental' vagrant basebox define '' 'scientificlinux-6.1-i386-netboot' vagrant basebox define '' 'scientificlinux-6.1-x86_64-netboot' vagrant basebox define '' 'solaris-11-express-i386' vagrant basebox define '' 'ubuntu-10.04.2-amd64-netboot' vagrant basebox define '' 'ubuntu-10.04.2-server-i386-netboot' vagrant basebox define '' 'ubuntu-10.04.3-server-amd64' vagrant basebox define '' 'ubuntu-10.04.3-server-amd64-alt' vagrant basebox define '' 'ubuntu-10.04.3-server-i386' vagrant basebox define '' 'ubuntu-10.10-server-amd64' vagrant basebox define '' 'ubuntu-10.10-server-amd64-netboot' vagrant basebox define '' 'ubuntu-10.10-server-i386' vagrant basebox define '' 'ubuntu-10.10-server-i386-netboot' vagrant basebox define '' 'ubuntu-11.04-server-amd64' vagrant basebox define '' 'ubuntu-11.04-server-i386' vagrant basebox define '' 'ubuntu-11.10-server-amd64' vagrant basebox define '' 'ubuntu-11.10-server-amd64-ishaya' vagrant basebox define '' 'ubuntu-11.10-server-amd64-ruby192' vagrant basebox define '' 'ubuntu-11.10-server-i386' vagrant basebox define '' 'ubuntu-8.04.4-server-amd64' vagrant basebox define '' 'ubuntu-8.04.4-server-i386' vagrant basebox define '' 'windows-2008R1-serverstandard-amd64' vagrant basebox define '' 'windows-2008R2-amd64' vagrant basebox define '' 'windows-2008R2-serverstandard-amd64' vagrant basebox define '' 'windows-7-enterprise-amd64' vagrant basebox define '' 'windows-7-enterprise-i386' vagrant basebox define '' 'windows-7-premium-amd64' vagrant basebox define '' 'windows-7-professional-amd64' vagrant basebox define '' 'windows-7-ultimate-amd64' vagrant basebox define '' 'windows-7sp1-ultimate-amd64' vagrant basebox define '' 'windows-8-preview-dev-amd64' |
Como podemos observar, existem uma série de combinações de templates por sistema operacional, arquitetura etc.
No nosso exemplo, usaremos o CentOS 6.2 64 bits para criarmos nosso template. Desta forma, o comando para criarmos o nosso primeiro base box fica assim:
1 2 3 4 5 6 |
> $ vagrant basebox define 'template-1' 'CentOS-6.2-x86_64-minimal' The basebox 'template-1' has been successfully created from the template ''CentOS-6.2-x86_64-minimal' You can now edit the definition files stored in definitions/template-1 or build the box with: vagrant basebox build 'template-1' |
Por fim, precisamos efetivar a criação da máquina através do comando:
1 |
> $ vagrant basebox build 'template-1' |
Como será a primeira vez que criamos uma máquina à partir do template ‘CentOS-6.2-x86_64-minimal’, será questionado se o template deve ser baixado da internet, a mensagem é algo assim:
1 2 3 4 5 6 7 |
We did not find an isofile in/iso. The definition provided the following download information: - Download url: http://mirror.internode.on.net/pub/centos/6.2/isos/x86_64/CentOS-6.2-x86_64-minimal.iso - Md5 Checksum: 20dac370a6e08ded2701e4104855bc6e Download? (Yes/No) |No| |
Basta digitarmos Yes para que o vagrant faça o download do template, inicialize e configure a máquina com suas dependências.
Ao final do processo, deveremos ver as seguintes mensagens:
1 2 3 4 5 6 |
Step [1] was successfully - saving state template-1 was built successfully. Now you can: - verify your box by running : vagrant basebox validate template-1 - export your vm to a .box file by running : vagrant basebox export template-1 |
Para validarmos se a box foi corretamente criada, digite:
1 |
> $ vagrant basebox validate template-1 |
Alguns testes sobre serão executados sobre a box e, ao final, são apresentados os resultados, algo como:
1 2 3 |
7 scenarios (7 passed) 21 steps (21 passed) 0m12.839s |
Agora que a máquina foi configurada pelo Vagrant, vamos exportar o modelo da máquina para um arquivo “.box”:
1 |
> $ vagrant basebox export 'template-1' |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Vagrant requires the box to be shutdown, before it can export Sudo also needs to work for user vagrant Performing a clean shutdown now. Executing command: sudo /sbin/halt -h -p Broadcast message from vagrant@localhost.localdomain (/dev/pts/0) at 2:17 ... The system is going down for power off NOW! ................... Machine template-1 is powered off cleanly Executing vagrant voodoo: vagrant package --base 'template-1' --output 'template-1.box' To import it into vagrant type: vagrant box add 'template-1' 'template-1.box' To use it: vagrant init 'template-1' vagrant up vagrant ssh |
Para podermos utilizar o template criado, basta adicionarmos o box exportado na lista de máquinas do Vagrant. Este passo é feito utilizando o comando abaixo:
1 2 3 4 5 6 7 |
> $ vagrant box add 'template-1' 'template-1.box' [vagrant] Downloading with Vagrant::Downloaders::File... [vagrant] Copying box to temporary location... [vagrant] Extracting box... [vagrant] Verifying box... [vagrant] Cleaning up downloaded box... |
Neste momento, já temos a box pronta para uso. Vamos agora configurar o arquivo Vagrantfile para que possamos inicializar uma instância da nossa basebox ‘template-1’, para isso, execute o comando:
1 2 3 4 5 6 |
> $ vagrant init 'template-1' 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. |
Por fim, vamos inicializar uma instância da máquina template-1, utilizando o comando:
1 |
> $ vagrant up |
Ao final da execução do comando acima, a máquina estará no ar e apta a ser acessada via ssh. O próprio Vagrant já disponibiliza um comando facilitador para este acesso, basta utilizar o seguinte comando:
1 2 3 4 5 |
> $ vagrant ssh Last login: Tue May 29 16:57:17 2012 from 10.0.2.2 vagrant@centos58-bare:~ $ |
Bom, é isso, em breve tentarei falar sobre o uso de múltiplas VMs com Vagrant!