Gestion des licences logicielles dans GLPI

Guide technique de la gestion des licences logicielles dans GLPI : le modèle de données (glpi_softwarelicenses), la fragmentation de nom qui annule le dépassement de conformité, la correction par le Dictionnaire de logiciels, la requête de dépassement réel, les trois interrupteurs de l'alerte d'échéance et une matrice de décision par type de licence - avec l'expérience de terrain d'une équipe qui réconcilie des parcs.

Dans cet article7 sections

Un audit d'éditeur peut coûter cher, mais ce qui casse la gestion des licences dans GLPI est rarement le prix de la licence : c'est l'installation que le système compte sur le mauvais logiciel. Sur les parcs GLPI que nous maintenons pour des clients, le rapport de conformité existe presque toujours ; ce qui manque, c'est d'y faire confiance. Ce guide montre comment modéliser les licences, pourquoi le chiffre de dépassement sort faussé et comment affiner la réconciliation et les alertes pour qu'un audit ne soit jamais une surprise.

Le modèle de données qui soutient tout

Avant tout rapport, comprenez comment GLPI relie les pièces. Quatre tables natives comptent :

  • glpi_softwares - le logiciel lui-même (une ligne par nom).
  • glpi_softwareversions - les versions de chaque logiciel.
  • glpi_softwarelicenses - les licences achetées, avec quantité (champ number), type, échéance (expire) et fournisseur.
  • glpi_items_softwareversions - chaque installation détectée, reliant un élément (ordinateur, VM) à une version.

La conformité naît du croisement entre la somme de number dans glpi_softwarelicenses et le nombre de lignes dans glpi_items_softwareversions, groupés par logiciel. Si l'un des deux côtés pointe vers le mauvais glpi_softwares, le calcul se boucle propre et faux.

Enregistrez la licence avec le bon champ

