Scripts para Proxmox: añadir nuevas máquinas virtuales a un usuario
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.
Relacionado con esta tarea, ya publicamos hace un tiempo los siguientes artículos:
-
Scripts para Proxmox: crear usuario con un conjunto de máquinas virtuales (parte 1)
-
Scripts para Proxmox: crear usuario con un conjunto de máquinas virtuales (parte 2)
-
Scripts para Proxmox: crear conjuntos de máquinas virtuales para un grupo de usuarios
-
Scripts para Proxmox: eliminar usuario con su conjunto de máquinas virtuales
-
Scripts para Proxmox: eliminar conjuntos de máquinas virtuales para un grupo de usuarios
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
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"
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
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
Y al pulsar la tecla Intro, comienza el proceso de creación.
Y con esto completamos el objetivo del artículo. Espero que te haya parecido interesante.