Scripts para Proxmox: crear usuario con un conjunto de máquinas virtuales (parte 1)

Publicado por P. Ruiz en

En mi trabajo, necesitamos que cada alumno disponga de un conjunto de sistemas donde poner en práctica el contenido de diferentes materias.

Los escenarios pueden ser muy diferentes:

  • En ocasiones, necesitamos máquinas individuales, que ejecuten sistemas operativos concretos.

  • Otras veces conjuntos de máquinas con sistemas operativos del mismo tipo.

  • Incluso implementaciones cliente/servidor donde participen sistemas operativos de tipos diferentes que asuman distintos roles en la infraestructura.

Además, los alumnos deben tener control absoluto sobre sus sistemas, para que puedan realizar todo tipo de ajustes.

En este contexto, la virtualización es imprescindible, porque la alternativa de usar equipos físicos sería muy compleja y con un coste elevado.

Incluso utilizando máquinas virtuales que se ejecuten en el ordenador de trabajo del alumno, el coste es difícil de asumir, porque cada uno de esos ordenadores debe tener una potencia suficiente para ejecutar, de manera solvente, las configuraciones de los alumnos.

Todo este planteamiento nos llevó en su día a implementar un servidor de virtualización sobre Proxmox VE. De ese modo, hemos centralizado todos los recursos necesarios para virtualizar las máquinas de los alumnos. Así, cuando necesitamos más memoria, o más capacidad de almacenamiento, realizamos los cambios en el servidor y se beneficia todo el grupo de alumnos de forma inmediata.

Una ventaja añadida es que resulta bastante sencillo facilitar el acceso al servidor de virtualización, desde cualquier ordenador que disponga de navegador de Internet, incluso desde fuera de las instalaciones del centro educativo. Esto permite a nuestros alumnos tener disponibles sus laboratorios de prácticas las 24 horas del día, todos los días de la semana.

Por cierto, si estás interesado en instalar y configurar Proxmox VE y necesitas ayuda, puedes consultar los artículos publicados en SomeBooks.es sobre este tema.

Automatizar la creación de laboratorios de prácticas

Llegados a este punto, nos enfrentamos al problema de agilizar la creación de esos laboratorios de prácticas para los alumnos.

Imagina, por ejemplo, que cada alumno va a necesitar una máquina para Windows Server, otra para Windows 10 y una tercera para Ubuntu Desktop.

Seguiremos los siguientes pasos:

  1. Crear una máquina virtual de cada tipo.

  2. Convertir las máquinas anteriores en plantillas.

  3. Crear una cuenta de usuario para el alumno.

  4. Crear un conjunto (pool, si utilizas Proxmox VE en inglés) que contenga la cuenta del usuario y sus máquinas virtuales.

  5. Clonar cada plantilla creada en el punto 2 y asociarlas al conjunto del punto 4.

Los dos primeros apartados los haremos en la interfaz weby los tres siguientes usando comandos.

Al final del artículo crearemos un script que automatice el paso 5, para no tener que crear las máquinas virtuales una a una. Y en el siguiente artículo crearemos un script que automatice todo el proceso.

Una vez fijados los objetivos, comencemos…

Paso 1: Crear una máquina virtual de cada tipo

Como hemos dicho antes, esta parte la resolveremos usando la interfaz web. Para lograrlo, podemos seguir las indicaciones del artículo Crear una máquina virtual en Proxmox VE, aunque para las máquinas de Windows, te recomiendo revisar también los artículos Crear una máquina virtual para Windows 10 en Proxmox VE y Instalar Windows 10 en una máquina virtual sobre Proxmox VE, que pueden aplicarse también a otras versiones de Windows, tanto en versiones Server como escritorio.

Paso 2: Convertir las máquinas anteriores en plantillas

Para convertir las máquinas en plantillas, solo tenemos que seguir las explicaciones del artículo Crear una plantilla en Proxmox VE a partir de una máquina virtual.

Paso 3: Crear una cuenta de usuario para el alumno

Ya le dedicamos un artículo a la creación de cuentas de usuario desde la interfaz web de Proxmox VE (Crear nuevas cuentas de usuario en Proxmox VE), pero hoy aprenderemos a crearlas desde la línea de comandos.

Para usar la línea de comandos de Proxmox VE, solo tienes que hacer clic, en el panel izquierdo, sobre el nombre del servidor. A continuación, en el panel central, debes hacer clic sobre la opción >_ Shell.

Al hacerlo, en el panel derecho aparecerá la consola, lista para que comiences a escribir órdenes.

Scripts-para-Proxmox-crear-usuario-con-un-conjunto-de-máquinas-virtuales-001

Para lograr nuestro objetivo, comenzaremos usando el comando pveum useradd con la siguiente sintaxis:

pveum useradd "usuario@pve"

Donde usuario representa el nombre que vamos a darle a la cuenta.

