Zabbix

1.8.22

1.8.22

New Page

pooler - это форк zabbix_server/zabbix_proxy который собирает данные с агентов, snmp, etc
trapper - форк zabbix_server/zabbix_proxy который слушает 10051 порт и принимает данные от агентов или zabbix_sender


К ZS можно подключить GSM модем для отправки СМС алертов


Процесс zabbix_server защищен от запуска из под рута


Для процессов zabbix_server и zabbix_agent должны быть созданы разные пользователи в linux, иначе если оба процесса на одном сервере будут запущены от одного пользователя, у агента будут права на чтение конфигов zs, и будет возможно получить данные для подключения к базе данных через веб-интерфейс


zabbix-practice

Для тестов можете установить Zabby самостоятельно или используйте mon-test-vm

ZABBY_INSTALL

1) Создать конфиг для zabby c 3-мя items:

1) Возвращает метрику из любого столбца /sys/block/*/stat, (5 10 любую):
root@vandud-test:/usr/local/lib/python2.7/dist-packages/zabby/examples# tail -n3 items/10_standard.py
    'niga.bitch': lambda: 'fuckubitch',
    'sys.block.sda.stat': sh('cat /sys/block/sda/stat | cut -d\' \' -f5'),
}
root@vandud-test:/usr/local/lib/python2.7/dist-packages/zabby/examples# zabby_get niga.bitch
fuckubitch
root@vandud-test:/usr/local/lib/python2.7/dist-packages/zabby/examples# zabby_get sys.block.sda.stat
5993

Пока не доделал
Остановился на таком

 root@vandud-test:/usr/local/lib/python2.7/dist-packages/zabby/examples/items# head 10_standard.py -n 12
 from zabby import __version__
 
 from zabby.items import vfs, net, proc, vm, system, kernel
 from zabby.core.utils import sh
 
 def niga(fuck):
   return fuck
 
 def sysblockstat(num=1):
   CMD = "cat /sys/block/sda/stat | awk -v N=${0} '{print $N}'"
   return sh(CMD)(num)
2) Возвращает результат проверки доступности порта (любого)

not ready

root@vandud-test:/usr/local/lib/python2.7/dist-packages/zabby/examples/items# head -n 14 10_standard.py | tail -n2
def portcheck(num):
   CMD = "ss -tln4H | column | awk '{print $4}' | cut -d':' -f2 | grep  >/dev/null && echo 1 || echo 0"

2) Написать класс, который будет подключать этот конфиг на основании наличия на сервере опреденного факта, например наличия пакета, и убирать конфиг, если факт отсутствует.

возьмите зависимсть от пакета python-pythonlibmonitoring
класс не подключать в modules_root/monitoring/zabby/manifests/init.pp, а только на ноду mon-test-vm (или локально через puppet apply) в manifests_root/monitoring_nodes.pp

3) Написать override, который будет переопределять любой из item’ov (например для третьего item’a делить/умножать на 1000 вместь 100)

Нужно установить zabbix-server-pgsql версии >=1.8 <2.0 и настроить его на работу с локальной базой данных

Делаю в контейнере (тратит меньше ресурсов и мне так легче)

docker pull ubuntu:14.04.1

docker run -it --entrypoint /bin/bash --name zabbix ubuntu:14.04.1
docker start -i zabbix

Разворачиваю там постгрес

apt install postgresql
mkdir -p /usr/local/pgsql/data
chown -R postgres:postgres /usr/local/pgsql/data
sudo -u postgres /usr/lib/postgresql/9.3/bin/initdb -D /usr/local/pgsql/data/
sudo -u postgres /usr/lib/postgresql/9.3/bin/pg_ctl -D /usr/local/pgsql/data/ -l /var/log/postgresql/postgresql-9.3-main.log start
sudo -u postgres /usr/lib/postgresql/9.3/bin/createdb zabbix
sudo -u postgres psql


Firefox_2021-03-04-10-38-58.png
Firefox_2021-03-04-10-50-51.png
Firefox_2021-03-04-10-52-21.png


Для запуска после остановки

sudo -u postgres /usr/lib/postgresql/9.3/bin/pg_ctl -D /usr/local/pgsql/data/ -l /var/log/postgresql/postgresql-9.3-main.log start

zabbix

wget https://cdn.zabbix.com/zabbix/sources/oldstable/1.8/zabbix-1.8.22.tar.gz
tar -xzf zabbix-1.8.22.tar.gz

# from official docs  
shell> psql -U <username>
psql> create database zabbix; 
psql> \q 
shell> cd create/schema 
shell> cat postgresql.sql | psql -U <username> zabbix 
shell> cd ../data 
shell> cat data.sql | psql -U <username> zabbix
shell> cat images_pgsql.sql | psql -U <username> zabbix

apt install gcc
./configure --enable-server --with-pgsql # need install libpq-dev

apt install make
make install # some dance with drum

./configure --enable-agent
make install

cp misc/conf/zabbix_agent.conf /etc/zabbix/.
cp misc/conf/zabbix_server.conf /etc/zabbix/.

vim /etc/zabbix/zabbix_server.conf # set dbuser and dbport

zabbix_server
zabbix_agentd

apt install apache2
cp -r frontend/php/* /var/www/html/.

vim /etc/php5/apache2/php.ini 

apt install php5-pgsql php5-gd

# имя пользователя Admin, пароль zabbix

В разделе configuration/hosts включаем ZS и все зеленеет
2021-01-18-011929_1366x768_scrot.png

Нужно без использования web интерфейса создать хост, на хосте создать два айтема, один трапперный, другой external script, так же нужно создать два триггера, каждый использующий историю одного из созданных айтемов(через функции), один триггер должен зависить от другого

После создания триггеров, нужно изменить состояния триггеров с ok на problem и обратно при помощи генерации новых данных(отправка данных через zabbix_sender и изменение значения, выводимого скриптом)

Нужно установить zabbix-agent версии >=1.8 <2.3 и настроить его на работу с локальным заббикс сервером. Нужно без использования web интерфейса создать UserParameter с произвольным ключом(например, "ivan.vodka"), выполняющий произвольную команду(например, "echo 3"), после чего запросить у агента данные, ассоциированные с созданным ключом при помощи zabbix_get

Нужно снять сетевой дамп на запросы и ответы, генерируемые утилитами zabbix_get и zabbix_sender, и разобраться в используемом формате данных

Нужно без использования web интерфейса создать action, который будет выполняться при генерации эвентов, указывающих на переход триггера в состояние problem, который будет выполнять произвольный скрипт на том же сервере, на котором находится заббикс сервер(например скрипт может содержать "echo 4 > /tmp/zabbix_action"). Снять дамп на генерирование action'a

zabbixsetup

Делать на ubuntu 14, предварительно установив данные пакеты:
apache2
php5-pgsql(!!!!!)
libapache2-mod-php5
add-apt-repository
postgresql-9.5
php5-gd
php-net-socket
postgresql-server-dev-9.5
snmp
libiksemel-dev libiksemel-utils libiksemel3
libghc-network-protocol-xmpp-dev
libcurl3
php5-curl 
curl
fping
libcurl3-gnutls 
libcurl4-openssl-dev
libcurl4-gnutls-dev 
libsnmp-dev
wireshark
Установка:
    1)скачать zabbix 1.8 c офсайта
    2)tar -xvf zabbix*.tar.gz
    3)./configure --enable-server --with-pgsql --prefix=/usr/local/ 
    4)sudo make
    5)sudo make install
    6)sudo groupadd zabbix
    7)sudo useradd -g zabbix zabbix(+добавить в sudo zabix)
    8)sudo apt-get install postgresql-server-dev-9.5
    9)/etc/init.d/postgresql start
    10)cd /etc/postgresql/9.5/main/
        #listen_addresses = 'localhost' -> listen_addresses = 'localhost' в postgresql.conf
    11)sudo psql -U postgres
    12)create database zabbix
    13)создать юзера zabbix и сделать его владельцем базы zabbix
    14)залить дамп в базу заббикса из папки сорсов create/schema(уч) + сreate/data
sudo cat ~/zabbix-1.8.22/create/schema/postgresql.sql | psql -U zabbix zabbix
sudo cat ~/zabbix-1.8.22/create/data/images_pgsql.sql | psql -U zabbix zabbix
Настройка:
    *1)sudo vim /etc/services
        ```
        zabbix-agentd    10050/tcp  Zabbix Agent
        zabbix-agentd    10050/udp  Zabbix Agent
        zabbix-trapper  10051/tcp  Zabbix Trappercd 
        zabbix-trapper  10051/udp  Zabbix Trapper 
        ```
    *2)sudo vim /etc/inetd.conf:
        zabbix_agent stream tcp nowait.3600 zabbix /opt/zabbix/bin/zabbix_agent
    3)sudo mkdir /etc/zabbix 
          sudo chown -R zabbix /etc/zabbix
    4)из misc/conf в папке сорсов скопировать server конфиг в /etc/zabbix; misc/init.d/debian/zabbux-server.conf  в /etc/init.d/zabbix-server(убрать расширение)(chmod)
    Брать из папки debian потому что там норм скрипты, в папке ubuntu лежит какое то говно
    
    5)отредактировать конфиг
        /var/log/zabbix/$name.log(chown)
        pid */$name.pid(chown) (в документации написано использовать папку /var/run, но при этом после перезагрузки все файлы будут затираться, поэтому лучше использовать другую)   
        host:localhost
        user:zabbix
        pass:zabbix
        db:zabbix
    6)cd /usr/local/sbin | ./zabbix_server(перед этим проверить, что все файлы доступны для чтения/записи/исполнения пользователю zabbix)
    7)в логах должна была появиться инфа о запуске 
    настройка веб-интерфейса(так проще убедиться, что все работает, дальнейшая настройка через терминал и psql):
    1)sudo a2enmod php5
    2)cp ~/zabbix-*/frontend/php/* /var/www/html
cp -a . /var/www/html
    3)sudo service apache2 start
    4)установить директивы в /etc/apache2/apache2.conf
        ```
        php_value max_execution_time 300
        php_value memory_limit 128M
        php_value post_max_size 16M
        php_value upload_max_filesize 2M
        php_value max_input_time 300
        php_value always_populate_raw_post_data -1
        php_value date.timezone Europe/Moscow
        ```
Создаем в db хост:
    INSERT INTO hosts (hostid,host,ip) VALUES ('90001','MyLocalhost','127.0.0.1');
Связываем его с группой:
    insert into hosts_groups (hostgroupid,hostid,groupid) values ('59', '90001', '11');
    hostgroupid - id записи в таблице hosts_groups
    groupid - id группы, в данном случае группу сделал сам заранее
    
    Если этого не сделать то в веб-морде отображаться не будет.
Связываем хост с шаблоном:   ОПЦИОНАЛЬНО
    insert into hosts_templates (hosttemplateid, hostid, templateid) values ('1', '90002', '10001') 
    СВЯЗЫВАЕТ НО АЙТЕМЫ НЕ КОПИРУЕТ.
Создаем айтемы(https://www.zabbix.com/documentation/1.8/api/item):
    -insert into items (itemid, hostid, description, key_, type, delay) values ('23004','90001','test.sh{100}', 'test.sh', '10', '1');(экстернал чек)
    срипт должен лежать на заббикс-сервере в папке '/etc/zabbix/externalscripts', должен быть rwx для zabbix, owner zabbix(данный скрипт выводит число 100)
    #!/bin/bash
    echo '100'
    description - имя
    type - в данном случае external check
    key_ - путь от папки /etc/zabbix/externalscripst
    delay адержка между обновлениями значения
    -insert into items (itemid, type, description, key_, value_type,hostid) VALUES ('23005','2','trappertest','trap','3','90001');(trapper)
    value_type - 2 zabbix trapper
               - 10 external check
Создаем триггеры:
    -insert into triggers (triggerid, expression, description) values ('23004','{23004}=100', 'external item not zero');
    expression -выражение триггера
    -insert into triggers (triggerid, expression, description) values ('23005','{23005}<10','trappertesterr');
Создаем функцию:
    -insert into functions (itemid, functionid, function, triggerid ) VALUES ('23004','23004','last','23004');экстернал чек
    -insert into functions (itemid, functionid, function, triggerid) values ('23005','23005','last','23005');траппер
Добавить зависимость триггеров: 
    -INSERT INTO trigger_depends (triggerdepid, triggerid_down, triggerid_up) VALUES ('1', '23004', '23005'); триггер 23004 будет зависеть от 23005
т.е. пока 23005 в проблеме, 23004 не будет срабатывать, даже если для него выполнено триггерное выражение. Если 23004 в ОК, а 23005 сработал, то 23005 перейдет в проблему  
Устанавливаем zabbix_sender(https://www.zabbix.com/documentation/1.8/ru/manpages/zabbix_sender):
    1)cd zabbix-1.8*/src
    2)sudo make
    3)sudo make install
