Давайте рассмотрим вопрос о авто обнаружении в Zabbix не предусмотренных разработчиками, но очень нужные для решения ряда задач.
Система мониторинга Zabbix обладает возможностью авто обнаружения различных объектов, например из коробки система умеет обнаруживать файловые системы: vfs.fs.get или сетевые интерфейсы: net.if.discovery.
Но что делать если нужно обнаруживать те объекты для которых разработчик не заложил инструмента?
Рассмотрим задачу.
Требуется наладить мониторинг потребляемых ресурсов памяти и процессора каждым пользователем системы Linux в отдельности.
Мониторить по отдельно взятому пользователю не сложно, - разработчик Zabbix дает нам инструмент для взятия метрики по процессору:
proc.cpu.util[,USER]
Так ж по памяти:
proc.mem[,USER]
Но в ручном режиме постоянно брать пользователей и создавать отдельную метрику, как водится лениво.
Перейдем к самому обнаружению пользователей LLD (Low Level Discovery)
Примем за данность что список пользователей содержится в файле:
/etc/passwd
Но там текст совсем не подходящий для Zabbix LLD. Для начала выведем только пользователей:
awk -F: '{print $1}' /etc/passwd
И получим просто список пользователей.
Для работы Zabbix LLD необходимо подать данные в JSON формате. Для обертки простого списка в JSON используем следующее:
echo "["|tr -d '\r\n'; awk -F: ' {print "{\"{#USER}\":" "\""$1"\"}," }' /etc/passwd | tr -d '\r\n'| sed 's/.$//'; echo "]" "]"
Если нам потребуется взять пользователей только определенной группы, например номер 1005 то скрипт придется немного изменить:
echo "["|tr -d '\r\n'; awk -F: ' /1005/ {print "{\"{#USER}\":" "\""$1"\"}," }' /etc/passwd | tr -d '\r\n'| sed 's/.$//'; echo "]" "]"
В обнаружение остается добавить нужные прототипы метрик, графиков основываясь на макросе {#USER}.
Пользуйтесь :-)
Подводя итог отмечу, что такой подход можно применить для Zabbix LLD практически любой сущности в Linux вселенной.
Комментарии (13)
Sleuthhound
16.09.2021 20:17/etc/passwd имеет обычную разметку с разделителем полей, можно его превратить в json с помощью препроцессинга в забиксе
И не нужно колхозить ничего на баш.
Scorpey Автор
16.09.2021 20:20+1Я буду очень благодарен, если вы покажите пример.
Red_Karl_Marx
17.09.2021 12:54+1Делаете правило обнаружения c ключом vfs.file.contents[/etc/passwd]
Потом обрабатываете в препроцессинге через JavaScriptoutput = []; users = value.split("\n") for (index in users) { user = users[index].split(':',1).toString() output.push ( {"{#USER}": user } ) } return JSON.stringify(output)
как-то так
Catwoolfii
17.09.2021 23:01Ну или еще вариант: распарсить в csv и конвертнуть в json уже в заббиксе
Sleuthhound
19.09.2021 21:49Там достаточно 1 препроцессинга (csv to json) и все, дальше все делается через LLD.
Можете скачать мой шаблон, но он под Zabbix 5.4. Под 5.0 или даже 4.4 можно легко переписать.
Oxyd
20.09.2021 05:20В любой современной системе с
systemd
на борту, например соберём только юзернеймы всех настоящих пользователей сразу в json...userdbctl -j|jq '.|select(.uid >=1000)|select(.uid < 65534)|{"#USER": .userName}'
Ну и так далее. Глючик
-j
выводит базу пользователей сразу вjson
, а дальше, при помощиjq
можно вертеть информацию как вздумается.Sleuthhound
20.09.2021 14:25userdbctl: command not found
Ubuntu 18.04.6 LTS
видать не современная?
так что уж лучше /etc/passwd
Oxyd
21.09.2021 09:04В 237.* ветке вроде ещё не было этой утилиты. Но вот в 245.*, которая в убунте 20.04 LTS, уже должно быть... Только не в убунте. По неведомым, видимо религиозным, причинам,
systemd
в убунте собирается без этого бинарника. Чудеса! Тогда, да. Только страдать башизмами.Sleuthhound
21.09.2021 10:39Если касательно этой задачи, то не нужно страдать башизмами и даже что-то писать на javascript, в Zabbix все делается тыканьем мышки и не более. Выше я выложил готовый шаблон для 5.4
onix74
echo -n "["