Vagrant
Table of Contents
En este laboratorio crearemos un entorno con dos servidores Ubuntu utilizando la herramienta de Vagrant.
¿Por qué Vagrant? Dada la velocidad cambiante de tecnología, necesitamos tener espacios de infraestructura que nos ayude a probar, construir y practicar en un entorno seguro, ágil y fácilmente manejable.
Con Vagrant, tenemos la seguridad de que cualquier cosa que se malogre, será fácilmente reemplazable y así poder empezar desde cero en uno o varios servidores en blanco.
Cheat Sheet
vagrant init: Crea una plantilla de unVagrantfilevagrant up: Levanta la infraestructura basada en elVagrantfilevagrant ssh:sshhacia algunaboxvagrant reload: Refresca las configuraciones delVagrantfilehacia lasboxesvagrant status: Ver lasboxesy su estadovagrant destroy: Destruye lasboxesvagrant snapshot save [Nombre Host] [Nombre Snapshot]: Creando un snapshotvagrant snapshot list: Lista los snapshotsvagrant snapshot restore [Nombre Host] [Nombre Del Snapshot]: Restaura al snapshot indicadovagrant snapshot push: Añade al snapshot a la pilavagrant snapshot pop: Toma el último elemento de la pila
Capítulo 0: Introducción
Vagrantes una herramienta que te permite el desarrollo de entornos completos.- Tiene un enfoque de automatización
- Construye y administra máquinas virtuales
- Obtén entornos desechables
Capítulo 1: Requerimientos
- VirtualBox: Instalación
- Vagrant: Instalación
Capítulo 2: Mi Primer Vagrantfile
Vamos a iniciar creando una máquina virtual utilizando solamente código. Para ello, crearemos un nuevo documento dentro de cualquier carpeta destinada para nuestro proyecto
El documento deberá llamarse vagrantfile
Lo primero que debemos elegir es la versión de la configuración que estaremos utilizando.
La última versión que se tiene 2
Dado que nuestro proyecto se basa en 2 servidores Ubuntu, procederemos con elegir nuestro Vagrant Box desde el catálogo
Finalmente, crearemos un nuevo bloque para nuestro primer host que llamaremos labServer01 y le asignaremos una IP estática de 192.168.56.10
Vagrant.configure("2") do |config|
## Definir el OS de forma global
config.vm.box = "ubuntu/trusty64"
config.vm.box_version = "20191107.0.0"
## Definir Un Nuevo Bloque
config.vm.define "labServer01" do |host|
## Definir Maquina virtual dentro de este Bloque
host.vm.network "private_network", ip:"192.168.56.10"
end
end
Capítulo 3: Redes y Reenvío de Puerto
En cuanto a la asignación de IP para nuestras boxes, tenemos dos opciones.
La primera sería darle una ip de la misma red de nuestra máquina host y formar un bridge.
Para ello utilizaremos la línea:
host.vm.network "public_network"
La forma completa se vería así:
Vagrant.configure("2") do |config|
## Definir el OS de forma global
config.vm.box = "ubuntu/trusty64"
config.vm.box_version = "20191107.0.0"
## Definir Un Nuevo Bloque
config.vm.define "labServer01" do |host|
## Definir Maquina virtual dentro de este Bloque
host.vm.network "public_network"
end
end
La segunda opción sería darle una ip fija utilizando host.vm.network "private_network", ip:"xxx.xxx.xxx.xxx"
Vagrant.configure("2") do |config|
## Definir el OS de forma global
config.vm.box = "ubuntu/trusty64"
config.vm.box_version = "20191107.0.0"
## Definir Un Nuevo Bloque
config.vm.define "labServer01" do |host|
## Definir Maquina virtual dentro de este Bloque
host.vm.network "private_network", ip:"192.168.56.10"
end
end
Adicional a ello, podemos reenviar puertos de la box hacia el host o anfitrión.
Para ello utilizaremos host.vm.network "forwarded_port", guest:80, host:8080
Vagrant.configure("2") do |config|
## Definir el OS de forma global
config.vm.box = "ubuntu/trusty64"
config.vm.box_version = "20191107.0.0"
## Definir Un Nuevo Bloque
config.vm.define "labServer01" do |host|
## Definir Maquina virtual dentro de este Bloque
host.vm.network "private_network", ip:"192.168.56.10"
host.vm.network "forwarded_port", guest:80, host:8080
end
end
En ese ejemplo, nuestro puerto local 8080 sera dirigido hacia el puerto 80 del la máquina virtual.
Capítulo 4: Múltiples Máquinas Virtuales
Para generar más de una máquina virtual, deberemos asignar bloques.
Para ello utilizaremos la línea config.vm.define "host_1" do |host| formando así un vagrantfile muy parecido a este:
Vagrant.configure("2") do |config|
## Definir el OS de forma global
config.vm.box = "ubuntu/trusty64"
config.vm.box_version = "20191107.0.0"
## Definir Nuevo Bloque
###### HOST 1 #####
config.vm.define "labServer01" do |host|
## Definir Maquina virtual dentro de este Bloque
#host.vm.box = "ubuntu/trusty64"
host.vm.network "private_network", ip:"192.168.56.10"
end
##### HOST 2 #####
config.vm.define "labServer02" do |host|
host.vm.network "private_network", ip:"192.168.56.20"
end
end
Capítulo 5: Uso de Scripts
Durante la construcción que se de de las boxes podemos aprovisionar o ejecutar una serie de comandos definidos en un script
La primera forma sería con las líneas de código dentro del mismo vagrantfile
$script = <<-SCRIPT
sudo apt-get update
sudo apt-get install nginx -y
SCRIPT
Vagrant.configure("2") do |config|
## Definir el OS de forma global
config.vm.box = "ubuntu/trusty64"
config.vm.box_version = "20191107.0.0"
## Definir Nuevo Bloque
###### HOST 1 #####
config.vm.define "labServer01" do |host|
## Definir Maquina virtual dentro de este Bloque
#host.vm.box = "ubuntu/trusty64"
host.vm.network "private_network", ip:"192.168.56.10"
host.vm.provision "shell", inline: $script
end
##### HOST 2 #####
config.vm.define "labServer02" do |host|
host.vm.network "private_network", ip:"192.168.56.20"
host.vm.provision "shell", inline: $script
end
end
La segunda forma sería utilizando un archivo externo *.sh
Vagrant.configure("2") do |config|
## Definir el OS de forma global
config.vm.box = "ubuntu/trusty64"
config.vm.box_version = "20191107.0.0"
## Definir Nuevo Bloque
###### HOST 1 #####
config.vm.define "labServer01" do |host|
## Definir Maquina virtual dentro de este Bloque
#host.vm.box = "ubuntu/trusty64"
host.vm.network "private_network", ip:"192.168.56.10"
host.vm.provision "shell", path: "./script.sh"
end
##### HOST 2 #####
config.vm.define "labServer02" do |host|
host.vm.network "private_network", ip:"192.168.56.20"
host.vm.provision "shell", path: "./script.sh"
end
end
Para ese ejemplo, el archivo ejecutable ./script2.sh"
end estaría dentro del mismo directorio que el vagrantfile
Capítulo 6: Compartir Archivos
Es posible compartir un archivo de nuestra máquina local hacia nuestra box y viceversa.
La línea de código es de la siguiente forma:
config.vm.synced_folder "./code", "/home/vagrant", disabled: false
Dentro del vagrantfile se vería así:
Vagrant.configure("2") do |config|
## Definir el OS de forma global
config.vm.box = "ubuntu/trusty64"
config.vm.box_version = "20191107.0.0"
##### HOST 1 #####
config.vm.define "labServer01" do |host|
## Definir Maquina virtual dentro de este Bloque
host.vm.hostname = 'labServer01'
host.vm.network "private_network", ip:"192.168.56.10"
host.vm.synced_folder "./git", "/home/vagrant/git", disabled: false
host.vm.synced_folder "./bash", "/home/vagrant/bash", disabled: false
host.vm.provision "shell", path: "./script.sh"
end
end
Para dicho ejemplo, tanto los directorios locales ./git/ y ./bash/ se estarían sincronizado con los directorios del box /home/vagrant/git y /home/vagrant/bash respectivamente.