Отправляем данные на траппер:
    while true; do sleep 1; zabbix_sender -z 127.0.0.1 -s MyLocalhost -k trap -c /etc/zabbix/zabbix_server.conf -o 9; done
    проверяем, что триггер срабатывает
Устанавливаем zabbix_agent и proxy: 
    sudo ./configure --enable-proxy --enable-agent --with-pgsql --with-net-snmp
    sudo make install
    не забывать про sudo, иначе в какой то момент можно не обнаружить бинарников в /usr/local/sbin
    компируем конфиги из сорсов, меняем пути к логам и коннекты к базе, запускаем:
    sudo cp misc/init.d/debian/zabbix-agent.conf /etc/init.d/zabbix-agent
    у файлов логов должны быть разрешения на запись + chown
    конфиг файлам сделать chmod +x
    далее можнет возникнуть проблема:
        в после запуска заббикс агента:
            $ sudo zabbix_agentd
        в логах:
            9166:20170831:050459.347 Starting Zabbix Agent [Zabbix server]. Zabbix 1.8.22 (revision 51172).
            9166:20170831:050459.347 listener failed: bind() for [[-]:10050] failed: [98] Address already in use
        порт уже занят заббикс сервером, проверить:
            netstat -ntlp
            tcp        0      0 0.0.0.0:10050           0.0.0.0:*               LISTEN      19967/zabbix_agentd
        решение:
            ps aux | grep -i zabbix_agentd
            kill -9 $zabbix_agentdpids(если процессов много, то проще pkill -9 zabbix_agentd)(помогает в аналогичных случаях)
            sudo zabbix_agentd
    
    zabbix_get -s 127.0.0.1 -p 10050 -k "system.cpu.load[all,avg1]"(если возвращает результат - работае)
