sudo, en esta versión es necesario que cuente con ellos y que se ejecute sin pedir contraseña.
Piztu está construido sobre Python y Ansible. El motor de automatización es Ansible, que ejecuta las acciones sobre los equipos del aula a través de SSH con autenticación por clave pública: un modelo sin agente en el que los clientes solo necesitan tener OpenSSH y sudo, mientras cada operación (encender, suspender, apagar, bloquear, enviar o recoger prácticas) se lanza en paralelo como un playbook, con soporte de Wake-on-LAN para el encendido remoto. Sobre ese motor, todo el lado servidor está escrito en Python: la interfaz web se apoya en Flask y Flask-SocketIO (WebSockets en tiempo real para el vúmetro de ruido, el progreso de los envÃos y una terminal SSH integrada en el navegador), la aplicación de escritorio en PyQt6, y un monitor de ruido autónomo captura el micrófono con arecord para emitir avisos y bloqueos automáticos. La configuración se centraliza en un fichero YAML, los datos persistentes (posiciones de los equipos y umbral de ruido) se guardan en SQLite, la interfaz es multilingüe (gallego, castellano, inglés y portugués) y el instalador gráfico está hecho en Go con el framework Fyne.

Pasos para la instalación
Lo primero que hay que hacer es renombrar los equipos del aula con un nombre seguido del número de equipo, por ejemplo: tux01, tux02… Esto deberás hacerlo editando los ficheros /etc/hosts y /etc/hostname:


