Instalación de vagrant en Debian 12
¿Que es vagrant?
Vagrant es una herramienta de orquestación de código abierto para crear y administrar entornos virtualizados.
Requisitos
- Sistema Debian 12 actualizado.
- Privilegios de root o sudo.
- Acceso a internet.
- libvirt y qemu-kvm instalados.
Instalacion
En este post se instalara vagrant con libvirt como proveedor de virtualizacion.
Para instalar vagrant ejecutamos el siguiente comando:
root@vagrant:~# apt install vagrant-libvirt -y
Creacion de máquinas virtuales
Para nuestras primeras máquinas virtuales, tenemos que crear un fichero de configuración llamado Vagrantfile, que contendrá la configuración de las virtualizaciones.
usuario@vagrant:~/vagrant/prueba$ vagrant init
usuario@vagrant:~/vagrant/prueba$ nano Vagrantfile
El primer vagrantfile que vamos a crear es bastante sencillo, solo vamos a crear dos máquinas virtuales, una con Debian 12 y otra con CentOS 8.
Vagrant.configure("2") do |config|
config.vm.define :node1 do |node1|
node1.vm.box = "debian/bookworm64"
node1.vm.hostname = "node1"
node1.vm.synced_folder ".", "/vagrant", disabled: true
end
config.vm.define :node2 do |node2|
node2.vm.box = "centos/8"
node2.vm.hostname = "node2"
node2.vm.synced_folder ".", "/vagrant", disabled: true
end
end
- config.vm.define: Define el nombre de la máquina virtual.
- config.vm.box: Define la imagen de la máquina virtual. Podemos ver las imágenes disponibles en Vagrant Cloud.
- config.vm.hostname: Define el nombre del host.
- config.vm.synced_folder: Define la carpeta compartida entre el host y la máquina virtual.
Una vez creado el vagrantfile, podemos iniciar las máquinas virtuales con el siguiente comando:
usuario@vagrant:~/vagrant/prueba$ vagrant up
Ver el estado de las máquinas virtuales
Podemos ver las máquinas virtuales creadas tanto por vagrant como por libvirt con los siguientes comandos:
Vagrant:
usuario@vagrant:~/vagrant/prueba$ vagrant status
Current machine states:
node1 running (libvirt)
node2 running (libvirt)
Libvirt:
usuario@vagrant:~/vagrant/prueba$ sudo virsh list
Id Nombre Estado
---------------------------------
1 prueba_node1 ejecutando
2 prueba_node2 ejecutando
Conexion a las máquinas virtuales
También podemos conectarnos a las máquinas virtuales con el siguiente comando:
usuario@vagrant:~/vagrant/prueba$ vagrant ssh node1
Linux node1 6.1.0-15-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.66-1 (2023-12-09) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
vagrant@node1:~$
Apagar las máquinas virtuales
Para apagar las máquinas virtuales ejecutamos el siguiente comando:
usuario@vagrant:~/vagrant/prueba$ vagrant halt
Eliminar las máquinas virtuales
Para eliminar las máquinas virtuales ejecutamos el siguiente comando:
usuario@vagrant:~/vagrant/prueba$ vagrant destroy
Añadir interfaces de red
So nos fijamos en las interfaces de red de las máquinas virtuales, vemos que aparte de la interfaz “lo”, tenemos otra con la dirección de red “192.168.121.0/24” que es la que utiliza vagrant para que podamos conectarnos con vagrant ssh.
Por lo que estas máquina ahora mismo no tienen acceso a internet.
vagrant@node1:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 52:54:00:b2:b6:59 brd ff:ff:ff:ff:ff:ff
altname enp0s5
altname ens5
inet 192.168.121.96/24 brd 192.168.121.255 scope global dynamic eth0
valid_lft 3483sec preferred_lft 3483sec
inet6 fe80::5054:ff:feb2:b659/64 scope link
valid_lft forever preferred_lft forever
Vamos a modificar nuestro vagrantfile para añadir dos interfaces de red a cada máquina virtual, una privada para que se puedan comunicar entre ellas internamente y otra pública para que tengan acceso a internet.
Vagrant.configure("2") do |config|
config.vm.define :node1 do |node1|
node1.vm.box = "debian/bookworm64"
node1.vm.hostname = "node1"
node1.vm.synced_folder ".", "/vagrant", disabled: true
node1.vm.network :private_network,
:libvirt__network_name => "privada",
:libvirt__dhcp_enabled => false,
:ip => "10.0.0.2",
:netmask => "255.0.0.0",
:libvirt__forward_mode => "veryisolated"
node1.vm.network :public_network,
:dev => "br0",
:mode => "bridge",
:type => "bridge",
use_dhcp_assigned_default_route: true
end
config.vm.define :node2 do |node2|
node2.vm.box = "centos/8"
node2.vm.hostname = "node2"
node2.vm.synced_folder ".", "/vagrant", disabled: true
node2.vm.network :private_network,
:libvirt__network_name => "privada",
:libvirt__dhcp_enabled => false,
:ip => "10.0.0.3",
:netmask => "255.0.0.0",
:libvirt__forward_mode => "veryisolated"
node2.vm.network :public_network,
:dev => "br0",
:mode => "bridge",
:type => "bridge",
use_dhcp_assigned_default_route: true
end
end
-
node1.vm.network: Añade una interfaz de red a la máquina virtual.
-
:libvirt__network_name: Nombre de la red privada.
-
:libvirt__dhcp_enabled: Desactiva el servidor DHCP.
-
:ip: Dirección IP de la interfaz de red.
-
:netmask: Máscara de red.
-
:libvirt__forward_mode: Modo de red.
-
node1.vm.network: Añade una interfaz de red a la máquina virtual.
-
:dev: Nombre de la interfaz de red.
-
:mode: Modo de la interfaz de red.
-
:type: Tipo de interfaz de red.
-
use_dhcp_assigned_default_route: Habilita el uso de la ruta predeterminada asignada por DHCP.
Si todavia tenemos las máquinas virtuales anteriormente creadas, las eliminamos y volvemos a crearlas con los siguientes comandos:
usuario@vagrant:~/vagrant/prueba$ vagrant destroy
usuario@vagrant:~/vagrant/prueba$ vagrant up
Una vez creadas las máquinas virtuales, nos conectamos a ellas y comprobamos las interfaces de red.
Como podemos ver, ahora tenemos 2 interfaces de red nuevas, eth1 (privada) y eth2 (pública).
vagrant@node1:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 52:54:00:c2:5e:f1 brd ff:ff:ff:ff:ff:ff
altname enp0s5
altname ens5
inet 192.168.121.134/24 brd 192.168.121.255 scope global dynamic eth0
valid_lft 3411sec preferred_lft 3411sec
inet6 fe80::5054:ff:fec2:5ef1/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 52:54:00:3e:83:87 brd ff:ff:ff:ff:ff:ff
altname enp0s6
altname ens6
inet 10.0.0.2/8 brd 10.255.255.255 scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fe3e:8387/64 scope link
valid_lft forever preferred_lft forever
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 52:54:00:a4:f5:17 brd ff:ff:ff:ff:ff:ff
altname enp0s7
altname ens7
inet 192.168.50.23/24 brd 192.168.50.255 scope global dynamic eth2
valid_lft 86221sec preferred_lft 86221sec
inet6 fd6b:2114:6973:9d47:5054:ff:fea4:f517/64 scope global dynamic mngtmpaddr
valid_lft 1631sec preferred_lft 1631sec
inet6 fe80::5054:ff:fea4:f517/64 scope link
valid_lft forever preferred_lft forever
Para comprobar que tenemos acceso a internet, hacemos ping a google.com.
vagrant@node1:~$ ping google.com
PING google.com (142.250.200.110) 56(84) bytes of data.
64 bytes from mad41s13-in-f14.1e100.net (142.250.200.110): icmp_seq=1 ttl=120 time=10.1 ms
64 bytes from mad41s13-in-f14.1e100.net (142.250.200.110): icmp_seq=2 ttl=120 time=10.7 ms
64 bytes from mad41s13-in-f14.1e100.net (142.250.200.110): icmp_seq=3 ttl=120 time=10.0 ms
64 bytes from mad41s13-in-f14.1e100.net (142.250.200.110): icmp_seq=4 ttl=120 time=10.5 ms
^C
--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 10.030/10.320/10.671/0.267 ms
Para comprobar que tenemos acceso a la red privada, hacemos ping a la otra máquina virtual.
vagrant@node1:~$ ping 10.0.0.3
PING 10.0.0.3 (10.0.0.3) 56(84) bytes of data.
64 bytes from 10.0.0.3: icmp_seq=1 ttl=64 time=1.23 ms
64 bytes from 10.0.0.3: icmp_seq=2 ttl=64 time=1.47 ms
64 bytes from 10.0.0.3: icmp_seq=3 ttl=64 time=1.20 ms
64 bytes from 10.0.0.3: icmp_seq=4 ttl=64 time=1.31 ms
^C
--- 10.0.0.3 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 1.202/1.301/1.467/0.103 ms
Añadir discos duros
Si ejecutamos el siguiente comando, podemos ver que las máquinas virtuales solo tienen un disco duro.
vagrant@node1:~$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
vda 254:0 0 20G 0 disk
└─vda1 254:1 0 20G 0 part /
Para añadir discos duros a las máquinas virtuales, modificamos el vagrantfile de la siguiente manera:
Vamos a añadir dos discos duros a la máquina virtual node1, uno de 1GB y otro de 2GB.
Vagrant.configure("2") do |config|
config.vm.define :node1 do |node1|
node1.vm.box = "debian/bookworm64"
node1.vm.hostname = "node1"
node1.vm.synced_folder ".", "/vagrant", disabled: true
node1.vm.network :private_network,
:libvirt__network_name => "privada",
:libvirt__dhcp_enabled => false,
:ip => "10.0.0.2",
:netmask => "255.0.0.0",
:libvirt__forward_mode => "veryisolated"
node1.vm.provider :libvirt do |libvirt|
libvirt.storage :file, :size => '1G'
libvirt.storage :file, :size => '2G'
end
node1.vm.network :public_network,
:dev => "br0",
:mode => "bridge",
:type => "bridge",
use_dhcp_assigned_default_route: true
end
config.vm.define :node2 do |node2|
node2.vm.box = "centos/8"
node2.vm.hostname = "node2"
node2.vm.synced_folder ".", "/vagrant", disabled: true
node2.vm.network :private_network,
:libvirt__network_name => "privada",
:libvirt__dhcp_enabled => false,
:ip => "10.0.0.3",
:netmask => "255.0.0.0",
:libvirt__forward_mode => "veryisolated"
node2.vm.network :public_network,
:dev => "br0",
:mode => "bridge",
:type => "bridge",
use_dhcp_assigned_default_route: true
end
end
- node1.vm.provider :libvirt: Añade un disco duro a la máquina virtual.
- libvirt.storage :file: Tipo de disco duro.
- :size: Tamaño del disco duro.
Una vez modificado el vagrantfile, eliminamos las máquinas virtuales y las volvemos a crear.
usuario@vagrant:~/vagrant/prueba$ vagrant destroy
usuario@vagrant:~/vagrant/prueba$ vagrant up
Una vez creadas las máquinas virtuales, nos conectamos a ellas y comprobamos los discos duros.
Como podemos ver, ahora tenemos 3 discos duros, vda (20GB), vdb (1GB) y vdc (2GB).
vagrant@node1:~$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
vda 254:0 0 20G 0 disk
└─vda1 254:1 0 20G 0 part /
vdb 254:16 0 1G 0 disk
vdc 254:32 0 2G 0 disk
Uso de recursos
Si ejecutamos los siguientes comandos, podemos ver que la máquina virtual node1 tiene 479 MB de RAM y 1 CPU.
vagrant@node1:~$ free --mega
total used free shared buff/cache available
Mem: 479 87 285 2 120 392
Swap: 0 0 0
vagrant@node1:~$ nproc
1
Para modificar los recursos de las máquinas virtuales, modificamos el vagrantfile de la siguiente manera:
Vamos a añadir 1GB de RAM y 2 CPUs a la máquina virtual node1 y 2GB de RAM y 2 CPUs a la máquina virtual node2.
Vagrant.configure("2") do |config|
config.vm.define :node1 do |node1|
node1.vm.box = "debian/bookworm64"
node1.vm.hostname = "node1"
node1.vm.synced_folder ".", "/vagrant", disabled: true
node1.vm.provider :libvirt do |libvirt|
libvirt.memory = 1024
libvirt.cpus = 2
end
node1.vm.network :private_network,
:libvirt__network_name => "privada",
:libvirt__dhcp_enabled => false,
:ip => "10.0.0.2",
:netmask => "255.0.0.0",
:libvirt__forward_mode => "veryisolated"
node1.vm.provider :libvirt do |libvirt|
libvirt.storage :file, :size => '1G'
libvirt.storage :file, :size => '2G'
end
node1.vm.network :public_network,
:dev => "br0",
:mode => "bridge",
:type => "bridge",
use_dhcp_assigned_default_route: true
end
config.vm.define :node2 do |node2|
node2.vm.box = "centos/8"
node2.vm.hostname = "node2"
node2.vm.synced_folder ".", "/vagrant", disabled: true
node2.vm.provider :libvirt do |libvirt|
libvirt.memory = 2048
libvirt.cpus = 2
end
node2.vm.network :private_network,
:libvirt__network_name => "privada",
:libvirt__dhcp_enabled => false,
:ip => "10.0.0.3",
:netmask => "255.0.0.0",
:libvirt__forward_mode => "veryisolated"
node2.vm.network :public_network,
:dev => "br0",
:mode => "bridge",
:type => "bridge",
use_dhcp_assigned_default_route: true
end
end
- node1.vm.provider :libvirt: Añade recursos a la máquina virtual.
- libvirt.memory: Tamaño de la RAM.
- libvirt.cpus: Número de CPUs.
Una vez modificado el vagrantfile, eliminamos las máquinas virtuales y las volvemos a crear.
usuario@vagrant:~/vagrant/prueba$ vagrant destroy
usuario@vagrant:~/vagrant/prueba$ vagrant up
Una vez creadas las máquinas virtuales, nos conectamos a ellas y comprobamos los recursos.
node1
Como podemos ver, ahora tenemos 1GB de RAM y 2 CPUs en la máquina virtual node1.
vagrant@node1:~$ free --mega
total used free shared buff/cache available
Mem: 1007 225 794 2 120 781
Swap: 0 0 0
vagrant@node1:~$ nproc
2
node2
Como podemos ver, ahora tenemos 2GB de RAM y 2 CPUs en la máquina virtual node2.
[vagrant@node2 ~]$ free --mega
total used free shared buff/cache available
Mem: 2072 148 1714 10 209 1764
Swap: 2147 0 2147
[vagrant@node2 ~]$ nproc
2
Con esto ya hemos visto como crear máquinas virtuales con vagrant y algunas de las opciones que nos ofrece.