Прописываем UserParametr unixtime для заббикс агента:
    1)sudo vim /etc/zabbix/zabbix_agentd.conf 
    2)раскомментируем строчку UserParametr, указываем параметр вида '<ключ>,<команда>'
    3)UserParameter=unixtime, awk 'BEGIN {srand(); print srand()}'
    4)zabbix_get -s 127.0.0.1 -p 10050 -k "unixtime"
Создаем действие:
q   (https://docs.i-free.com/pages/viewpage.action?pageId=26215352)
    (https://www.zabbix.com/documentation/1.8/manual/config/actions)
    -insert into actions (actionid, name, eventsource, evaltype, status, def_shortdata, def_longdata, r_shortdata, r_longdata) values ('1','ZabbixTriggerActionPr', '1', '0','1','trigger problem','triggerproblem msg','{TRIGGER.STATUS}: {TRIGGER.NAME}','Trigger:{TRIGGER.NAME} problem');
    -insert into actions (actionid, name, eventsource, evaltype, status, def_shortdata, def_longdata, r_shortdata, r_longdata) values ('4','ZabbixTriggerActionPr', '0', '0','0','default subj msg','default msg','{TRIGGER.STATUS}: {TRIGGER.NAME}','Trigger:{TRIGGER.NAME} problem');
    
action
                                                            Trigger: {TRIGGER.NAME}\r                                    +
        |              |                                  | Trigger status: {TRIGGER.STATUS}\r                           +
        |              |                                  | Trigger severity: {TRIGGER.SEVERITY}\r                       +
        |              |                                  | Trigger URL: {TRIGGER.URL}\r                                 +
        |              |                                  | \r                                                           +
        |              |                                  | Item values:\r                                               +
        |              |                                  | \r                                                           +
        |              |                                  | 1. {ITEM.NAME1} ({HOSTNAME1}:{TRIGGER.KEY1}): {ITEM.VALUE1}\r+
        |              |                                  | 2. {ITEM.NAME2} ({HOSTNAME2}:{TRIGGER.KEY2}): {ITEM.VALUE2}\r+
        |              |                                  | 3. {ITEM.NAME3} ({HOSTNAME3}:{TRIGGER.KEY3}): {ITEM.VALUE3}
-создаем condition:
        insert into conditions (conditionid, actionid, conditiontype, operator, value) values ('15','1','2','0','23004');
        insert into conditions (conditionid, actionid, conditiontype, operator, value) values ('16','1','2','0','23005');
-insert into conditions (conditionid, actionid, conditiontype, operator, value) values ('46','4','2','0','23004');
-insert into conditions (conditionid, actionid, conditiontype, operator, value) values ('47','4','2','0','23005');
    
-через вебню можно создать оповещения для юзера admin, либо через таблицу operations
    -insert into operations (operationid, actionid, operationtype, objectid, longdata, default_msg) values ('9','4','1','0','MyLocalhost:/etc/zabbix/externalscripts/test2.sh','1');
    -по указанному пути создать скрипт, записывающий текст в файл, дать право на выполнение и сделать владельцем пользователя zabbix.
 operationid | actionid | operationtype | object | objectid | shortdata |                           longdata                           | esc_period | esc_step_from | esc_step_to | default_msg | evaltype 
-------------+----------+---------------+--------+----------+-----------+--------------------------------------------------------------+------------+---------------+-------------+-------------+----------
          33 |        4 |             1 |      0 |        0 |           | MyLocalhost:sudo bash /etc/zabbix/externalscripts/test1.sh |          0 |             1 |           1 |           1 |        0
Поскольку команда выполняется заббикс-агентом, то в его конфиге нужно раскомментировать строку EnableRemoteCommands и изменить значение на 1.
Снимаем дампы с трафика:
Убедиться, что zabbix server снят с мониторинга и стоит только MyLocalhost, чтобы не засрать дамп
    -vv : подробно
    -s : устанавливает ограничение на размер захватываемых пакетов, -s0 устанавливает это ограничение равным 65535 байтам.
    -i any: просматривать все сетевые интерфейсы
    c zabbix_sender:
        -sudo tcpdump -vv -s0 -i any 'port 10051 ' -w test/zabbixsender
        -шлем инфу на траппер x2(zabbix_sender -z 127.0.0.1 -s MyLocalhost -k trap -c /etc/zabbix/zabbix_server.conf -o 9)
        -открываем файл в wireshark
    с zabbix_get:
        снимаем дамп опроса клиента через zabbix-get:
        -sudo tcpdump -vv -s0 -i any 'port 10050' -w test/zabbixget
        -выполняем в отдельном терминале zabbix_get -s 127.0.0.1 -p 10050 -k "unixtime")х2
        -ctrl+c
        -wireshark
    с action:q
        -ставим триигер в ок(zabbix_sender -z 127.0.0.1 -s localhost2708 -k trap -c /etc/zabbix/zabbix_server.conf -o 10)
        -sudo tcpdump -vv -s0 -i any 'port 10050' -w test/zabbixacton(слушаем на 10050)
        -zabbix_sender -z 127.0.0.1 -s localhost2708 -k trap -c /etc/zabbix/zabbix_server.conf -o 9(отправляем сендером! на 10051, в дампе будет только инфа о работе action)
Установка zabby:
     1)git clone https://github.com/blin/zabby.git
     2)sudo python setup.py install
     3)zabby -c /usr/local/lib/python2.7/dist-packages/zabby/examples/config.py
     (версия python может отличаться)
     3)проверить работу забби можно:
        zabby_get agent.ping 
     4)проверить инструкции