Dans Gestion > Licences (ou l'onglet Licences dans le logiciel), enregistrez chaque achat. Les étapes que nous standardisons :

  1. Reliez-la au bon logiciel - une licence appartient à un glpi_softwares précis. Vous avez acheté Office, mais l'inventaire a créé "Microsoft Office" et "Microsoft 365 Apps" comme deux logiciels ? La licence est orpheline de la moitié des installations.
  2. Quantité dans number - le total de postes achetés. Voici le premier piège : number = -1 signifie licence illimitée (freeware, licence de site sans plafond). La laisser vide ou à 0 annule la base de comparaison.
  3. Type de licence - OEM, Volume, Abonnement, etc. (liste déroulante glpi_softwarelicensetypes). Ce n'est pas décoratif : cela définit la règle de conformité réelle.
  4. Échéance (expire) - remplissez-la pour l'abonnement et la Software Assurance ; laissez-la vide pour une licence perpétuelle.
  5. Affectez la licence aux installations - l'enregistrer ne suffit pas. Il faut allouer la licence aux éléments qui la consomment (onglet des éléments de la licence) pour que GLPI compte la consommation. Beaucoup de parcs ont une licence enregistrée et aucune affectation : le rapport montre tout disponible pour quelque chose déjà en dépassement.

L'erreur de champ qui annule le dépassement : nom fragmenté

En maintenance, la raison numéro 1 de "la conformité affiche zéro dépassement, mais je sais que je dépasse" n'est pas un bug du rapport : c'est la fragmentation du nom. L'inventaire GLPI crée un glpi_softwares par nom exact remonté par l'agent. Ainsi "Google Chrome", "Google Chrome (64-bit)" et "Google Chrome" avec un espace en trop deviennent trois logiciels distincts, chacun avec son propre décompte d'installations. Vous rattachez la licence à l'un d'eux et les deux autres restent "sans licence enregistrée" - ou, pire, "conformes", parce que chacun a peu d'installations. Le calcul global ne tombe jamais juste.

La correction n'est pas dans le rapport, elle est à l'entrée : le Dictionnaire de logiciels (Administration > Règles > Dictionnaire de logiciels) normalise le nom avant l'écriture dans glpi_softwares. Une règle qui réécrit "Google Chrome (64-bit)" en "Google Chrome" fusionne les installations en un seul logiciel, et la licence couvre alors tout. Le détail que seuls les opérateurs connaissent : le dictionnaire ne réécrit qu'à la prochaine entrée d'inventaire, donc après avoir créé les règles il faut retraiter l'inventaire (ou attendre le prochain cycle de l'agent) pour que les anciennes installations migrent. Appliquer la règle et vérifier le rapport dans la même minute est trompeur : rien n'a encore changé.

La requête qui montre le vrai dépassement

Tant que le dictionnaire n'est pas affiné, l'écran de conformité mélange du bruit. Nous exécutons directement en base la requête qui liste, par logiciel, les installations face aux licences - en excluant déjà les illimitées (number = -1) de la somme :

-- Logiciels avec plus d'installations que de licences (depassement de conformite).
-- number = -1 signifie licence illimitee : on l'exclut de la somme.
SELECT s.name AS logiciel,
       COALESCE(lic.licences, 0)      AS licences,
       COALESCE(inst.installations, 0) AS installations,
       COALESCE(inst.installations, 0) - COALESCE(lic.licences, 0) AS depassement
FROM glpi_softwares s
LEFT JOIN (
    SELECT softwares_id, SUM(number) AS licences
    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 installations
    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.installations, 0) > COALESCE(lic.licences, 0)
ORDER BY depassement DESC;

Le résultat est la liste d'achat : chaque ligne au dépassement positif est un risque d'amende en audit. Recoupez avec le dictionnaire avant d'acheter - la moitié du "dépassement" est souvent le même logiciel compté sous deux noms.

Des alertes d'échéance qui se déclenchent vraiment

Une licence d'abonnement expirée, c'est de l'argent gelé ou un service coupé. GLPI alerte, mais l'alerte a trois interrupteurs qui doivent tous être activés - et l'erreur courante est de croire que remplir le champ expire suffit :

  • Sur l'entité (Administration > Entités, onglet notifications) : activer les alarmes sur les licences et définir le délai d'anticipation (champs internes use_licenses_alert et send_licenses_alert_before_delay).
  • Sur la notification (Configuration > Notifications) : la notification de licence logicielle doit être active, avec un destinataire et un modèle définis.
  • Sur le cron : l'action automatique qui balaie les échéances ne s'exécute que si le cron de GLPI s'exécute. En production, cela veut dire un cron du système d'exploitation, pas le mode interne qui dépend du trafic utilisateur.

La configuration de cron externe que nous laissons chez chaque client :

# Crontab de l'utilisateur PHP (www-data/apache) : declenche les actions automatiques de GLPI,
# dont l'alerte de licences a echeance. Sans ce cron externe, l'alerte ne tourne
# qu'en "profitant" du trafic des utilisateurs - et dans une fenetre sans acces, elle ne part jamais.
* * * * * www-data /usr/bin/php /var/www/glpi/front/cron.php &>/dev/null

Indépendamment de l'alerte native, chaque lundi nous envoyons un rapport d'échéances directement depuis la base, pour ne pas dépendre de la seule notification :

-- Licences arrivant a echeance dans les 90 prochains jours, de la plus urgente a la moins.
SELECT s.name  AS logiciel,
       sl.name AS licence,
       sl.number,
       sl.expire,
       DATEDIFF(sl.expire, CURDATE()) AS jours_avant_expiration
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;

Matrice de décision par type de licence

Le type de licence change la manière de la modéliser dans GLPI et l'endroit où se trouve le risque. La matrice que nous utilisons à la conception :

Type de licenceComment la modéliser dans GLPIChamp expirePiège courant
OEM (liée au matériel)number = 1 par équipement ; type OEMVide (perpétuelle)Ne migre pas d'une machine à l'autre - changer le PC crée une non-conformité silencieuse
Volume (VLK / MAK / KMS)1 enregistrement, number = quantité contractéeSelon le contratCompter les activations réelles, pas le plafond du contrat
Abonnement (SaaS, Microsoft 365)number = postes ; réconcilier via le rapport de l'éditeurFin du cycleL'inventaire ne voit pas le SaaS pur - l'enregistrement est manuel
Perpétuelle + Software Assurancenumber = quantité ; expire = fin de la SAFin de la SALa SA expirée ne coupe pas l'usage, mais bloque le droit de mise à niveau
Freeware / EssaiFreeware : number = -1 ; Essai : number + expireEssai seulementLe freeware qui devient payant dans une nouvelle version passe inaperçu

La réconciliation est une routine, pas un projet

La conformité logicielle n'est pas une photo, c'est un film : le parc change chaque semaine. Le rythme qui marche en maintenance est trimestriel pour la réconciliation complète (exécuter la requête de dépassement, revoir le dictionnaire, vérifier les affectations) et mensuel pour les échéances. Priorisez les éditeurs qui auditent vraiment - Microsoft, Adobe, Oracle et Autodesk font appliquer, et la facture d'une non-conformité qu'ils découvrent est d'un ordre de grandeur supérieur au coût de garder la base propre. L'objectif n'est pas un beau rapport ; c'est pouvoir répondre "combien de licences de X ai-je et combien en utilise-je ?" avec un chiffre auquel vous faites confiance.

Vous voulez un parc logiciel maîtrisé, avec une base de licences réconciliée et des alertes qui partent vraiment ? Découvrez la maintenance GLPI de NexTool.


Révisé par l'équipe NexTool Solutions.

Questions fréquentes

Oui, si l'inventaire (GLPI Agent) est actif. Chaque installation détectée devient une ligne dans glpi_items_softwareversions, reliant l'élément à la version du logiciel. La conformité compare ce décompte à la somme des licences. Sans inventaire, il faudrait saisir les installations à la main - impraticable à l'échelle.

C'est presque toujours la fragmentation du nom de logiciel. L'inventaire crée un glpi_softwares par nom exact, donc des variantes comme 'Google Chrome' et 'Google Chrome (64-bit)' deviennent des logiciels différents et la licence n'en couvre qu'un. Normalisez les noms dans le Dictionnaire de logiciels et retraitez l'inventaire ; les installations fusionnent alors et le dépassement apparaît.

Il y a trois interrupteurs. Sur l'entité, activez les alarmes de licence et le délai d'anticipation ; dans les Notifications, la notification de licence doit être active avec un destinataire ; et le cron GLPI doit tourner via le système d'exploitation (front/cron.php dans le crontab). Le seul champ expire rempli ne déclenche rien.

Dans le champ quantité (number), utilisez -1. GLPI traite -1 comme illimité et ne génère jamais de dépassement, quel que soit le nombre d'installations. Attention en sommant les licences dans les rapports : incluez la condition number > 0 pour que les -1 ne faussent pas le calcul.

Oui, mais l'enregistrement est manuel. L'inventaire local ne détecte pas les postes de SaaS pur, donc vous enregistrez la licence avec le nombre de postes et la fin du cycle dans expire, et vous réconciliez la consommation via le rapport d'affectation de l'éditeur lui-même. Traitez la console de l'éditeur comme la source de vérité de l'usage réel.

Besoin d'aide ?