Como ya comenté en un artículo anterior, en este curso estoy utilizando contenedores Linux con el software LXD en mis clases de Servicios en Red. En cursos anteriores cuando tenía que preparar el examen práctico lo hacía con un servidor ESXi que tenía montado. Creaba una máquina virtual para cada alumno donde se conectaban de forma remota utilizando SSH para realizar el examen.
Este proceso me llevaba tiempo. Primero creaba una máquina virtual donde instalaba la última versión de Ubuntu Server LTS, esta máquina virtual me iba a servir luego de plantilla. Actualizaba el sistema operativo. Luego le añadía todos los usuarios necesarios para cada alumno, con el comando Linux newusers este paso es relativamente rápido. A continuación, instalaba todos los paquetes de software necesarios para la realización del examen. Borraba el historial y apagaba la máquina virtual para utilizarla de plantilla. Ahora me dedicaba a clonar dicha máquina tantas veces como alumnos tuviese matriculados. Este proceso era lento, un buen rato para cada máquina virtual en mi servidor ESXi. Por último entraba en cada una de ellas y personalizaba las direcciones IP.
Ahora sólo tenía que preparar esta plantilla para el examen. Tras conectarme a la misma con:
sólo quedaba actualizarla, cargarle los usuarios (una vez más con newusers), instalarle los paquetes de software necesarios para el examen y borrar el historial. Este proceso es el que se puede llevar algo más de tiempo según las necesidades.
Mejor con contenedores
La semana pasada tuvimos el primer examen práctico, pero esta vez preparé contenedores en vez de máquinas virtuales. El proceso fue muy rápido comparado con el uso de máquinas virtuales. Primero creé un contenedor con la última versión de Ubuntu Server LTS, Bionic Beaver. Este paso supuso tan sólo unos segundos:
$ lxc launch ubuntu:bionic plantilla_examen
Ahora sólo tenía que preparar esta plantilla para el examen. Tras conectarme a la misma con:
$ lxc exec plantilla_examen bash
sólo quedaba actualizarla, cargarle los usuarios (una vez más con newusers), instalarle los paquetes de software necesarios para el examen y borrar el historial. Este proceso es el que se puede llevar algo más de tiempo según las necesidades.
Una vez preparada la plantilla, por comodidad, la convierto en una imagen para poder crear fácilmente contenedores nuevos:
$ lxc stop plantilla_examen
$ lxc publish plantilla_examen --alias imagen-examen
A continuación, sólo queda crear los contenedores para los alumnos (en este curso sólo 15). Utilizando bucles desde la terminal el proceso es bastante rápido:
$ for i in {01..15}
> do
> lxc launch local:imagen-examen exa$i
> done
Este comando nos crea 15 contenedores llamados exa01, exa02, ..., exa15, a partir de la imagen que se encuentra en el repositorio local. Como me gusta ponerle una dirección IP estática a los mismos, con las siguientes instrucciones se consigue (en este otro artículo expliqué hace unas semanas estos comandos):
$ for i in {1..9}
> do
> lxc stop exa0$i
> lxc network attach lxdbr0 exa0$i eth0
> lxc config device set exa0$i eth0 ipv4.address 172.30.10.$i
> lxc start exa0$i
> done
Nótese que el comando no me acepta que una dirección IP tenga ceros a la izquierda, por ese motivo se realiza en dos partes, las inferiores a 10 y el resto:
$ for i in {10..15}
> do
> lxc stop exa0$i
> lxc network attach lxdbr0 exa0$i eth0
> lxc config device set exa0$i eth0 ipv4.address 172.30.10.$i
> lxc start exa0$i
> done
Por último, les tomé una instantánea como punto de restauración:
$ for i in {01..15}
> do
> lxc snapshot exa$i
> done
Todo este proceso me llevó menos de diez minutos, cuando en cursos anteriores empleaba cerca de ¡dos horas en prepararlo todo!
Redirigiendo el tráfico
Los contenedores los tengo en un servidor Linux que no está conectado directamente a la red local del aula. En mi caso, los ordenadores del aula están conectados entre sí por medio de un switch y el ordenador del profesor cuenta con dos tarjetas de red. Una de ellas conecta el ordenador a la red del aula y hace de puerta de enlace de la misma. La otra lo conecta a una red en la que se encuentran el resto de los ordenadores de los profesores de otras aulas, así como los servidores del departamento.
El servidor que contiene los contenedores se encuentra en esta otra red y a su vez cuenta con un puente software (bridge) para conectar los contenedores a la tarjeta de red del propio servidor. Esto es algo que hace LXD de forma automática cuando se instala (en este otro artículo explico como instalar LXD). Cada vez que un paquete llega a esta máquina, el puente redirige el tráfico a los contenedores si la dirección IP de destino coincide con la dirección de red de los contenedores. Es decir, el puente se encarga de todo automáticamente.
El problema está en como hacer llegar los paquetes que proceden de la red del aula al servidor que contiene los contenedores. Como el ordenador del profesor es a su vez la puerta de enlace del aula, cada paquete de red que vaya destinado a los contenedores pasará por el ordenador del profesor. Ahora sólo habrá que redirigir este tráfico al servidor que contiene los contenedores. En mi caso particular, los contenedores se encuentran en la red 172.30.0.0/16 y el servidor Linux que los alberga tiene como dirección IP 10.255.253.1. Con estos datos ya podemos redirigir el tráfico de red. El siguiente comando se encarga de ello:
$ route add -net 172.30.0.0 netmask 255.255.0.0 gw 10.255.253.1
El comando simplemente añade una nueva ruta a la tabla de enrutamiento del ordenador del profesor. En otros entornos, a lo mejor, hay que añadir una ruta nueva al router del aula o si el servidor se encuentra en la propia red del aula, habrá que añadirle la ruta a los propios ordenadores de los alumnos.
Y esto es todo por esta semana.
@josrrp
Comentarios
Publicar un comentario