Escribimos el comando y pulsamos la tecla Intro.

Scripts-para-Proxmox-crear-usuario-con-un-conjunto-de-máquinas-virtuales-002

Al ejecutarlo, comprobamos que no se haya producido ningún error.

A continuación, le asignaremos a la cuenta una contraseña predeterminada. Lo conseguiremos  con la orden pvesh set /access/password usando la siguiente sintaxis:

pvesh set /access/password --userid "usuario@pve" --password "password.123"

Como puedes imaginar, el texto password.123 será la contraseña que deba utilizar el usuario la primera vez que inicie sesión en el sistema. Debemos recomendarle cambiarla lo antes posible.

De nuevo, comprobamos que la orden se ejecuta sin errores.

Scripts-para-Proxmox-crear-usuario-con-un-conjunto-de-máquinas-virtuales-003

Paso 4: Crear un conjunto para el usuario

Como hemos dicho al principio, el siguiente paso consiste en crear un conjunto que vincule al usuario con las máquinas virtuales que formarán su laboratorio de prácticas. También en este caso, dedicamos en su momento un artículo para realizar la tarea desde la interfaz web (Crear Conjuntos en Proxmox VE), pero podemos lograrlo desde la línea de comandos usando la orden pvesh create pools con la siguiente sintaxis:

pvesh create pools -poolid "usuario"

Como ves, he decidido llamar al conjunto con el nombre de la cuenta de usuario, para que resulte sencillo identificarlo.

Una vez más, ejecutamos la orden y comprobamos que todo haya sido correcto.

Scripts-para-Proxmox-crear-usuario-con-un-conjunto-de-máquinas-virtuales-004

A continuación, debemos darle permiso al usuario sobre el conjunto. Lo haremos con el el comando pvesh set /access/acl, con la siguiente sintaxis:

pvesh set /access/acl -path /pool/"usuario" -roles PVEVMAdmin -users "usuario@pve"

Como puedes suponer de la sintaxis anterior, no solo vinculamos el usuario al conjunto, sino que también le asignamos el rol PVEVMAdmin sobre él. Esto le permitirá al usuario administrar las máquinas virtuales del conjunto.

Como antes, ejecutamos la orden y comprobamos que todo haya sido correcto.

Scripts-para-Proxmox-crear-usuario-con-un-conjunto-de-máquinas-virtuales-005

Paso 5: Clonar cada plantilla y asociarlas al conjunto

El último paso de esta tarea será clonar cada máquina y asociarla al conjunto anterior. Ya aprendimos a realizar esta tarea desde la interfaz web, en el artículo Crear una plantilla en Proxmox VE a partir de una máquina virtual, pero ahora lo haremos usando la orden pvesh create con la siguiente sintaxis:

pvesh create /nodes/somebooks01/qemu/501/clone --pool="usuario" --newid $(pvesh get /cluster/nextid) --name "usuario-maquina01" --full

Donde somebooks01 es el nombre del servidor Proxmox VE, 501 el identificador de la plantilla que vamos a clonar, usuario-maquina01 el nombre de la máquina resultante y full indica que la clonación será completa (lo contrario sería hacer una clonación que se mantuviese vinculada con la plantilla original).

Un momento más tarde, la clonación se ha completado con éxito.

Scripts-para-Proxmox-crear-usuario-con-un-conjunto-de-máquinas-virtuales-006

Observa que parte del nombre de la máquina está formado por el nombre de la cuenta de usuario que actuará como su propietaria. Así, cuando tengamos un gran número de máquinas y cuentas de usuario, será más fácil saber a qué cuenta de usuario pertenece cada máquina.

Lo único que quedaría por explicar de la línea anterior sería esto:

pvesh get /cluster/nextid

Aunque probablemente ya habrás deducido que su función es devolvernos el siguiente identificador disponible en Proxmox VE, con el fin de asignárselo a la máquina que estamos creando.

También podrías asignar el identificador a la nueva máquina de forma manual, escribiendo el número que prefieras, pero creo que esta opción es mucho más versátil.

Como es lógico, esta tarea habrá que repetirla para cada una de las máquinas implicadas. Para el ejemplo que planteábamos al principio, lo haríamos tres veces (una para la máquina de Windows Server, otra para la de Windows 10 y otra para la de Ubuntu Desktop).

Hemos creado tres máquinas virtuales para el conjunto del usuario.

Scripts-para-Proxmox-crear-usuario-con-un-conjunto-de-máquinas-virtuales-007

Crear un script que facilite el paso 5

Quizás el primer problema que deberíamos resolver sería el trabajo repetitivo del paso 5 del punto anterior. Para lograrlo, podríamos crear un archivo de texto que relacione el id de cada plantilla y el nombre de la máquina que queremos crear con ella. Algo como esto:

501,WS2019
502,W10
503,UD2004

