Una auditoría de fabricante puede costar muy caro, pero lo que rompe la gestión de licencias en GLPI rara vez es el precio de la licencia: es la instalación que el sistema cuenta contra el software equivocado. En los parques GLPI que mantenemos para clientes, el informe de conformidad casi siempre existe; lo que falta es confiar en él. Esta guía muestra cómo modelar licencias, por qué el número de excedente sale torcido y cómo afinar la reconciliación y las alertas para que la auditoría no sea una sorpresa.
El modelo de datos que sostiene todo
Antes de cualquier informe, entiende cómo GLPI enlaza las piezas. Cuatro tablas nativas importan:
- glpi_softwares - el software en sí (un registro por nombre).
- glpi_softwareversions - las versiones de cada software.
- glpi_softwarelicenses - las licencias adquiridas, con cantidad (campo number), tipo, validez (expire) y proveedor.
- glpi_items_softwareversions - cada instalación detectada, enlazando un elemento (equipo, VM) a una versión.
La conformidad nace del cruce entre la suma de number en glpi_softwarelicenses y el recuento de filas en glpi_items_softwareversions, agrupados por software. Si cualquiera de los dos lados apunta al glpi_softwares equivocado, la cuenta cierra bonita y falsa.
Registra la licencia con el campo correcto
En Gestión > Licencias (o en la pestaña Licencias dentro del software), registra cada compra. El paso a paso que estandarizamos:
- Enlázala al software correcto - la licencia pertenece a un glpi_softwares específico. ¿Compraste Office, pero el inventario creó "Microsoft Office" y "Microsoft 365 Apps" como dos softwares? La licencia queda huérfana de la mitad de las instalaciones.
- Cantidad en number - el total de puestos contratados. Aquí está la primera trampa: number = -1 significa licencia ilimitada (freeware, licencia de sitio sin tope). Dejarlo en blanco o en 0 anula la base de comparación.
- Tipo de licencia - OEM, Volumen, Suscripción, etc. (desplegable glpi_softwarelicensetypes). No es adorno: define la regla de conformidad real.
- Validez (expire) - complétala para suscripción y Software Assurance; déjala vacía para perpetua.
- Afecta la licencia a las instalaciones - registrarla no basta. Hay que asignar la licencia a los elementos que la consumen (pestaña de elementos de la licencia) para que GLPI cuente el consumo. Muchos parques tienen la licencia registrada y ninguna asignación: el informe muestra todo disponible para algo ya excedido.
El error de campo que anula el excedente: nombre fragmentado
En el mantenimiento, la razón número 1 de "la conformidad muestra cero excedente, pero sé que estoy excedido" no es un fallo del informe: es fragmentación de nombre. El inventario de GLPI crea un glpi_softwares por cada nombre exacto reportado por el agente. Así "Google Chrome", "Google Chrome (64-bit)" y "Google Chrome" con un espacio de más se convierten en tres softwares distintos, cada uno con su propio recuento de instalaciones. Enlazas la licencia a uno de ellos y los otros dos quedan "sin licencia registrada" - o, peor, "conformes", porque cada uno tiene pocas instalaciones. La cuenta global nunca cuadra.
La corrección no está en el informe, está en la entrada: el Diccionario de Software (Administración > Reglas > Diccionario de software) normaliza el nombre antes de grabarlo en glpi_softwares. Una regla que reescribe "Google Chrome (64-bit)" como "Google Chrome" funde las instalaciones en un único software, y entonces la licencia cubre todo. El detalle que solo sabe quien opera: el diccionario reescribe únicamente en la próxima entrada de inventario, así que tras crear las reglas hay que reprocesar el inventario (o esperar al siguiente ciclo del agente) para que las instalaciones antiguas migren. Aplicar la regla y revisar el informe en el mismo minuto engaña: aún no ha cambiado nada.
La consulta que muestra el excedente real
Mientras el diccionario no está afinado, la pantalla de conformidad mezcla ruido. Ejecutamos directo en la base de datos la consulta que lista, por software, instalaciones contra licencias - excluyendo ya las ilimitadas (number = -1) de la suma:
-- Software con mas instalaciones que licencias (excedente de conformidad).
-- number = -1 significa licencia ilimitada: la excluimos de la suma.
SELECT s.name AS software,
COALESCE(lic.licencias, 0) AS licencias,
COALESCE(inst.instalaciones, 0) AS instalaciones,
COALESCE(inst.instalaciones, 0) - COALESCE(lic.licencias, 0) AS excedente
FROM glpi_softwares s
LEFT JOIN (
SELECT softwares_id, SUM(number) AS licencias
FROM glpi_softwarelicenses
WHERE is_deleted = 0 AND number > 0
GROUP BY softwares_id
) lic ON lic.softwares_id = s.id
LEFT JOIN (
SELECT sv.softwares_id, COUNT(*) AS instalaciones
FROM glpi_items_softwareversions isv
JOIN glpi_softwareversions sv ON sv.id = isv.softwareversions_id
WHERE isv.is_deleted = 0
GROUP BY sv.softwares_id
) inst ON inst.softwares_id = s.id
WHERE s.is_deleted = 0
AND COALESCE(inst.instalaciones, 0) > COALESCE(lic.licencias, 0)
ORDER BY excedente DESC;
El resultado es la lista de compra: cada fila con excedente positivo es riesgo de multa en una auditoría. Cruza con el diccionario antes de salir a comprar - la mitad del "excedente" suele ser el mismo software contado con dos nombres.
Alertas de vencimiento que de verdad se disparan
Una licencia de suscripción vencida es dinero parado o servicio cortado. GLPI alerta, pero la alerta tiene tres interruptores que deben estar todos encendidos - y el error común es creer que rellenar el campo expire basta:
- En la entidad (Administración > Entidades, pestaña de notificaciones): activar las alarmas sobre licencias y definir el plazo de antelación (campos internos use_licenses_alert y send_licenses_alert_before_delay).
- En la notificación (Configurar > Notificaciones): la notificación de licencia de software debe estar activa, con destinatario y plantilla definidos.
- En el cron: la acción automática que barre los vencimientos solo se ejecuta si el cron de GLPI se ejecuta. En producción eso significa un cron del sistema operativo, no el modo interno que depende del tráfico del usuario.
La configuración de cron externo que dejamos en cada cliente:
# Crontab del usuario de PHP (www-data/apache): dispara las acciones automaticas de GLPI,
# incluida la alerta de licencias por vencer. Sin este cron externo, la alerta solo corre
# "a cuestas" del trafico de los usuarios - y en una ventana sin acceso, nunca se dispara.
* * * * * www-data /usr/bin/php /var/www/glpi/front/cron.php &>/dev/null
Al margen de la alerta nativa, cada lunes enviamos un informe de vencimientos directo de la base de datos, para no depender solo de la notificación:
-- Licencias que vencen en los proximos 90 dias, de la mas urgente a la menos.
SELECT s.name AS software,
sl.name AS licencia,
sl.number,
sl.expire,
DATEDIFF(sl.expire, CURDATE()) AS dias_para_vencer
FROM glpi_softwarelicenses sl
JOIN glpi_softwares s ON s.id = sl.softwares_id
WHERE sl.is_deleted = 0
AND sl.expire IS NOT NULL
AND sl.expire <= DATE_ADD(CURDATE(), INTERVAL 90 DAY)
ORDER BY sl.expire ASC;
Matriz de decisión por tipo de licencia
El tipo de licencia cambia cómo la modelas en GLPI y dónde está el riesgo. La matriz que usamos en el diseño:
| Tipo de licencia | Cómo modelarla en GLPI | Campo expire | Trampa común |
|---|---|---|---|
| OEM (atada al hardware) | number = 1 por equipo; tipo OEM | Vacío (perpetua) | No migra de máquina - cambiar el PC genera desconformidad silenciosa |
| Volumen (VLK / MAK / KMS) | 1 registro, number = cantidad contratada | Según el contrato | Contar activaciones reales, no el tope del contrato |
| Suscripción (SaaS, Microsoft 365) | number = puestos; reconciliar por el informe del proveedor | Fin del ciclo | El inventario no ve SaaS puro - el registro es manual |
| Perpetua + Software Assurance | number = cantidad; expire = fin del SA | Fin del SA | Que venza el SA no corta el uso, pero bloquea el derecho de actualización |
| Freeware / Trial | Freeware: number = -1; Trial: number + expire | Solo en el trial | El freeware que pasa a ser de pago en una nueva versión pasa desapercibido |
La reconciliación es rutina, no proyecto
La conformidad de software no es una foto, es una película: el parque cambia cada semana. El ritmo que funciona en el mantenimiento es trimestral para la reconciliación completa (ejecutar la consulta de excedente, revisar el diccionario, comprobar las asignaciones) y mensual para los vencimientos. Prioriza a los fabricantes que auditan de verdad - Microsoft, Adobe, Oracle y Autodesk exigen, y la factura de una desconformidad que ellos descubran es órdenes de magnitud mayor que el coste de mantener la base limpia. El objetivo no es un informe bonito; es poder responder "¿cuántas licencias de X tengo y cuántas uso?" con un número en el que confías.
¿Quieres el parque de software bajo control, con la base de licencias reconciliada y las alertas disparándose de verdad? Conoce el mantenimiento de GLPI de NexTool.
Revisado por el equipo de NexTool Solutions.