Scripts para Proxmox: añadir nuevas máquinas virtuales a un usuario

Publicado por P. Ruiz en

Ya te conté en el primer artículo de esta serie (enlazado más abajo), que en mi trabajo solemos crear conjuntos de máquinas virtuales asociados a cada alumno. En estas máquinas virtuales, los alumnos realizan sus actividades de aprendizaje.

Para lograrlo, en nuestro servidor Proxmox creamos una máquina virtual de cada tipo que necesitemos y las convertimos en plantillas. Después, utilizamos scripts para crear cuentas de usuario, crear un conjunto para cada cuenta, clonar las plantillas para crearles las máquinas virtuales necesarias y, finalmente, añadírselas a los conjuntos creados antes.

El problema es que, en ocasiones, surge alguna necesidad cuando ya está toda la estructura anterior creada. De repente, necesitamos añadirle una o varias máquinas virtuales nuevas, a uno de nuestros alumnos, a partir de las plantillas existentes (o de otras nuevas que creemos a propósito).

Pues bien, esa es la situación que resuelve el script que te propongo hoy. Y para lograrlo, comenzaremos usando la orden pvesh create con la siguiente sintaxis:

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

En ella, somebooks01 es el nombre del servidor Proxmox VE, 5001 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).

Sin embargo, como la idea es aplicar el script para cualquiera de los usuarios e, incluso, que nos sirva en diferentes instalaciones de Proxmox VE, todos estos datos deberían estar representados por variables.

De hecho, si te fijas, podemos repetir la idea de los dos primeros artículos referenciados en la lista anterior, pero sin crear la cuenta de usuario ni los conjuntos.

Es decir, podríamos crear un archivo, en formato de texto plano, con la lista de las máquinas que queremos crear. En definitiva, un archivo con la estructura que ya utilizamos en scripts anteriores donde, cada línea representará una de las máquinas que necesitamos crear y tendrá el id de la plantilla que usaremos y el nombre de la máquina que crearemos con ella.

En definitiva, algo como esto:

5000,UD2204
5001,W11

Para nuestro ejemplo, el archivo se llamará new-vm.txt, y lo crearemos con el editor de textos nano. Por lo tanto, iniciaremos el editor con la siguiente sintaxis, suponiendo que el directorio de trabajo es /scripts:

nano ./datos/new-vm.txt

Una vez creado el archivo, salimos del editor guardando los cambios.

Scripts-para-Proxmox-anadir-nuevas-máquinas-virtuales-a-un-usuario-001

En artículos anteriores establecimos que todos los scripts se guardarían en una carpeta, dentro del directorio raíz, llamada scripts. Además, los archivos de datos para los scripts se almacenarían en una subcarpeta llamada datos.

A continuación, solo tendríamos que crear un nuevo script que lea, una a una, las líneas del archivo y ejecute la orden que veíamos arriba, para cada una de ellas.

Estructura del script

Como hemos dicho más arriba, el script debe tener la capacidad realizar su trabajo en diferentes nodos, para distintos usuarios y con diferentes listas de máquinas. Eso significa que necesitará que, esos datos, se reciban en modo de argumentos, cuando lo invoquemos desde la línea de comandos.

Por lo tanto, la primera tarea del script será asegurarse de que ha recibido los datos que necesita. Esto podremos resolverlo con un código como el siguiente:

if [ $# -ne 3 ]; then
  echo "Sintáxis: $0 nodo nombreDeUsuario listaDeMáquinas.txt"
  echo "\t'listaDeMáquinas.txt' es un archivo de texto"
  echo "\tCada línea tendrá IDPlantilla,NombreMáquina"
  exit
fi

En definitiva, el código anterior verifica que se han recibido tres argumentos. Si no fuese así, mostraría un mensaje informativo y terminaría la ejecución.

Una vez que hemos pasado el filtro anterior, necesitamos escribir un bucle que recorra el archivo de texto, línea a línea.  Tendrá un aspecto como este:

while IFS=, read -r plantilla maquina
do
  ...
done < "datos/$3"

Aquí utilizamos IFS para identificar 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.

La entrada del bucle estará identificada al final, donde redirigimos el contenido del archivo, identificado pro el argumento $3, que suponemos que se encuentra dentro del subdirectorio llamado datos.

Después de esto, solo nos queda definir el interior del bucle, que estará formado por la orden que vimos al principio, pero sustituyendo los datos específicos por los argumentos que ha recibido el script. Además, la dividiremos en varias líneas para ser más didácticos:

  pvesh create /nodes/$1/qemu/$plantilla/clone \
      --pool="$2" \
      --newid $(pvesh get /cluster/nextid) \
      --name "$2-$maquina" \
      --full

Por cierto, observa que el nombre de la máquina le hemos antepuesto el nombre del usuario. De este modo, podremos utilizar el mismo script para crear la misma estructura de máquinas en cuentas de usuario diferentes.

Versión final del script

Ya solo tenemos que unir las piezas para obtener la versión final del script, que para este ejemplo se llamará add-vm.sh. Para lograrlo, volveremos a recurrir al editor nano, con la siguiente sintaxis:

nano ./datos/new-vm.txt

Una vez en el área de trabajo del editor, escribimos, o copiamos, el siguiente contenido:

#!/bin/bash

#Sinataxis
if [ $# -ne 3 ]; then
  echo "Sintáxis: $0 nodo nombreDeUsuario listaDeMáquinas.txt"
  echo "\t'listaDeMáquinas.txt' es un archivo de texto"
  echo "\tCada línea tendrá IDPlantilla,NombreMáquina"
  exit
fi

#Clonar máquinas y asociarlas al nuevo conjunto
#El archivo con el nombre de las máquinas es el tercer argumento del script
while IFS=, read -r plantilla maquina
do
  echo "Creando $2-$maquina desde $plantilla"
  pvesh create /nodes/$1/qemu/$plantilla/clone \
      --pool="$2" \
      --newid $(pvesh get /cluster/nextid) \
      --name "$2-$maquina" \
      --full
done < "datos/$3"

Después, salimos del editor guardando los cambios.

Scripts-para-Proxmox-anadir-nuevas-máquinas-virtuales-a-un-usuario-002

Y, a continuación, nos aseguramos de que el script tenga permisos de ejecución. Algo que podemos conseguir con la siguiente orden:

chmod +x ./add-vm.sh

Ejecutamos la orden anterior.

Scripts-para-Proxmox-anadir-nuevas-máquinas-virtuales-a-un-usuario-003

Ahora, para ejecutarlo, bastaría con escribir el nombre del script seguido de los argumentos necesarios. Algo como esto:

./add-vm.sh somebooks01 conjunto01 new-vm.txt

Como es lógico, tendrás que cambiar los datos concretos por los de tu instalación.

Scripts-para-Proxmox-anadir-nuevas-máquinas-virtuales-a-un-usuario-004

Y al pulsar la tecla Intro, comienza el proceso de creación.

Solo habrá que esperar el tiempo necesario.

Scripts-para-Proxmox-anadir-nuevas-máquinas-virtuales-a-un-usuario-005

Y con esto completamos el objetivo del artículo. Espero que te haya parecido interesante.