lunes, 18 de agosto de 2014

Crea Máquinas Virtuales rápidamente con Vagrant + Chef

Vagrant es una herramienta que permita la compresión y distribución de Máquinas Virtuales (VM). Estas VM pueden ser de distintos proveedores ("Providers") como: VirtualBox, VMware, Docker, Hyper-V, etc.

El proceso es el siguiente: Primero se crea una VM con un proveedor determinado, luego se comprime en un formato ".box", para utilizar este "box" como base para crear nuevos "boxes".



Beneficios
  • El proceso de clonación de VMs es lento y poco flexible. Copias la máquinas virtuales "as-is"
  • Vagrant permite modular los recursos de la VM, como memoria RAM, CPUs, espacio de disco duro.
  • Vagrant permite agregar Provisionadores, como Puppet o Chef, para automatizar la instalación y configuración de aplicaciones y servicios.

Nota: Para crear VMs en la nube (Amazon, OpenStack, Google Compute Engine, etc.), los mismo creadores de Vagrant, han creado Packer. Esta herramienta, además de crear ambientes en la nube, permite automatizar el proceso de creación de VMs en VirtualBox y VMware desde un archivo ISO con el Sistema Operativo.

Objetivos

  • Crear una VM en VirtualBox, utilizando Vagrant y las "base box" disponibles en vagrantbox.es
  • Como aumentar el espacio en disco de las VMs
  • Agregar servicios con Chef

Solución

Primero se debe instalar Vagrant y VirtualBox, y agregar las rutas al PATH de tu sistema operativo:


Inicializar Vagrant Box

Para iniciar un box de Vagrant, simplemente debemos crear una carpeta y ejecutar "vagrant init" para crear el Vagrantfile:


Este comando crea el archivo de configuración de Vagrant, implementado con Ruby.

La única información especificada es la versión de Vagrant: 2, y el nombre del box: "base".

Vagrant tiene una solución en la nube para alojar boxes: Vagrant Cloud. Pero uno puede crear sus propios "box" base, o utilizar los "box" base de este sitio: Vagrantbox.es

En este caso vamos a utiliza un "box" base de Oracle Linux 6.5 con Chef y Puppet instalado:


Yo prefiero descargar el "box" y luego direccionarlo directamente desde mi archivo de configuración, pero se puede direccionar directamente a la URL:

Una vez definido el box, podemos iniciarlo ejecutando "vagrant up":


Bueno ya tenemos una copia de la virtual descargada en ejecución, que más podemos hacer?

Podemos ver que boxes tenemos instalados:


Podemos destruirla, eliminando la virtual:

Ok, pero si queremos aumentar los recursos de la virtual, instalarle algún software? Bueno para esto hay que ir al archivo Vagrantfile y programar estos comportamientos:

Configurar las propiedades del Box, carpetas compartidas y las redes


Configurar las propiedades de VirtualBox

Para modificar los recursos de RAM, CPU, cambia el nombre de la virtual de VirtualBox, podemos agregar:
# -*- mode: ruby -*-
# vi: set ft=ruby :
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "base"
config.vm.hostname = "basemachine"
config.vm.box_url = "file://c:/boxes/oel65-64.box"
# Host-only network configuration
config.vm.network :private_network, ip: "192.168.56.20"
# Mount c:\data directory to /data directory on box
config.vm.synced_folder "/data" , "/data", :mount_options => ["dmode=777", "fmode=777"]
config.vm.provider :virtualbox do |vb|
vb.customize ["modifyvm", :id, "--memory", "2048"]
vb.customize ["modifyvm", :id, "--name" , "basemachine"]
vb.customize ["modifyvm", :id, "--cpus" , 2]
vb.customize ["modifyvm", :id, "--chipset", "ich9"]
end
end
view raw Vagrantfile hosted with ❤ by GitHub






Agregar un Disco Duro adicional a la Máquina Virtual

El caso del disco duro es especial. Como las máquinas virtuales vienen con un disco de 10 GB y tienen un formato genérico (.VMDK) no puede ser expandido facilmente. Por otro lado, el espacio de SWAP también es reducido.



Por lo tanto tenemos que crear un nuevo disco, agregarlo al sistema operativo y mapearlo para que sea reconocido por Linux.

Agregar los siguientes archivos a la carpeta de vagrant y agregar los cambios al Vagrantfile para crear el archivo "file_to_disk" de 100 GB y agregar 4 GB de Swap:

#!/bin/bash
pvcreate /dev/sdb
vgextend VolGroup /dev/sdb
lvextend /dev/VolGroup/lv_root /dev/sdb
resize2fs /dev/VolGroup/lv_root
view raw bootstrap.sh hosted with ❤ by GitHub
#!/bin/sh
# size of swapfile in megabytes
swapsize=4000
# does the swap file already exist?
grep -q "swapfile" /etc/fstab
# if not then create it
if [ $? -ne 0 ]; then
echo 'swapfile not found. Adding swapfile.'
fallocate -l ${swapsize}M /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap defaults 0 0' >> /etc/fstab
else
echo 'swapfile found. No changes made.'
fi
# output results to terminal
df -h
cat /proc/swaps
cat /proc/meminfo | grep Swap
# -*- mode: ruby -*-
# vi: set ft=ruby :
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
#Path to new hard disk file
file_to_disk = './disk.vdi'
config.vm.box = "base"
config.vm.hostname = "basemachine"
config.vm.box_url = "file://c:/boxes/oel65-64.box"
# Host-only network configuration
config.vm.network :private_network, ip: "192.168.56.20"
# Mount c:\data directory to /data directory on box
config.vm.synced_folder "/data" , "/data", :mount_options => ["dmode=777", "fmode=777"]
config.vm.provider :virtualbox do |vb|
vb.customize ["modifyvm", :id, "--memory", "2048"]
vb.customize ["modifyvm", :id, "--name" , "basemachine"]
vb.customize ["modifyvm", :id, "--cpus" , 2]
vb.customize ["modifyvm", :id, "--chipset", "ich9"]
#Script to add a new disk and expand space on OS (root and swap)
if ARGV[0] == "up" && ! File.exist?(file_to_disk)
vb.customize [
'createhd',
'--filename', file_to_disk,
'--format', 'VDI',
'--size', 100 * 1024
]
vb.customize [
'storageattach', :id,
'--storagectl', 'SATA Controller',
'--port', 1, '--device', 0,
'--type', 'hdd', '--medium',
file_to_disk
]
config.vm.provision "shell", path: "bootstrap.sh"
config.vm.provision "shell", path: "increase_swap.sh"
end
end
end
view raw Vagrantfile hosted with ❤ by GitHub


Vagrant Shell es el tipo de provisionamiento más sencillo, que ejecuta scripts directamente al sistema operativo creado.


Agregar Software con Chef

A las herramientas que permiten agregar software, se les conoce como Provisionadores (Chef o Puppet, entre otros).

En este caso usaré Chef para instalar el servicio de Apache HTTP.

Crear una carpeta "chef/cookbook/http/recipes/" con el archivo "install-httpd.rb" con el formato "cookbook/[nombre de libro de recetas]/recipes/[nombre de receta].rb"

#!/bin/bash
pvcreate /dev/sdb
vgextend VolGroup /dev/sdb
lvextend /dev/VolGroup/lv_root /dev/sdb
resize2fs /dev/VolGroup/lv_root
view raw bootstrap.sh hosted with ❤ by GitHub
#!/bin/sh
# size of swapfile in megabytes
swapsize=4000
# does the swap file already exist?
grep -q "swapfile" /etc/fstab
# if not then create it
if [ $? -ne 0 ]; then
echo 'swapfile not found. Adding swapfile.'
fallocate -l ${swapsize}M /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap defaults 0 0' >> /etc/fstab
else
echo 'swapfile found. No changes made.'
fi
# output results to terminal
df -h
cat /proc/swaps
cat /proc/meminfo | grep Swap
package "httpd" do
action :install
end
service "httpd" do
action [ :start, :enable ]
end
# -*- mode: ruby -*-
# vi: set ft=ruby :
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
#Path to new hard disk file
file_to_disk = './disk.vdi'
config.vm.box = "base"
config.vm.hostname = "basemachine"
config.vm.box_url = "file://c:/boxes/oel65-64.box"
# Host-only network configuration
config.vm.network :private_network, ip: "192.168.56.20"
# Mount c:\data directory to /data directory on box
config.vm.synced_folder "/data" , "/data", :mount_options => ["dmode=777", "fmode=777"]
config.vm.provider :virtualbox do |vb|
vb.customize ["modifyvm", :id, "--memory", "2048"]
vb.customize ["modifyvm", :id, "--name" , "basemachine"]
vb.customize ["modifyvm", :id, "--cpus" , 2]
vb.customize ["modifyvm", :id, "--chipset", "ich9"]
#Script to add a new disk and expand space on OS (root and swap)
if ARGV[0] == "up" && ! File.exist?(file_to_disk)
vb.customize [
'createhd',
'--filename', file_to_disk,
'--format', 'VDI',
'--size', 100 * 1024
]
vb.customize [
'storageattach', :id,
'--storagectl', 'SATA Controller',
'--port', 1, '--device', 0,
'--type', 'hdd', '--medium',
file_to_disk
]
config.vm.provision "shell", path: "bootstrap.sh"
config.vm.provision "shell", path: "increase_swap.sh"
end
end
#Chef provisioning
config.vm.provision "chef_solo" do |chef|
chef.cookbooks_path = "../chef/cookbooks"
chef.add_recipe "http::install-httpd"
end
end
view raw Vagrantfile hosted with ❤ by GitHub


Reiniciar el "box" con "vagrant reload" y ejecutar "vagrant provision" para ejecutar la receta.


Así podemos ir automatizando continuamente nuestras instalaciones hasta convertirlas en "one-click" y simplemente esperar a que el ambiente este preparado para ejecutar nuestras aplicaciones.

Recursos

No hay comentarios:

Publicar un comentario