Авторские статьи об OpenSource

Шаблон Operating System Identification для Zabbix.


Долгое время для добавления в Zabbix информации об операционной системе использовал вывод команды lsb_release, но приходилось создавать на хостах в каталоге zabbix агента дополнительный скрипт для парсинга вывода. Вскоре заметил что в новых версиях Debian ещё и требуется ставить пакет lsb-release. И тут закралась коварная мысль - можно ли справиться с ситуацией стандартными средствами Zabbix и без дополнительных скриптов и пакетов? Как вы поняли по названию статьи - да, можно!

Идентификация ОС. Версия 1.

Задача носит больше академический интерес, так как информацию по операционным системам хостов проще и логичнее собрать средствами оркестровки типа ansible, что я обычно и делаю. Но Zabbix сервер так же не лыком шит и умеет отображать нужные элементы (items) у множества хостов в одном окне, что быстро и удобно.

В системе есть файл /etc/os-release, в котором много полезной информации в виде ключ=значение. Полное его описание лучше прочесть в os-release - Operating system identification.

Самое важное что нужно понять, значения могут быть без кавычек, а могут быть в двойных или одинарных, если в значении есть символы за пределами диапазона английских букв и цифр. Variable assignment values must be enclosed in double or single quotes if they include spaces, semicolons or other special characters outside of A-Z, a-z, 0-9.

Вот небольшой пример из мира Дебиан
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
VERSION_CODENAME=buster
ID=debian

У нас есть файл /etc/os-release, который хотелось бы прочесть стандартными средствами Zabbix агента и сразу превратить их в соответствующие элементы. Начал изучение вопроса с документации Zabbix и наткнулся на
vfs.file.regexp[файл, регулярное_выражение, кодировка, начальная_строка, конечная_строка, вывод]

Самое главное, что vfs.file.regexp в качестве возвращаемого значения отдаёт совпадающую подстроку. То что нужно! Но помните поговорку? Если у вас есть проблема и вам пришла в голову идея, что можно решить её с помощью регулярных выражений, то теперь у вас две проблемы.

Потянулись часы на онлайн ресурсах, которые помогают создавать зубодробительные PCRE конструкции, которые перестаёшь понимать после внедрения. Удалось с помощью Гугла и такой-то матери родить набор знаков, извлекающее нужное значение в различных вариантах - без кавычек, с одинарными или двойными.

