Instalación de vagrant en Debian 12

vargrant

¿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.