Сделать так, чтобы забби читал /etc/zabby/
Создаем хост в для zabby:
    -insert into hosts (hostid, host, ip, port) values ('90002', 'localhostzabby','127.0.0.1','10052');
ТУТ ВСЕ АЙТЕМЫ БЕЗ ПЕРИОДИЧЕСКОГО ОПРОСА, В ЗАПРОС НУЖНО ДОБАВИТЬ ЗНАЧЕНИЕ DELAY.
Создаем айтем для zabby:
    -insert into items (itemid, type, description, key_, value_type,hostid) VALUES ('23007','0','zabbytest_os.name','os.name','4','90002');
    -insert into items (itemid, type, description, key_, value_type,hostid) VALUES ('23008','0','zabbytestrandint','random','3','90002');
    -insert into items (itemid, type, description, key_, value_type,hostid) VALUES ('23009','0','zabbytest_platform.system','platform.system','4','90002');
    -insert into items (itemid, type, description, key_, value_type,hostid) VALUES ('23010','0','zabbytest_platform.release','platform.release','4','90002');
Cоздаем триггеры для zabby:
    -insert into triggers (triggerid, expression, description) values ('23007','{23007}=0','os.name_was_changed');
    -insert into triggers (triggerid, expression, description) values ('23008','{23008}>5','random int > 5');
    -insert into triggers (triggerid, expression, description) values ('23009','{23007}=0','os.name_was_changed');
    -insert into triggers (triggerid, expression, description) values ('23010','{23007}=0','os.name_was_changed');
