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

Publicado por P. Ruiz en

Hace unos días, en la primera parte de este artículo, te explicábamos cómo crear un conjunto de máquinas virtuales en Proxmox VE, que actuaran como laboratorio de prácticas para un usuario del sistema. Lo hacíamos desde la línea de comandos, porque teníamos el objetivo de automatizar todo el proceso. Incluso llegamos a crear una primera versión del script, que resolvía la parte más repetitiva.

Como puedes imaginar, la lectura de dicha primera parte es casi obligada antes de continuar con el contenido del presente artículo.

Hoy partiremos de los resultados obtenidos entonces, para automatizar por completo el proceso.

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.

Completar el script del artículo anterior con la toda la funcionalidad

Continuando la tarea del artículo anterior, el siguiente paso será completar el script con las tareas que realizábamos en los pasos 3 y 4 del primer apartado del artículo. Es decir: crear una cuenta de usuario para el alumno y crear un nuevo conjunto que aglutine al usuario y sus máquinas virtuales.

Como puedes imaginar, para que el script sea realmente versátil, necesitaremos enviarle algunos argumentos que le permitan ajustarse a nuestras necesidades de cada momento. En concreto, serán los siguientes:

  • El nombre del servidor Proxmox VE. En realidad, si tenemos un solo servidor, este dato podría ser estático, pero si tenemos un cluster con varios servidores, esto nos permitirá usar el mismo script en varios servidores.

  • El nombre de la cuenta de usuario que vayamos a crear.

  • El nombre del archivo de texto que contiene la relación de máquinas que necesitamos crear. Vamos a dar por sentado que todos los archivos que vayamos creando se almacenarán en la carpeta datos. Si no es este tu criterio, tendrás que ajustarlo en el script.

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

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

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

A continuación, crearemos la cuenta de usuario y le asignaremos una contraseña. La sintaxis que usaremos es la misma que antes, pero sustituyendo el nombre de la cuenta por la variable que representa el segundo argumento que recibe el script ($2). Usaremos un código como este:

pveum useradd "$2@pve"
pvesh set /access/password \
      --userid "$2@pve" \
      --password "password.123"

Recuerda cambiar el valor de la contraseña por el que más te convenga. De nuevo, he usado la barra invertida (\) para dividir la segunda orden en varias líneas y hacerla más legible.

Después de esto, estamos listos para crear el conjunto, que tendrá el mismo nombre que la cuenta de usuario. También le daremos permiso al usuario sobre el conjunto. Usaremos lo siguiente:

pvesh create pools -poolid "$2"
pvesh set /access/acl \
      -path /pool/"$2" \
      -roles PVEVMAdmin \
      -users "$2@pve"

Ya solo nos queda modificar el bucle del script original, para que utilice las variables, en lugar de los valores constantes que usábamos antes. Básicamente, quedará como sigue:

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"

En definitiva, el script completo nos quedaría como sigue, teniendo en cuenta que he añadido comentarios que identifican cada parte, y un echo que nos informa del nombre que le estamos dando a la cuenta del usuario:

#!/bin/bash

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

#Crear la cuenta de usuario
#El nombre de la cuenta es el segundo argumento del script
echo "$2@pve"
pveum useradd "$2@pve"
pvesh set /access/password \
      --userid "$2@pve" \
      --password "password.123"

#Crear conjunto
#El nombre del conjunto será el del usuario
pvesh create pools -poolid "$2"

#Dar permiso al usuario sobre el conjunto
pvesh set /access/acl \
      -path /pool/"$2" \
      -roles PVEVMAdmin \
      -users "$2@pve"

#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"
                

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

nano /scripts/usuarionuevo.sh

Y, cuando nos encontremos en su área de trabajo, modificaremos el contenido del archivo usuarionuevo.sh para que nos quede como en el 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-crear-usuario-con-un-conjunto-de-máquinas-virtuales-017

Comprobar el resultado final

Para comprobar que todo funciona como debe, comenzaremos situándonos en la ruta donde guardamos el script (en mi caso, la carpeta /scripts). Después, ejecutamos el script sin argumentos:

./usuarionuevo.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-crear-usuario-con-un-conjunto-de-máquinas-virtuales-018

Después, pasamos a ejecutarlo con argumentos. Incluimos el nombre del servidor, una segunda cuenta de usuario y el nombre del archivo con las máquinas que deben crearse:

./usuarionuevo.sh somebooks01 usuario2 maquinas.txt

Escribimos la orden y pulsamos la tecla Intro.

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

Y vemos que, de forma inmediata, comienza a realizar la tarea prevista…

Solo tenemos que esperar el tiempo necesario

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

Cuando termine, volveremos a obtener el prompt de la consola…

Y comprobaremos que ya aparecen las nuevas máquinas y el nuevo conjunto en el panel izquierdo.

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

Y con esto damos por concluida la tarea. Aunque es un poco densa, espero que te haya parecido interesante.