Аудит со стороны вендора может обойтись дорого, но управление лицензиями в GLPI ломает редко цена лицензии — ломает установка, которую система засчитывает не тому ПО. При сопровождении парков GLPI наших клиентов отчёт о соответствии почти всегда существует; не хватает доверия к нему. Это руководство показывает, как моделировать лицензии, почему число превышения получается кривым и как настроить сверку и оповещения, чтобы аудит не стал сюрпризом.
Модель данных, на которой всё держится
Прежде чем строить отчёты, разберитесь, как GLPI связывает части между собой. Важны четыре встроенные таблицы:
- glpi_softwares — само ПО (одна запись на название).
- glpi_softwareversions — версии каждого ПО.
- glpi_softwarelicenses — приобретённые лицензии с количеством (поле number), типом, сроком действия (expire) и поставщиком.
- glpi_items_softwareversions — каждая обнаруженная установка, связывающая объект (компьютер, ВМ) с версией.
Соответствие рождается из сопоставления суммы number в glpi_softwarelicenses и количества строк в glpi_items_softwareversions, сгруппированных по ПО. Если любая из сторон указывает не на ту запись glpi_softwares, расчёт сходится красиво — и ложно.
Регистрируйте лицензию с правильными полями
В меню Управление > Лицензии (или на вкладке «Лицензии» внутри ПО) заведите каждую покупку. Порядок действий, который мы стандартизировали:
- Привяжите к правильному ПО — лицензия принадлежит конкретной записи glpi_softwares. Купили Office, а инвентаризация создала «Microsoft Office» и «Microsoft 365 Apps» как два разных ПО? Лицензия останется без половины установок.
- Количество в number — общее число законтрактованных мест. Здесь первая ловушка: number = -1 означает неограниченную лицензию (freeware, лицензия на площадку без лимита). Пустое значение или 0 обнуляет базу сравнения.
- Тип лицензии — OEM, Volume, Subscription и т. д. (выпадающий список glpi_softwarelicensetypes). Это не украшение: тип определяет реальное правило соответствия.
- Срок действия (expire) — заполняйте для subscription и Software Assurance; для бессрочных оставляйте пустым.
- Назначьте лицензию установкам — одной регистрации мало. Нужно распределить лицензию по объектам, которые её потребляют (вкладка объектов лицензии), чтобы GLPI учитывал потребление. Во многих базах лицензии заведены, но не назначены ни одной установке: отчёт показывает всё доступным там, где лимит уже превышен.
Ошибка на практике, обнуляющая превышение: раздробленное название
При сопровождении причина номер 1 ситуации «отчёт о соответствии показывает нулевое превышение, но я знаю, что лимит превышен» — не баг отчёта, а раздробленность названий. Инвентаризация GLPI создаёт запись glpi_softwares по точному названию, которое сообщил агент. Поэтому «Google Chrome», «Google Chrome (64-bit)» и «Google Chrome» с лишним пробелом превращаются в три разных ПО, у каждого свой подсчёт установок. Вы привязываете лицензию к одному из них, а два других остаются «без зарегистрированной лицензии» или, что хуже, «в соответствии», потому что установок у каждого мало. Общий расчёт никогда не сходится.
Исправлять нужно не отчёт, а вход: словарь ПО (Администрирование > Правила > Словарь программного обеспечения) нормализует название до записи в glpi_softwares. Правило, переписывающее «Google Chrome (64-bit)» в «Google Chrome», объединяет установки в одно ПО, и тогда лицензия покрывает всё. Деталь, которую знает только тот, кто это эксплуатирует: словарь переписывает название только при следующем поступлении данных инвентаризации, поэтому после создания правил нужно повторно обработать инвентаризацию (или дождаться следующего цикла агента), чтобы старые установки переехали. Применить правило и проверить отчёт в ту же минуту — обманчиво: пока ничего не изменилось.
Запрос, показывающий реальное превышение
Пока словарь не настроен, экран соответствия смешивает шум. Мы выполняем прямо в базе запрос, который выводит по каждому ПО установки против лицензий, сразу исключая неограниченные (number = -1) из суммы:
-- Softwares com mais instalacoes do que licencas (excedente de compliance).
-- 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;
Результат — это список закупок: каждая строка с положительным превышением — риск штрафа при аудите. Сверьтесь со словарём, прежде чем бежать покупать: половина «превышения» обычно оказывается одним и тем же ПО, посчитанным под двумя названиями.
Оповещения об истечении срока, которые действительно срабатывают
Истёкшая подписка — это замороженные деньги или отключённый сервис. GLPI оповещает, но у оповещения три переключателя, и все должны быть включены; типичная ошибка — считать, что достаточно заполнить поле expire:
- В организации (Администрирование > Организации, вкладка уведомлений): включить оповещения о лицензиях и задать срок упреждения (внутренние поля use_licenses_alert и send_licenses_alert_before_delay).
- В уведомлении (Настройки > Уведомления): уведомление о лицензии ПО должно быть активным, с заданными получателем и шаблоном.
- В cron: автоматическое действие, проверяющее сроки, выполняется только если работает cron GLPI. В продакшене это означает cron операционной системы, а не внутренний режим, зависящий от трафика пользователей.
Настройка внешнего cron, которую мы оставляем у каждого клиента:
# Crontab do usuario 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 roda
# "de carona" no trafego dos usuarios - e numa janela sem acesso, nunca dispara.
* * * * * www-data /usr/bin/php /var/www/glpi/front/cron.php &>/dev/null
Независимо от встроенного оповещения мы каждый понедельник отправляем отчёт о сроках прямо из базы, чтобы не зависеть только от уведомления:
-- 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_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;
Матрица решений по типу лицензии
Тип лицензии меняет то, как вы моделируете её в GLPI, и то, где находится риск. Матрица, которую мы используем при проектировании:
| Тип лицензии | Как моделировать в GLPI | Поле expire | Типичная ловушка |
|---|---|---|---|
| OEM (привязана к оборудованию) | number = 1 на устройство; тип OEM | Пусто (бессрочная) | Не переносится на другую машину — замена ПК порождает скрытое несоответствие |
| Volume (VLK / MAK / KMS) | 1 запись, number = законтрактованное количество | По договору | Считать реальные активации, а не потолок договора |
| Subscription (SaaS, Microsoft 365) | number = места; сверять по отчёту поставщика | Конец цикла | Инвентаризация не видит чистый SaaS — запись ручная |
| Бессрочная + Software Assurance | number = количество; expire = окончание SA | Окончание SA | Истечение SA не прекращает использование, но лишает права на обновление |
| Freeware / Trial | Freeware: number = -1; Trial: number + expire | Только для trial | Freeware, ставшее платным в новой версии, проходит незамеченным |
Сверка — это рутина, а не проект
Соответствие ПО — не фотография, а кино: парк меняется каждую неделю. Ритм, который работает при сопровождении, — ежеквартальная полная сверка (запуск запроса превышения, пересмотр словаря, проверка назначений) и ежемесячная проверка сроков. Уделяйте приоритетное внимание вендорам, которые действительно проводят аудит: Microsoft, Adobe, Oracle и Autodesk выставляют счета, и цена несоответствия, обнаруженного ими, на порядки выше стоимости поддержания базы в чистоте. Цель — не красивый отчёт, а возможность ответить на вопрос «сколько у меня лицензий X и сколько я использую?» числом, которому вы доверяете.
Хотите держать парк ПО под контролем, со сверенной базой лицензий и действительно срабатывающими оповещениями? Узнайте о сопровождении GLPI от NexTool.
Проверено командой NexTool Solutions.