Создаем функции для zabby:
    -insert into functions (itemid, functionid, function, triggerid) values ('23007','23007','last','23007');
    -insert into functions (itemid, functionid, function, triggerid) values ('23008','23008','last','23008');
    -insert into functions (itemid, functionid, function, triggerid) values ('23009','23009','last','23009');
    -insert into functions (itemid, functionid, function, triggerid) values ('23010','23010','last','23010');
Создаем две метрики для забби и создаем конфиги забби:
    1)sudo mkdir -p /etc/zabby/items
    2)sudo vim 30_customitems.py
            ```
            from zabby.core.utils import sh
            from random import randint
            items = {
                   #my items
                 'os.name': lambda: os.name,
                 'platform.system': platform.system,
                 'platform.release': platform.release,
                 'random': lambda: random.randint(1, 10),
            } 
            ```
    3)sudo vim /etc/zabby/config,py
            ```
            import os
            listen_host = '0.0.0.0'
            listen_port = 10052
            _config_dir = os.path.dirname(os.path.abspath(__file__))
            _item_dir = os.path.join(_config_dir, 'items')
            item_files = sorted([os.path.join(_item_dir, item_file)
                                for item_file in os.listdir(_item_dir)
                                if item_file.endswith('.py')])
            logging_conf = os.path.join(_config_dir, 'logging.conf')
            ```
    4)sudo vim /etc/zabby/logging.conf
            ```
            [loggers]
            keys=root
            [handlers]
            keys=file
            [formatters]
            keys=default
            [logger_root]
            level=DEBUG
            handlers=file
            [handler_file]
            class=logging.handlers.TimedRotatingFileHandler
            formatter=default
            args=('/var/log/zabby/zabby.log','midnight', 1, 7)
            [formatter_default]
            format=%(asctime)s %(levelname)s [%(name)s] %(message)s
            datefmt=%Y-%m-%d %H:%M:%S
            ```