Piztu. Gestión del aula de informática

Atención: Aunque en la siguiente versión piztu el usuario de cada equipo del aula no necesitará permisos de 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

  1. Guarda tu .yaml en playbooks/ (ej.: playbooks/instalar_gimp.yaml).
  2. Dale un nombre lógico en config.yaml:
    ansible:
      playbooks:
        instalar_gimp: "instalar_gimp"
  3. Llámalo desde la interfaz con el evento executar_comando (acción instalar_gimp), y Piztu lo lanza contra todo el grupo aula automáticamente.

También lo puedes ejecutar siempre a mano con ansible-playbook -i hosts playbooks/..., sin pasar por la interfaz.

Scroll al inicio