Uma auditoria de fabricante pode custar caro, mas o que quebra a gestão de licenças no GLPI raramente é o preço da licença - é a instalação que o sistema conta no software errado. Na sustentação de parques GLPI de clientes, o relatório de conformidade quase sempre existe; o que falta é confiar nele. Este guia mostra como modelar licenças, porque o número de excedente vem torto e como afinar a reconciliação e os alertas para que a auditoria não seja surpresa.
O modelo de dados que sustenta tudo
Antes de qualquer relatório, perceba como o GLPI liga as peças. São quatro tabelas nativas que importam:
- glpi_softwares - o software em si (um registo por nome).
- glpi_softwareversions - as versões de cada software.
- glpi_softwarelicenses - as licenças adquiridas, com quantidade (campo number), tipo, validade (expire) e fornecedor.
- glpi_items_softwareversions - cada instalação detetada, ligando um item (computador, VM) a uma versão.
A conformidade nasce do cruzamento entre a soma de number em glpi_softwarelicenses e a contagem de linhas em glpi_items_softwareversions, agrupados pelo software. Se qualquer um dos dois lados aponta para o glpi_softwares errado, a conta fecha bonita e falsa.
Registe a licença com o campo certo
No menu Gestão > Licenças (ou pelo separador Licenças dentro do software), registe cada compra. O passo a passo que padronizámos:
- Ligue ao software correto - a licença pertence a um glpi_softwares específico. Comprou Office, mas o inventário criou "Microsoft Office" e "Microsoft 365 Apps" como dois softwares? A licença fica órfã de metade das instalações.
- Quantidade em number - o total de lugares contratados. Aqui mora a primeira armadilha: number = -1 significa licença ilimitada (freeware, licença de sítio sem limite). Deixar em branco ou 0 anula a base de comparação.
- Tipo de licença - OEM, Volume, Subscrição, etc. (lista pendente glpi_softwarelicensetypes). Não é enfeite: define a regra de conformidade real.
- Validade (expire) - preencha para subscrição e Software Assurance; deixe vazio para perpétua.
- Afete a licença às instalações - registar não basta. É preciso alocar a licença aos itens que a consomem (separador de itens da licença) para o GLPI contar consumo. Muitos parques têm licença registada e nenhuma afetação: o relatório mostra tudo disponível para algo já excedido.
O erro de campo que anula o excedente: nome fragmentado
Na sustentação, o motivo número 1 de "a conformidade mostra zero excedente, mas sei que estou excedido" não é bug do relatório - é fragmentação de nome. O inventário do GLPI cria um glpi_softwares por nome exato reportado pelo agente. Assim "Google Chrome", "Google Chrome (64-bit)" e "Google Chrome" com um espaço a mais tornam-se três softwares distintos, cada um com a sua própria contagem de instalações. Liga a licença a um deles e os outros dois ficam "sem licença registada" - ou, pior, "conformes", porque cada um tem poucas instalações. A conta global nunca fecha.
A correção não é no relatório, é na entrada: o Dicionário de Software (Administração > Regras > Dicionário de software) normaliza o nome antes de o gravar em glpi_softwares. Uma regra que reescreve "Google Chrome (64-bit)" para "Google Chrome" funde as instalações num único software, e aí a licença passa a cobrir tudo. O detalhe que só quem opera sabe: o dicionário reescreve apenas na próxima entrada de inventário, por isso, depois de criar as regras, é preciso reprocessar o inventário (ou aguardar o próximo ciclo do agente) para as instalações antigas migrarem. Aplicar a regra e verificar o relatório no mesmo minuto engana: ainda não mudou nada.
A consulta que mostra o excedente real
Enquanto o dicionário não está afinado, o ecrã de conformidade mistura ruído. Corremos diretamente na base de dados a consulta que lista, por software, instalações contra licenças - já excluindo as ilimitadas (number = -1) do somatório:
-- Software com mais instalacoes do que licencas (excedente de conformidade).
-- number = -1 significa licenca ilimitada: excluimos do somatorio.
SELECT s.name AS software,
COALESCE(lic.licencas, 0) AS licencas,
COALESCE(inst.instalacoes, 0) AS instalacoes,
COALESCE(inst.instalacoes, 0) - COALESCE(lic.licencas, 0) AS excedente
FROM glpi_softwares s
LEFT JOIN (
SELECT softwares_id, SUM(number) AS licencas
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 instalacoes
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.instalacoes, 0) > COALESCE(lic.licencas, 0)
ORDER BY excedente DESC;
O resultado é a lista de compra: cada linha com excedente positivo é risco de coima em auditoria. Cruze com o dicionário antes de sair a comprar - metade do "excedente" costuma ser o mesmo software contado com dois nomes.
Alertas de vencimento que disparam mesmo
Licença de subscrição vencida é dinheiro parado ou serviço cortado. O GLPI alerta, mas o alerta tem três interruptores que precisam de estar todos ligados - e o erro comum é achar que preencher o campo expire basta:
- Na entidade (Administração > Entidades, separador de notificações): ligar os alarmes sobre licenças e definir o prazo de antecedência (campos internos use_licenses_alert e send_licenses_alert_before_delay).
- Na notificação (Configurar > Notificações): a notificação de licença de software precisa de estar ativa, com destinatário e modelo definidos.
- No cron: a ação automática que varre os vencimentos só corre se o cron do GLPI correr. Em produção isso significa um cron do sistema operativo, não o modo interno que depende do tráfego do utilizador.
A configuração de cron externo que deixamos em cada cliente:
# Crontab do utilizador do PHP (www-data/apache): dispara as acoes automaticas do GLPI,
# incluindo o alerta de licencas a vencer. Sem este cron externo, o alerta so corre
# "a boleia" do trafego dos utilizadores - e numa janela sem acesso, nunca dispara.
* * * * * www-data /usr/bin/php /var/www/glpi/front/cron.php &>/dev/null
Independentemente do alerta nativo, enviamos toda a segunda-feira um relatório de vencimentos diretamente da base de dados, para não depender só da notificação:
-- Licencas que vencem nos proximos 90 dias, das mais urgentes para as menos.
SELECT s.name AS software,
sl.name AS licenca,
sl.number,
sl.expire,
DATEDIFF(sl.expire, CURDATE()) AS dias_para_expirar
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 decisão por tipo de licença
O tipo de licença muda como a modela no GLPI e onde está o risco. A matriz que usamos no desenho:
| Tipo de licença | Como modelar no GLPI | Campo expire | Armadilha comum |
|---|---|---|---|
| OEM (presa ao hardware) | number = 1 por equipamento; tipo OEM | Vazio (perpétua) | Não migra de máquina - trocar o PC gera desconformidade silenciosa |
| Volume (VLK / MAK / KMS) | 1 registo, number = quantidade contratada | Conforme o contrato | Contar ativações reais, não o teto do contrato |
| Subscrição (SaaS, Microsoft 365) | number = lugares; reconciliar pelo relatório do fornecedor | Fim do ciclo | O inventário não vê SaaS puro - o registo é manual |
| Perpétua + Software Assurance | number = quantidade; expire = fim da SA | Fim da SA | Vencer a SA não corta o uso, mas trava o direito de atualização |
| Freeware / Trial | Freeware: number = -1; Trial: number + expire | Só no trial | Freeware que passa a pago numa nova versão passa despercebido |
A reconciliação é rotina, não projeto
A conformidade de software não é uma fotografia, é um filme: o parque muda toda a semana. O ritmo que funciona na sustentação é trimestral para a reconciliação completa (correr a consulta de excedente, rever o dicionário, conferir as afetações) e mensal para os vencimentos. Dê prioridade aos fabricantes que auditam a sério - Microsoft, Adobe, Oracle e Autodesk cobram, e a conta de uma desconformidade que eles descubram é ordens de grandeza maior que o custo de manter a base limpa. O objetivo não é um relatório bonito; é conseguir responder "quantas licenças de X tenho e quantas uso?" com um número em que confia.
Quer o parque de software sob controlo, com a base de licenças reconciliada e os alertas a disparar mesmo? Conheça a sustentação de GLPI da NexTool.
Revisto pela equipa NexTool Solutions.