Scripts para Proxmox: eliminar usuario con su conjunto de máquinas virtuales

Publicado por P. Ruiz en

Últimamente hemos publicado algunos artículos que explicaban cómo automatizar la creación de cuentas de usuario, máquinas virtuales y conjuntos en Proxmox VE, con el objetivo de agilizar la creación de laboratorios de prácticas para alumnos individuales o grupos.

Si aún no has leído esos artículos, te recomiendo que comiences por ellos. Son los siguientes:

La cuestión que nos trae hasta el artículo de hoy es que, en ocasiones, también necesitaremos eliminar uno de esos laboratorios de prácticas. Es decir, eliminar la cuenta del propio usuario, eliminar sus máquinas virtuales y, finalmente, eliminar el conjunto.

Hoy completaremos nuestro objetivo sobre una cuenta de usuario individual, pero en un próximo artículo, abordaremos el problema de eliminar todo un grupo de usuarios, con sus correspondientes laboratorios de prácticas.

Una vez fijado nuestro objetivo, comencemos…

Por cierto, si has llegado hasta este artículo, pero aún no tienes instalado y configurado Proxmox VE puedes encontrar ayuda en los artículos que ya tenemos publicados en SomeBooks.es sobre este tema.

Analizar las herramientas necesarias

Para resolver nuestro problema, comenzaremos eliminando la cuenta de usuario. Esto lo conseguiremos con el comando pveum usando la siguiente sintaxis:

pveum userdel "usuario@pve"

El comando pveum es el encargado de administrar cuentas de usuario. De hecho, su nombre proviene de Proxmox VE User Manager. Usado en combinación con userdel, nos permite eliminar la cuenta.

Escribimos la orden y pulsamos la tecla Intro.

Scripts-para-Proxmox-eliminar-usuario-con-su-conjunto-de-máquinas-virtuales-001

Después de esto, le toca el turno a las máquinas virtuales, pero antes de nada, deberemos saber cuáles de ellas pertenecen al conjunto que estamos eliminando… No queremos eliminar más máquinas de las que debemos…

La forma de averiguar las máquinas que forman parte de un conjunto es con el comando pvesh aplicando la siguiente sintaxis:

pvesh get /pools/usuario --output-format yaml

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

Scripts-para-Proxmox-eliminar-usuario-con-su-conjunto-de-máquinas-virtuales-002

Al combinar el comando con el argumento get, obtenemos una lista de elementos. En este caso, todos los que se encuentren dentro del conjunto /pools/usuario (recuerda que, en los artículos anteriores, hacíamos coincidir el nombre del conjunto con el de la cuenta de usuario).

También hemos indicado que la salida debe producirse en yaml que, al fin y al cabo, es un formato de texto plano.

Resultado de la ejecución del comando.

Scripts-para-Proxmox-eliminar-usuario-con-su-conjunto-de-máquinas-virtuales-003

Como ves, el resultado es correcto, pero la salida produce demasiada información. En realidad, a nosotros nos bastará con el identificador de cada máquina, por lo que filtraremos la salida para quedarnos únicamente con las líneas que contengan el texto vmid:

pvesh get /pools/usuario --output-format yaml | grep vmid

Ejecutamos la orden con la nueva sintaxis.

Scripts-para-Proxmox-eliminar-usuario-con-su-conjunto-de-máquinas-virtuales-004

Ya estamos cerca de nuestro objetivo, pero la salida aún contiene demasiada información. Necesitamos que solo contenga el número del identificador. Por lo tanto, usaremos los dos puntos (:) como separador para cortar la línea y quedarnos únicamente con la segunda parte:

pvesh get /pools/usuario --output-format yaml | grep vmid | cut -d ':' -f2

Una vez más, completamos la orden y pulsamos la tecla Intro.

Scripts-para-Proxmox-eliminar-usuario-con-su-conjunto-de-máquinas-virtuales-005

Si te fijas en la salida de la imagen anterior, ya casi lo tenemos. Ahora solo nos falta un último detalle: si obtenemos la salida en la pantalla, después no podremos usarla. Por esto, lo mejor es dirigirla a un archivo de texto:

pvesh get /pools/usuario --output-format yaml | grep vmid | cut -d ':' -f2 > borrar.txt

Una vez más, escribimos la nueva versión de la orden y pulsamos la tecla Intro.

Scripts-para-Proxmox-eliminar-usuario-con-su-conjunto-de-máquinas-virtuales-006

Una vez creado el archivo, bastará con llamar al comando qm con el argumento destroy y el identificador de la máquina a borrar. Como los identificadores se encuentran en el archivo borrar.txt, podemos obtenerlos con el comando cat, redirigiendo su salida a un bucle while que la recorra línea a línea. En definitiva, algo como esto:

cat borrar.txt | while read in; do qm destroy "$in"; done

Comprobamos la salida para asegurarnos de que la orden está funcionando correctamente.

Scripts-para-Proxmox-eliminar-usuario-con-su-conjunto-de-máquinas-virtuales-007

