Zabbix
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
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
Для запуска после остановки
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 и все зеленеет
Нужно без использования 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
```