Пример для извлечения значения для ключа PRETTY_NAME. В круглых скобках можно видеть группы: первая и третья извлекают кавычки, если они есть, а вторая - собственно значение.
^PRETTY_NAME=(?P<quote>["']?)(?P<value>[\S\s]*?)(?P=quote)($|\s)

Создал тестовый элемент у одного хоста и влепил в виде ключа
vfs.file.regexp["/etc/os-release","^PRETTY_NAME=(?P<quote>["']?)(?P<value>[\S\s]*?)(?P=quote)($|\s)",,,,\2]

Проверяем что всё работает и приступаем к созданию zabbix шаблона Template_OSI.xml. Файл лучше сохранить по ссылке и открывать в редакторах типа Notepad++. В шаблоне < и > нужно заменить на их html код - &lt; и &gt;. Внутри квадратных скобок двойную кавычку экранируем слешем.

Комментарии к шаблону:

  • Требования к шаблонам и обязательным элементам внутри разнятся от версии к версии Zabbix, поэтому с прицелом на будущее всё заточил под 5+ версию. Если у вас Zabbix ещё не того калибра, то уже самостоятельно конвертируйте шаблон в нужное вам.
  • Ключей в /etc/os-release много и много дистроспецифичных. Выбрал некоторые и общие.
  • Информация в /etc/os-release может меняться только при обновлениях системы. Например, Убунту при прохождении новых релизных точек (milestones) может отобразить этот факт в виде строки Ubuntu 18.04.5 LTS, а "завтра" Ubuntu 18.04.6 LTS. Частота опроса выставлена в 1 день (1d).
  • Неявно ожидается что для хостов вы используете стандартный шаблон Template OS Linux, который даёт раздел OS. Данные шаблона Template_OSI.xml так же можно найти в разделе OS.


Идентификация ОС. Версия 2.

Первая версия шаблона работает, но где-то в глубоко в душе копошилась мысль, что тема до конца не раскрыта. Дело в том, что у различных дистрибутивов Linux различное количество строк в файле /etc/os-release. Если красиво и элегантно их представить всех в Zabbix у различных серверов с их различными операционными системами на базе Linux, то это автоматически подразумевает использование "Низкоуровневого обнаружения" (Low-level discovery, LLD). Так же нужно было ограничиться лишь средствами Zabbix, не требуя дополнительных скриптов. Такой вызов не мог не остаться мной не замеченным!

Итак, нам нужно для LLD:

  • Прочесть файл /etc/os-release
  • Распарсить его для получения лишь ключей (то что до знака равно)
  • Выдать правильный JSON

У тестового сервера создаём в "Правилах обнаружения" своё правило с ключом vfs.file.contents["/etc/os-release"]. Чтобы распарсить текст из файла средствами Zabbix нужно воспользоваться Предобработкой (Preprocessing). На просторах Интернета был найден Javascript пример, который после небольшой модификации превратился в

var lld = [];
var lines = value.split("\n");
var lines_num = lines.length;
for (i = 0; i < lines_num; i++)
{
  var row = {};
  var k = lines[i].split("=");
  row["{#KEY}"] = k[0];
  lld.push(row);
}
return JSON.stringify(lld);

Прочитанное содержимое файла /etc/os-release разбивается по строкам (\n) и потом строка разбивается по символу = и берётся ключ, а значение отбрасывается.

Теперь когда создано правило обнаружения, Zabbix будет иметь возможность получить все ключи данного сервера. Теперь нужно создать "Прототип элемента данных" (item prototype). Вот единственная строка, которая сформирует на каждый ключ свой правильный элемент данных.
vfs.file.regexp["/etc/os-release","^{#KEY}=(?P<quote>["']?)(?P<value>[\S\s]*?)(?P=quote)($|\s)",,,,\2]

Благодаря правилу обнаружения для каждого сервера Zabbix сможет извлекать все его ключи из /etc/os-release и через прототип формировать элементы данных под каждый ключ. Затем эти сформированные элементы данных будут периодически опрашиваться Zabbix сервером и получать данные. Вуаля! Дело сделано и чисто средствами Zabbix сервера.

Вот сам итоговый zabbix шаблон Template_OSI_v2.xml. Файл лучше сохранить по ссылке и открывать в редакторах типа Notepad++. Пришлось интуитивно понять как мои наработки, сделанные вручную, указать в xml файле, так как я не нашёл толкового описания на просторах Интернет. Но, благодаря чутью, по аналогии с подсмотренными схожими тегами в стандартных шаблонах удалось создать рабочий шаблон. Так как операционная система редко меняется, поэтому опрос раз в сутки (1d). Для тестов или поменяйте на что-то поменьше или пользуйтесь функционалом Zabbix - "запустить здесь и сейчас".

Пример с сервера Debian GNU/Linux

Debian

Пример с сервера Ubuntu Server LTS

Ubuntu


Если у вас не 5+ версия Zabbix и ручная правка-адаптация xml под вашу версию вас доконала, возможно, поможет создание шаблона с нуля и вставка лишь готовых строк key.

Дата последней правки: 2021-02-01 01:07:55

    Twitter   


Разделы

Главная
Новости
Ворох бумаг
Видео Linux
Игры в Linux
Безопасность
Статьи о FreeBSD
Статьи об Ubuntu
Статьи о Snappy
Статьи об Ubuntu Phone
Статьи о Kubuntu
Статьи о Xubuntu
Статьи о Lubuntu
Статьи об Open Source
Карта сайта

Лучшее на сайте:

1С под Linux.   Ускорение Ubuntu.   21 пример iptables.   Цикл статей о Ceph.   Убунту в дикой среде.   Ubuntu Linux на SSD.   Ubuntu для блондинок.   Поддержка железа в Linux.   BTSync на службе у админа.   Андроид программы в Ubuntu.   Прокидывание портов для p2p.   Анти СПАМ в Postfix.  



Группа поддержки