También debes instalar openssh-server en los clientes, para que desde el servidor se pueda acceder a ellos:
$ sudo apt update $ sudo apt install openssh-server
A continuación edita el fichero de configuración del servicio SSH, descomentando o cambiando estas lÃneas:
$ sudo nano /etc/ssh/sshd_config
Port 22 PermitRootLogin yes PubkeyAuthentication yes PasswordAuthentication yes
Y por último también debes asignarle permisos de sudo al usuario por defecto en los clientes:
$ su root # visudo
y añades:
usuario ALL=(ALL) NOPASSWD:ALL
En el caso del servidor, deberemos contar con Python 3 instalado.
Utilidades de la aplicación Piztu
a. Gestión de energÃa
- Encender aula — enciende los equipos por red mediante Wake-on-LAN (paquetes mágicos), sin necesidad de tocarlos fÃsicamente.
- Suspender aula — suspende los equipos para ahorrar energÃa manteniéndolos listos para retomar.
- Apagar aula — apaga de forma ordenada todos los equipos (con confirmación previa para evitar errores).
Se pueden aplicar a toda el aula a la vez o a un equipo concreto desde su tarjeta en el mapa.
b. Bloqueo y control de la clase
- Bloqueo — bloquea las pantallas de todos los equipos (o de los seleccionados) para captar la atención del alumnado en un momento dado.
- Liberar — desbloquea los equipos. Incluye verificación automática con reintentos para asegurarse de que ninguno quedó bloqueado.
c. Terminal SSH
- SSH — abre una terminal remota contra cualquier equipo directamente desde la interfaz (integrada en el navegador con xterm.js, o en la GUI de escritorio), para administración o diagnóstico sin levantarse.
d. Control de ruido
- Monitor de ruido — vigila el micrófono del aula y calcula la media móvil de los últimos 30 s. Si supera el umbral fijado por el profesor, avisa en las pantallas de los alumnos; si el ruido persiste otros 30 s, bloquea automáticamente los equipos. El umbral se regula con un control deslizante.
e. EnvÃo y recogida de prácticas
- Enviar práctica — distribuye ficheros a los equipos (arrastrando y soltando), a todos o a una selección manual.
- Modo anticopias — envÃa ficheros distintos a los equipos pares e impares (clasificados por el número de su nombre), útil para evitar copias en exámenes.
- Recoger trabajos — descarga por SFTP la carpeta de prácticas de cada equipo al servidor.
- Explorador de ficheros — consulta los trabajos recogidos de cada equipo y descárgalos individualmente o en ZIP.
- Limpiar carpeta — borra el contenido de la carpeta de prácticas en los equipos seleccionados.
f. Mapa interactivo del aula
- Representa cada equipo como una tarjeta con un indicador de estado (en lÃnea/desconectado) y un badge con los ficheros recogidos. Las tarjetas se arrastran para reproducir la disposición fÃsica real del aula (se guarda automáticamente).
g. Otras
- Interfaz multilingüe (gallego, castellano, inglés, portugués).
- Sobre Piztu — información de autorÃa, versión, contacto y licencia.
Configurar equipos e instalar programas con Ansible
Toda acción de Piztu sobre los equipos es, por debajo, un playbook de Ansible. Eso significa que puedes configurar los equipos del aula e instalar programas en todos a la vez con solo escribir (o reutilizar) un playbook. No hace falta tocar cada equipo: Ansible se conecta por SSH y hace el trabajo en paralelo.
Las tres piezas
1. El fichero hosts (inventario)
Define qué equipos forman el aula. Cada lÃnea es un equipo, agrupado bajo [aula]:
[aula] tux01.local mac=c4:34:6b:7a:a1:a8 tux02.local mac=00:23:24:9c:fa:cd ... [aula:vars] ansible_become=yes # eleva privilegios con sudo ansible_become_method=sudo ansible_python_interpreter=/usr/bin/python3
[aula]es el grupo al que apuntan los playbooks (hosts: aula).- El
mac=lo usa el Wake-on-LAN para encender. [aula:vars]aplica variables comunes a todos (aquÃ, sudo automático).
2. La carpeta playbooks/
Cada .yaml es una acción. Ya vienen varios: acenderAula, bloqueoTotal, visualstudiocode, instalar_lamp… Para añadir una nueva capacidad, basta con crear un playbook aquÃ.
3. El mapeo en config.yaml
Los nombres lógicos que usa la interfaz se resuelven a ficheros reales en:
ansible: grupo_aula: "aula" playbooks: acender: "acenderAula" bloqueo: "bloqueoTotal" # añade aquà el tuyo: nombre_lógico: "nombre_del_fichero_sin_extensión"
Cómo ejecutar un playbook
Manualmente (toda el aula):
$ ansible-playbook -i hosts playbooks/visualstudiocode.yaml
Solo en algunos equipos (con --limit):
$ ansible-playbook -i hosts playbooks/visualstudiocode.yaml --limit tux01.local,tux02.local
Ejemplos
Ejemplo 1 — Instalar un programa simple (GIMP) en toda el aula
--- - name: Instalar GIMP en toda el aula hosts: aula become: yes tasks: - name: Instalar el paquete gimp apt: name: gimp state: present update_cache: yes
Ejemplo 2 — Instalar varios paquetes a la vez
--- - name: Herramientas de programación hosts: aula become: yes tasks: - name: Instalar paquetes apt: name: - python3-pip - git - build-essential state: present update_cache: yes
Ejemplo 3 — Instalar desde un repositorio externo (VS Code, ya incluido)
--- - name: Instalar Visual Studio Code hosts: aula become: yes tasks: - name: Importar la clave GPG de Microsoft apt_key: url: https://packages.microsoft.com/keys/microsoft.asc state: present - name: Añadir el repositorio apt_repository: repo: "deb [arch=amd64] https://packages.microsoft.com/repos/code stable main" state: present - name: Instalar code apt: { name: code, state: present, update_cache: yes }
Ejemplo 4 — Configurar los equipos (copiar un fichero de configuración)
--- - name: Distribuir un fondo de pantalla común hosts: aula become: yes tasks: - name: Copiar la imagen al equipo copy: src: /opt/piztu/recursos/fondo.png dest: /usr/share/backgrounds/aula.png mode: "0644"
Ejemplo 5 — Cambiar una opción del sistema (activar NumLock, ya incluido)
--- - name: Activar NumLock en el arranque hosts: aula become: yes tasks: - name: Instalar numlockx apt: { name: numlockx, state: present } - name: Activar NumLock command: numlockx on
Ejemplo 6 — Desinstalar un programa
--- - name: Quitar juegos hosts: aula become: yes tasks: - name: Eliminar gnome-mines apt: name: gnome-mines state: absent
Integrar un playbook nuevo en la interfaz de Piztu
- Guarda tu
.yamlenplaybooks/(ej.:playbooks/instalar_gimp.yaml). - Dale un nombre lógico en
config.yaml:ansible: playbooks: instalar_gimp: "instalar_gimp"
- Llámalo desde la interfaz con el evento
executar_comando(accióninstalar_gimp), y Piztu lo lanza contra todo el grupoaulaautomáticamente.
También lo puedes ejecutar siempre a mano con
ansible-playbook -i hosts playbooks/..., sin pasar por la interfaz.
