Давайте рассмотрим вопрос о авто обнаружении в 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)


  1. onix74
    16.09.2021 16:47
    +2

    echo "["|tr -d '\r\n'

    echo -n "["


  1. ar2inf
    16.09.2021 17:13
    +1

    Где-то после таких статей начинает плакать "безопасник"...


    1. Scorpey Автор
      16.09.2021 17:14

      Если безопасник очень впечатлительный. Ничего чувствительного тут нет. Даже списка пользователей для примера работы не выложил. Запустив скриптик сами все увидите


    1. Protos
      17.09.2021 08:37
      +1

      Не понимаю почему


  1. Sleuthhound
    16.09.2021 20:17

    /etc/passwd имеет обычную разметку с разделителем полей, можно его превратить в json с помощью препроцессинга в забиксе

    И не нужно колхозить ничего на баш.


    1. Scorpey Автор
      16.09.2021 20:20
      +1

      Я буду очень благодарен, если вы покажите пример.


      1. Red_Karl_Marx
        17.09.2021 12:54
        +1

        Делаете правило обнаружения c ключом vfs.file.contents[/etc/passwd]
        Потом обрабатываете в препроцессинге через JavaScript

        output = [];
        users = value.split("\n")
        for (index in users) {
            user = users[index].split(':',1).toString()
            output.push ( {"{#USER}": user } )
        }
        return JSON.stringify(output)

        как-то так


      1. Catwoolfii
        17.09.2021 23:01

        Ну или еще вариант: распарсить в csv и конвертнуть в json уже в заббиксе


        1. Sleuthhound
          19.09.2021 21:49

          Там достаточно 1 препроцессинга (csv to json) и все, дальше все делается через LLD.

          Можете скачать мой шаблон, но он под Zabbix 5.4. Под 5.0 или даже 4.4 можно легко переписать.


  1. Oxyd
    20.09.2021 05:20

    В любой современной системе с systemd на борту, например соберём только юзернеймы всех настоящих пользователей сразу в json...

    userdbctl -j|jq '.|select(.uid >=1000)|select(.uid < 65534)|{"#USER": .userName}'

    Ну и так далее. Глючик -j выводит базу пользователей сразу в json, а дальше, при помощи jq можно вертеть информацию как вздумается.


    1. Sleuthhound
      20.09.2021 14:25

      userdbctl: command not found

      Ubuntu 18.04.6 LTS

      видать не современная?

      так что уж лучше /etc/passwd


      1. Oxyd
        21.09.2021 09:04

        В 237.* ветке вроде ещё не было этой утилиты. Но вот в 245.*, которая в убунте 20.04 LTS, уже должно быть... Только не в убунте. По неведомым, видимо религиозным, причинам, systemd в убунте собирается без этого бинарника. Чудеса! Тогда, да. Только страдать башизмами.


        1. Sleuthhound
          21.09.2021 10:39

          Если касательно этой задачи, то не нужно страдать башизмами и даже что-то писать на javascript, в Zabbix все делается тыканьем мышки и не более. Выше я выложил готовый шаблон для 5.4