Para nuestro ejemplo el archivo se va a llamar maquinas.txt y lo guardaremos dentro de un subdirectorio llamado datos.

Como es lógico, lo primero será crear la carpeta donde pondremos el archivo, lo conseguiremos con la orden:

mkdir -p /scripts/datos

Con esta orden, logramos varias cosas al mismo tiempo:

    1. Estamos creando un nuevo subdirectorio dentro del directorio principal, llamado scripts, donde guardaremos todos los scripts que vayamos desarrollando en esta serie de artículos.

    2. En su interior, creamos el subdirectorio datos, donde pondremos todos los archivos que vayamos requiriendo desde dichos scripts.

Logramos ambas cosas gracias al argumento -p, que nos permite escribir una ruta completa en el comando mkdir y crear todos los elementos que falten en el árbol de directorios.

Ejecutamos la orden.

Scripts-para-Proxmox-crear-usuario-con-un-conjunto-de-máquinas-virtuales-008

Una vez creada la estructura, es momento de usar el editor nano para crear el archivo:

nano /scripts/datos/maquinas.txt

Abrimos el editor.

Scripts-para-Proxmox-crear-usuario-con-un-conjunto-de-máquinas-virtuales-009

Y cuando nos encontremos en el área de trabajo de nano, escribimos el contenido del archivo maquinas.txt.

Cuando hayamos terminado, pulsamos Ctrl + X para salir, y nos aseguramos de guardar los cambios.

Scripts-para-Proxmox-crear-usuario-con-un-conjunto-de-máquinas-virtuales-010

Con esto, estaremos listos para escribir el script que resuelva el paso 5 del apartado anterior. Lo llamaremos usuarionuevo.sh y puede ser algo parecido a esto:

#!/bin/bash
while IFS=, read -r plantilla maquina do echo "Creando usuario-$maquina desde $plantilla"
 pvesh create /nodes/somebooks01/qemu/$plantilla/clone \ --pool="usuario" \ --newid $(pvesh get /cluster/nextid) \ --name "usuario-$maquina" \ --full done < "datos/maquinas.txt"

Como ves, solo hemos incluido la orden que explicamos arriba, en un bucle que recorre el archivo, línea a línea usando un bucle while. IFS identifica el carácter que se usará como separador de campos en cada línea (en este caso, la coma). El primer valor de la línea se guarda en la variable plantilla y el segundo en la variable maquina.

A continuación, en la orden pvesh create sustituimos los valores fijos por las variables anteriores.

El último detalle es que dividimos la orden en varias líneas usando la barra invertida (\). De este modo, mejoramos la legibilidad del script.

Como antes, usaremos el editor nano para crear el archivo:

nano /scripts/usuarionuevo.sh

Abrimos de nuevo el editor…

Scripts-para-Proxmox-crear-usuario-con-un-conjunto-de-máquinas-virtuales-011

Y, cuando hayamos vuelto al área de trabajo del nano, escribimos el contenido del archivo usuarionuevo.sh.

Como antes, una vez completada la tarea, pulsamos Ctrl + X para salir, y nos aseguramos de guardar los cambios.

Scripts-para-Proxmox-crear-usuario-con-un-conjunto-de-máquinas-virtuales-012

Para terminar, cambiaremos los permisos del archivo que acabamos de crear, para que sea posible ejecutarlo. Lo conseguimos con la siguiente orden:

chmod 0700 /scripts/usuarionuevo.sh

Solo tenemos que escribir la orden en la terminal, y pulsar la tecla Intro.

Scripts-para-Proxmox-crear-usuario-con-un-conjunto-de-máquinas-virtuales-013

Para comprobar que el script funciona correctamente, solo hay que eliminar las máquinas virtuales que creamos antes y ejecutar el script para comprobar que vuelven  crearse de forma correcta.

Lo hacemos desplazándonos hasta la carpeta /scripts y ejecutando el siguiente comando:

./usuarionuevo.sh

Como antes, escribimos la orden y pulsamos la tecla Intro.

Scripts-para-Proxmox-crear-usuario-con-un-conjunto-de-máquinas-virtuales-014

El proceso de creación comienza inmediatamente.

Observa que las nuevas máquinas comienzan a aparecer en el panel izquierdo…

Scripts-para-Proxmox-crear-usuario-con-un-conjunto-de-máquinas-virtuales-015

Cuando se complete la ejecución del script, volveremos a disponer de un nuevo conjunto de máquinas virtuales para el usuario.

Ya podemos dar por concluida esta parte de nuestro objetivo.

Scripts-para-Proxmox-crear-usuario-con-un-conjunto-de-máquinas-virtuales-016

Con esto, habremos terminado la tarea de este artículo, pero no te pierdas el siguiente, porque en él conseguiremos que lo explicado aquí, te resulte realmente útil.