1. Preparación del entorno

En esta parte vamos a construir la infraestructura virtual del laboratorio anterior. Utilizaremos Containerlab porque permite definir topologías de red mediante YAML, crear conexiones entre dispositivos y gestionar su ciclo de vida desde la terminal.

El controlador seguirá siendo nuestro Manjaro Linux, donde ya tenemos Docker y Ansible.

Containerlab admite tanto sistemas de red ejecutados directamente en contenedores como dispositivos virtuales basados en QEMU. Es el caso de Cisco IOSv, que funciona dentro de un contenedor gestionado mediante vrnetlab.

Vamos a utilizar:

Equipo Plataforma Tipo Containerlab
cisco01 Cisco IOSv cisco_vios
arista01 Arista cEOS arista_ceos
vyos01 VyOS 1.5 vyosnetworks_vyos

Estos tipos están documentados oficialmente por Containerlab.

2. Instalar Containerlab en Manjaro

En Manjaro podemos instalar Containerlab desde AUR.

pamac build containerlab

Comprobamos:

containerlab version

Y verificamos Docker:

sudo docker info

Si Docker todavía no está activo:

sudo systemctl enable --now docker

Para los dispositivos basados en QEMU necesitamos comprobar la aceleración por hardware:

ls -l /dev/kvm

Si no existe /dev/kvm, tendremos que revisar la configuración de virtualización del sistema.

3. Preparar las imágenes

Hay una diferencia respecto a los laboratorios Docker convencionales: las imágenes de Cisco, Arista y VyOS no se obtienen necesariamente mediante un simple docker pull.

Cisco IOSv: necesitamos una imagen obtenida legalmente y convertida al formato compatible con vrnetlab. Utilizaremos la implementación srl-labs/vrnetlab y el tipo cisco_vios.

Arista cEOS: descargamos el archivo de cEOS desde el portal de Arista y lo importamos a Docker. Por ejemplo, para una versión concreta:

docker import \
  cEOS64-lab-4.32.0F.tar.xz \
  ceos:4.32.0F

VyOS: utilizaremos la variante de VyOS compatible con Containerlab, que requiere preparar una imagen de contenedor a partir de la distribución de VyOS. La integración documentada se ha probado con VyOS 1.5 Q1 Stream o posterior.

Antes de continuar verificamos que tenemos disponibles las tres imágenes:

docker image ls

Para los ejemplos siguientes asumiremos estas etiquetas locales:

vrnetlab/cisco_vios:lab
ceos:4.32.0F
vyos:1.5-lab

Son nombres de referencia para imágenes que debemos construir o importar previamente; no son imágenes públicas garantizadas.

4. Definir la topología

Creamos el directorio:

mkdir -p ~/proyectos/ansible-network-lab
cd ~/proyectos/ansible-network-lab

Archivo network.clab.yml:

name: ansible-network

mgmt:
  network: ansible-network-mgmt
  ipv4-subnet: 172.31.100.0/24

topology:
  nodes:

    cisco01:
      kind: cisco_vios
      type: router
      image: vrnetlab/cisco_vios:lab
      mgmt-ipv4: 172.31.100.11

    arista01:
      kind: arista_ceos
      image: ceos:4.32.0F
      mgmt-ipv4: 172.31.100.12

    vyos01:
      kind: vyosnetworks_vyos
      image: vyos:1.5-lab
      mgmt-ipv4: 172.31.100.13

  links:
    - endpoints:
        - cisco01:Gi0
        - arista01:eth1

    - endpoints:
        - arista01:eth2
        - vyos01:eth1

Tenemos dos conexiones de datos y una red de gestión común.

<text preserveWhitespace={false}>La topología se ajusta a la nomenclatura de Containerlab: en Cisco vIOS, Gi0 representa el primer puerto de datos y GigabitEthernet0/0 corresponde a gestión. Por tanto, en los playbooks de la parte anterior sustituiremos GigabitEthernet0/1 por la interfaz real correspondiente a Gi0, una vez comprobada con show ip interface brief.</text>

También actualizaremos el inventario para utilizar las nuevas direcciones 172.31.100.11 a 172.31.100.13.

5. Desplegar los dispositivos