Observa que las dos últimas órdenes podríamos haberlas fundido en una. Es decir, en lugar de enviar la salida de la orden anterior al archivo borrar.txt, podríamos haberla enviado directamente al bucle de la orden anterior. Esto nos habría ahorrado el archivo borrar.txt. Sin embargo, me ha parecido que eso complicaba en exceso la legibilidad del código.

Por lo tanto, una vez que el archivo borrar.txt ha cumplido su misión, ya podremos prescindir de él:

rm borrar.txt

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

Scripts-para-Proxmox-eliminar-usuario-con-su-conjunto-de-máquinas-virtuales-008

Ya solo nos queda eliminar el propio conjunto usando el comando pvesh, de un modo parecido a como lo hemos usado más arriba, pero enviando el argumento delete:

pvesh delete /pools/usuario

Volvemos a escribir la orden y pulsamos la tecla Intro.

Scripts-para-Proxmox-eliminar-usuario-con-su-conjunto-de-máquinas-virtuales-009

Además de comprobar que todo el proceso se ha producido sin errores, observamos que el conjunto ha desaparecido del panel izquierdo de la pantalla.

Crear un script para automatizar el trabajo

Una vez que hemos comprobado que el proceso funciona correctamente de forma interactiva, vamos a unir todas las piezas dentro de un script que nos permita automatizar el proceso.

Para comenzar, debemos establecer la información que debe recibir nuestro script como argumento. En principio, bastará con el nombre de la cuenta del usuario que vamos a eliminar.

Para evitar errores, lo primero que hará el script será asegurarse de que recibe esa información. Lo haremos con el siguiente código:

if [ $# -ne 1 ]; then
  echo "Sintáxis: $0 nombreDeAlumno"
  exit
fi

Como ves, cuando el script no recibe el argumento, se limita a mostrar un pequeño recordatorio y volver a la consola.

En el caso de que el argumento sí esté presente, el script solo tiene que recoger todos los pasos explicados en en punto anterior.  También he incluido comentarios para identificar cada parte, y varios comandos echo para que el script vaya informando de dónde se encuentra en cada momento. En definitiva, algo como esto:

#!/bin/bash

#Sinataxis
if [ $# -ne 1 ]; then
  echo "Sintáxis: $0 nombreDeAlumno"
  exit
fi


#Eliminar la cuenta de usuario
echo "$1@pve:"

pveum userdel "$1@pve"
echo -e "Usuario eliminado"

#Eliminar máquinas del conjunto
pvesh get /pools/"$1" --output-format yaml | grep vmid | cut -d ':' -f2 > borrar.txt
echo "Máquinas encontradas:"
cat borrar.txt cat borrar.txt | while read in; do qm destroy "$in"; done rm borrar.txt echo "Máquinas eliminadas" #Eliminar conjunto pvesh delete pools -poolid pvesh delete /pools/"$1" echo "Conjunto eliminado"

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

nano /scripts/quitarusuario.sh

Ejecutamos el editor.

Scripts-para-Proxmox-eliminar-usuario-con-su-conjunto-de-máquinas-virtuales-010

Y, cuando nos encontremos en su área de trabajo, escribimos (o copiamos) el contenido del listado anterior.

Una vez completada la tarea, volvemos a pulsar la combinación de teclas Ctrl + X para salir, y nos aseguramos de guardar los cambios.

Scripts-para-Proxmox-eliminar-usuario-con-su-conjunto-de-máquinas-virtuales-011

Por último, no debemos olvidar cambiar los permisos del archivo que acabamos de crear, para que sea posible ejecutarlo. Lo conseguimos con la siguiente orden:

chmod 0700 /scripts/quitarusuario.sh

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

Scripts-para-Proxmox-eliminar-usuario-con-su-conjunto-de-máquinas-virtuales-012

Comprobar el resultado final

Para comprobar que todo funciona como debe, comenzaremos ejecutando el script sin argumentos (observa que, en este caso, podemos ejecutarlo desde cualquier ubicación, siempre que pongamos su ruta absoluta):

./scripts/quitarusuario.sh

De este modo nos asegurarnos de que muestra la pequeña ayuda que incluimos al principio.

Como esperábamos, nos ofrece información sobre su funcionamiento, y no hace nada más.

Scripts-para-Proxmox-eliminar-usuario-con-su-conjunto-de-máquinas-virtuales-013

Después, pasamos a ejecutarlo con el argumento: Incluimos el nombre de usuario (conjunto) que queremos eliminar. En este caso, usuario2:

./scripts/quitarusuario.sh usuario2

Escribimos la orden y pulsamos la tecla Intro.

Scripts-para-Proxmox-eliminar-usuario-con-su-conjunto-de-máquinas-virtuales-014

Vemos que, inmediatamente, comienzan a realizarse los pasos que nosotros habíamos completado manualmente en el primer apartado.

Poco después, obtenemos el prompt del sistema

Scripts-para-Proxmox-eliminar-usuario-con-su-conjunto-de-máquinas-virtuales-015

Y comprobamos que el conjunto ha desaparecido del panel izquierdo de la pantalla.

Y con esto completamos la tarea que nos habíamos propuesto en este artículo. Espero que te haya resultado útil.