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:
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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- 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 |
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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
pvcreate /dev/sdb | |
vgextend VolGroup /dev/sdb | |
lvextend /dev/VolGroup/lv_root /dev/sdb | |
resize2fs /dev/VolGroup/lv_root |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- 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 |
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"
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
pvcreate /dev/sdb | |
vgextend VolGroup /dev/sdb | |
lvextend /dev/VolGroup/lv_root /dev/sdb | |
resize2fs /dev/VolGroup/lv_root |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package "httpd" do | |
action :install | |
end | |
service "httpd" do | |
action [ :start, :enable ] | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- 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 |
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
Quedo atento a sus comentarios!
No hay comentarios:
Publicar un comentario