Ejecutamos:

sudo containerlab deploy -t network.clab.yml

Containerlab crea los contenedores, la red de gestión y los enlaces virtuales.

Consultamos:

sudo containerlab inspect -t network.clab.yml

Y comprobamos los contenedores:

sudo docker ps

Deberíamos encontrar los tres nodos una vez que hayan arrancado correctamente.

Los nombres utilizados por Docker seguirán el esquema:

clab-ansible-network-cisco01
clab-ansible-network-arista01
clab-ansible-network-vyos01

6. Comprobar acceso a los dispositivos

Probamos Cisco:

ssh admin@172.31.100.11

Arista:

ssh admin@172.31.100.12

VyOS:

ssh admin@172.31.100.13

Las credenciales iniciales dependen de las imágenes y su configuración de arranque. Para el laboratorio crearemos un usuario específico de Ansible o configuraremos el inventario con un usuario autorizado.

También podemos entrar directamente en Arista desde Docker:

sudo docker exec -it \
  clab-ansible-network-arista01 Cli

En VyOS comprobamos las interfaces:

show interfaces

Y en Cisco:

show ip interface brief

En este punto todavía no necesitamos configurar OSPF ni BGP. Únicamente queremos confirmar que cada dispositivo arranca, reconoce sus interfaces y permite el acceso administrativo.

7. Integrar Containerlab con Ansible

Podemos reutilizar el inventario anterior cambiando las IP de gestión:

---
all:
  children:
    network:
      children:

        cisco:
          hosts:
            cisco01:
              ansible_host: 172.31.100.11

        arista:
          hosts:
            arista01:
              ansible_host: 172.31.100.12

        vyos:
          hosts:
            vyos01:
              ansible_host: 172.31.100.13

Mantenemos los group_vars con los transportes y sistemas operativos correspondientes.

La primera comprobación será obtener la versión de los dispositivos:

ansible-playbook playbooks/01-audit.yml

No utilizaremos ansible.builtin.ping, porque estos equipos de red no son hosts Linux convencionales preparados para ejecutar módulos Python remotos.

Nuestro primer objetivo será que los tres devuelvan correctamente show version.

8. Validar los enlaces de datos

Una vez confirmada la gestión SSH, configuramos únicamente las direcciones IP de los enlaces.

Enlace Equipo Interfaz Dirección
1 Cisco Gi0 10.0.12.1/30
1 Arista Ethernet1 10.0.12.2/30
2 Arista Ethernet2 10.0.23.1/30
2 VyOS eth1 10.0.23.2/30

El orden de validación será:

  1. Comprobar que las interfaces están activas.

  2. Verificar la conectividad directa Cisco–Arista.

  3. Verificar la conectividad directa Arista–VyOS.

  4. Aplicar OSPF y comprobar adyacencias.

  5. Configurar BGP entre Arista y VyOS.

En los enlaces de Arista configuraremos no switchport, porque necesitamos interfaces L3.

Cuando los dos enlaces respondan a ping, podremos aplicar los playbooks OSPF y BGP desarrollados en la segunda parte.

9. Guardar y recuperar el laboratorio

Containerlab permite administrar el ciclo de vida de la topología sin tener que gestionar manualmente cada contenedor.

Consultar los nodos:

sudo containerlab inspect -t network.clab.yml

Guardar las configuraciones de los nodos compatibles:

sudo containerlab save -t network.clab.yml

Destruir el laboratorio:

sudo containerlab destroy -t network.clab.yml

Reconstruirlo:

sudo containerlab deploy -t network.clab.yml

Antes de eliminar el laboratorio también realizaremos backups desde Ansible, almacenándolos fuera de los contenedores.


10. Qué tendremos preparado

Al finalizar el montaje dispondremos de una red virtual multi-vendor, con enlaces de datos y gestión independiente.

La ventaja de trabajar así es que podemos modificar topologías, crear nuevas conexiones y reconstruir dispositivos sin depender de hardware físico.

Sobre esta infraestructura podremos realizar automatizaciones progresivamente más avanzadas: routing dinámico, políticas de seguridad, validación de configuraciones, recuperación de fallos y pruebas de cambios antes de llevarlos a producción.