📌 Introducción a Vagrant
Vagrant es una herramienta de software de código abierto que permite la creación y configuración de entornos virtuales de desarrollo de manera rápida y eficiente.
Con Vagrant, los desarrolladores pueden definir una infraestructura en un solo archivo (Vagrantfile) y compartirlo con otros, asegurando que todos trabajen en el mismo entorno sin importar su sistema operativo.
✅ Beneficios principales:
- Automatiza la creación de máquinas virtuales.
- Permite compartir entornos de desarrollo fácilmente.
- Asegura consistencia entre equipos de trabajo.
- Compatible con múltiples proveedores de virtualización (VirtualBox, VMware, Docker, etc.).
📌 ¿Cómo funciona Vagrant?
Vagrant utiliza un Vagrantfile, que es un archivo de configuración donde se definen las máquinas virtuales y sus características.
🔹 Proceso básico de uso:
1️⃣ Instalar Vagrant y un proveedor de virtualización (ej. VirtualBox).
2️⃣ Crear un directorio de proyecto y un Vagrantfile:
3️⃣ Configurar la máquina en el Vagrantfile (ejemplo básico):
ruby
Vagrant.configure(“2”) do |config|
config.vm.box = “debian”
config.vm.network “private_network”, ip: “192.168.56.10”
end
4️⃣ Levantar la máquina virtual con:
sh
vagrant up
5️⃣ Acceder a la máquina virtual:
shvagrant ssh
6️⃣ Apagar o destruir la máquina virtual cuando no se necesite:
shvagrant halt # Apagar
vagrant destroy # Eliminar completamente
✅ Resultado: Se crea un entorno virtualizado con las configuraciones establecidas, listo para usarse en desarrollo o pruebas.
📌 Componentes clave de Vagrant
🔹 Vagrantfile → Archivo de configuración donde se define la máquina virtual.
🔹 Boxes → Imágenes preconfiguradas de sistemas operativos.
🔹 Proveedores → Software que ejecuta las máquinas virtuales (VirtualBox, VMware, Docker, etc.).
🔹 Provisioners → Scripts de automatización para configurar la VM al iniciarse.
📌 Ejemplo avanzado: Configurar múltiples máquinas
Si queremos definir varias máquinas virtuales en un solo Vagrantfile, podemos hacerlo de la siguiente manera:
ruby
Vagrant.configure("2") do |config|
config.vm.define "servidor1" do |servidor1|
servidor1.vm.box = "ubuntu/bionic64"
servidor1.vm.network "private_network", ip: "192.168.56.101"
end
config.vm.define “servidor2” do |servidor2|
servidor2.vm.box = “ubuntu/bionic64”
servidor2.vm.network “private_network”, ip: “192.168.56.102”
end
end
✅ Resultado:
- Se crean dos máquinas virtuales con Ubuntu y direcciones IP fijas.
- Permiten comunicación en red privada entre ellas.
📌 Comparación entre VirtualBox y Vagrant
Característica | VirtualBox | Vagrant |
---|---|---|
Creación manual de VMs | ✅ Sí | ❌ No, automatiza el proceso |
Configuración con código | ❌ No | ✅ Sí, con Vagrantfile |
Facilidad para compartir entornos | ❌ Difícil | ✅ Muy fácil |
Automatización de red y servicios | ❌ Limitado | ✅ Completo |
Compatible con múltiples hipervisores | ❌ Solo VirtualBox | ✅ VirtualBox, VMware, Docker, etc. |
✅ ¿Cuál elegir?
- Usa VirtualBox si solo necesitas ejecutar una VM manualmente.
- Usa Vagrant si necesitas automatizar y compartir entornos fácilmente.
📌 Vagrantfile Lady UP.
# -*- mode: ruby -*-
# vi: set ft=ruby :
#Lady UP
#Routers
#Router Ivan
Vagrant.configure (2) do |config|
config.vm.define “RouterI” do |routeri|
routeri.vm.box = “rocky”
routeri.vm.network “private_network”,
ip: “192.168.202.16”,
netmask: “255.255.255.240”,
virtualbox__intnet: “intdmz”
routeri.vm.network “public_network”,
ip: “172.25.210.4”,
netmask: “255.255.0.0”,
bridge: “eth0”
routeri.vm.provision “shell”, inline: <<-SHELL
echo “1” > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 192.168.4.248/29 -o enp0s9 -j MASQUERADE
ip route del default
ip route add default via 172.25.130.254
ip route add 192.168.202.10/28 via 172.25.213.11 #IP CRIS
ip route add 192.168.202.10/28 via 172.25.211.11 #IP NICO
ip route add 192.168.202.10/28 via 172.25.214.11 #IP MARC
SHELL
end
#Router Nico
config.vm.define “RouterN” do |routern|
routern.vm.box = “rocky”
routern.vm.network “private_network”,
ip: “192.168.202.15”,
netmask: “255.255.255.240”,
virtualbox__intnet: “intdmz”
routern.vm.network “public_network”,
ip: “172.25.210.3”,
netmask: “255.255.0.0”,
bridge: “eth0”
routern.vm.provision “shell”, inline: <<-SHELL
echo “1” > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 192.168.4.248/29 -o enp0s9 -j MASQUERADE
ip route del default
ip route add default via 172.25.130.254
ip route add 192.168.202.10/28 via 172.25.214.11 #IP CRIS
ip route add 192.168.202.10/28 via 172.25.217.11 #IP IVAN
ip route add 192.168.202.10/28 via 172.25.214.11 #IP MARC
SHELL
end
#Router Cris
config.vm.define “RouterC” do |routerc|
routerc.vm.box = “rocky”
routerc.vm.network “private_network”,
ip: “192.168.202.14”,
netmask: “255.255.255.240”,
virtualbox__intnet: “intdmz”
routerc.vm.network “public_network”,
ip: “172.25.210.2”,
netmask: “255.255.0.0”,
bridge: “eth0”
routerc.vm.provision “shell”, inline: <<-SHELL
echo “1” > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 192.168.4.248/29 -o enp0s9 -j MASQUERADE
ip route del default
ip route add default via 172.25.130.254
ip route add 192.168.202.10/28 via 172.25.211.11 #IP Nico
ip route add 192.168.202.10/28 via 172.25.217.11 #IP Ivan
ip route add 192.168.202.10/28 via 172.25.114.11 #IP Marc
SHELL
end
#Router Marc
config.vm.define “Router” do |router|
router.vm.box = “rocky”
router.vm.network “private_network”,
ip: “192.168.202.10”,
netmask: “255.255.255.240”,
virtualbox__intnet: “intdmz”
router.vm.network “public_network”,
ip: “172.25.210.1”,
netmask: “255.255.0.0”,
bridge: “eth0”
router.vm.provision “shell”, inline: <<-SHELL
echo “1” > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 192.168.4.248/29 -o enp0s9 -j MASQUERADE
ip route del default
ip route add default via 172.25.130.254
ip route add 192.168.4.192/28 via 172.25.210.2
ip route add 192.168.202.10/28 via 172.25.213.11 #IP Cris
ip route add 192.168.202.10/28 via 172.25.217.11 #IP Ivan
ip route add 192.168.202.10/28 via 172.25.211.11 #IP Nico
SHELL
end
#Red Servidores(LDAP , NFS , FTP)
#LDAP
config.vm.define “ldap” do |ldap|
ldap.vm.box = “debian”
ldap.vm.network “private_network”,
ip: “192.168.202.11”,
netmask: “255.255.255.240”,
gateway: “192.168.202.10”,
virtualbox__intnet: “intdmz”
ldap.vm.provision “shell”, inline: <<-SHELL
ip route del default
ip route add default via 192.168.202.10
SHELL
ldap.vm.provider “virtualbox” do |vb|
vb.gui = false
end
end
#NFS
config.vm.define “nfs” do |nfs|
nfs.vm.box = “debian”
nfs.vm.network “private_network”,
ip: “192.168.202.12”,
netmask: “255.255.255.240”,
gateway: “192.168.202.10”,
virtualbox__intnet: “intdmz”
nfs.vm.provision “shell”, inline: <<-SHELL
ip route del default
ip route add default via 192.168.202.10
SHELL
nfs.vm.provider “virtualbox” do |vb|
vb.gui = false
end
end
#FTP
config.vm.define “ftp” do |ftp|
ftp.vm.box = “debian”
ftp.vm.network “private_network”,
ip: “192.168.202.13”,
netmask: “255.255.255.240”,
virtualbox__intnet: “FTP”
ftp.vm.network “public_network”,
ip: “172.25.210.2”,
netmask: “255.255.0.0”,
bridge: “eth0”
ftp.vm.provision “shell”, inline: <<-SHELL
apt install -y iptables
echo “1” > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 192.168.4.192/27 -o eth2 -j MASQUERADE
ip route del default
ip route add default via 172.25.130.254
ip route add 192.168.4.248/29 via 172.25.210.2
SHELL
ftp.vm.provider “virtualbox” do |vb|
vb.gui = false
end
end
#CLIENTES
#Linux
config.vm.define “Cliente1” do |linux|
linux.vm.box = “debian”
linux.vm.network “private_network”,
ip: “192.168.202.19”,
netmask: “255.255.255.224”,
gateway: “192.168.202.10”,
virtualbox__intnet: “FTP”
linux.vm.provision “shell”, inline: <<-SHELL
ip route del default
ip route add default via 192.168.202.10
SHELL
linux.vm.provider “virtualbox” do |vb|
vb.gui = false
end
end
#Windows
config.vm.define “Windows10” do |windows|
windows.vm.box = “w10”
windows.vm.boot_timeout = 300
windows.vm.communicator = “winrm”
windows.vm.network “private_network”,
ip: “192.168.202.220”,
netmask: “255.255.255.224”,
gateway: “192.168.202.10”,
virtualbox__intnet: “FTP”
windows.vm.network :forwarded_port,
guest: 3389,
host: 33810
windows.vm.provider “virtualbox” do |vb|
vb.memory = “4096”
end
end
end