Обработка трапов будет заключаться в сборе трапов, с последующей их трансляцией. Для предоставления возможности некоторым лицам доступа к полученным трапам через веб-интерфейс, организуем их хранение в базе данных.
1. Сбор трапов
Этой задачей будет заниматься snmptrapd. Устанавливается он из пакета net-snmp.
После установки необходимо проверить, скомпилирован ли snmptrapd со встроенной поддержкой Perl:
[root@hostname]#snmptrapd -H 2>&1 | grep perl
perl PERLCODE
perlInitFile string
perlInitFile string
наличие первой строки сообщает, что требуемая поддержка имеется и возможно использование встроенного обработчика помимо стандартного обработчика трапов.
Если же эта строка отсутствует, то придётся компилировать net-snmp из исходников с опцией --enable-embedded-perl или использовать только стандартный обработчик трапов, у которого есть существенный недостаток -- snmptthandler запускается и считывает snmptt.ini при каждом получении трапа, возможно из-за этого иногда происходит зависания процесса в случае использования стандартного обработчика в связке с PostgreSQL.
Конфигурация:
# grep -v ^# /etc/snmp/snmptrapd.conf
disableAuthorization yes
perl do "/usr/sbin/snmptthandler-embedded";
disableAuthorization yes
perl do "/usr/sbin/snmptthandler-embedded";
В первой строке отключаем авторизацию, чтобы получать все сообщения.
Вторая строка собственно и включает встроенный обработчик транслирующий трапы.
Чтобы не возникали проблемы с переводом символьных OID'ов в числовые, добавим опцию к сервису snmptrapd:
# grep -v ^# /etc/sysconfig/snmptrapd
OPTIONS="-On"
OPTIONS="-On"
Для перехода к следующему этапу необходимо найти и скачать MIB файлы для оборудование которое подлежит мониторингу посредством snmp трапов и скопировать их в каталог /usr/share/snmp/mibs/.
2. Трансляция трапов
Для этой задачи существует набор скриптов под названием SNMPTT (SNMP Trap Translator). В большинстве случаев возможностей snmptt будет хватать, но также существует возможность парсить содержимое трапов своими скриптами, формировать сообщение по требуемым правилам, этот вариант будет описан позже (уже после установки и настройки системы мониторинга icinga).
Установка скриптов snmptt возможна двумя способами:
- установка через менеджер пакетов;
- установка из исходников (для дистрибутивов у которых пакетный менеджер не знает этот пакет и
также для тех кто хочет установить самую свежую версию набора скриптов).
Установка во втором варианте заключается в том, что необходимо скачать исходники с www.snmptt.org и скопировать исполняемые и конфигурационные файлы, этот процесс описан в официальной документации и выглядит примерно так:
# tar zxvf snmptt_1.4.tgz
# cd snmptt_1.4
# cp snmptt /usr/sbin/
# cp snmptthandler-embedded /usr/sbin/
# chmod +x /usr/sbin/snmptthandler-embedded
# ls -la /usr/sbin/ | grep snmptt
-rwxr-xr-x. 1 root root 177455 Sep 25 15:04 snmptt
-rwxr-xr-x. 1 root root 9227 Sep 25 15:04 snmptthandler-embedded
-rwxr-xr-x. 1 root root 9227 Sep 25 15:04 snmptthandler-embedded
# cp snmptt.ini /etc/snmp/
# cp snmptt.logrotate /etc/logrotate.d/snmptt
копировать файл примера конфигурации snmptt.conf.generic нет необходимости, достаточно просто заглянут в него для понимания того, как должна примерно выглядеть структура файла конфигурации трапов, которые требуется транслировать.
Рассмотрим основные моменты настройки snmptt.ini.
mode = daemon
Используем режим daemon, т.к. используется встроенный обработчик трапов и он поддерживает только этот режим. Режим standalone можно использовать только со стандартным обработчиком.
net_snmp_perl_enable = 1
Включаем поддержку модуля Perl и получаем возможность использовать подстановку переменных в конфигурационных ini файлах.
spool_directory = /var/spool/snmptt/
Вполне понятная опция, только необходимо создать данный каталог.
log_system_enable = 1
unknown_trap_log_enable = 1
Включаем логирование системных ошибок и неизвестных трапов. Файлы логов и их расположение используем стандартные, но необходимо создать каталог /var/log/snmptt/.
statistics_interval = 5184000
Опция связанная с какой то статистикой, посмотрим может в этот раз это сработает)
syslog_level = debug
Включаем самый подробный уровень логирования.
postgresql_dbi_enable = 1
postgresql_dbi_module = 1
postgresql_dbi_hostport_enable = 1
Использовать в качестве базы данных будем PostgreSQL.
postgresql_dbi_host = localhost
postgresql_dbi_port = 5432
postgresql_dbi_database = snmptt
Стандартные настройки
postgresql_dbi_table_statistics = snmptt_statistics
Оптимистично укажем таблицу для статистики)
postgresql_dbi_username = snmpttuser
postgresql_dbi_password = password
Параметры аторизации.
DEBUGGING = 2
DEBUGGING_FILE = /var/log/snmptt/snmptt.debug
DEBUGGING_FILE_HANDLER = /var/log/snmptt/snmptthandler.debug
Выставляем везде максимально возможный уровень логирования
snmptt_conf_files = <<END
/etc/snmp/snmptt.conf.apc
/etc/snmp/snmptt.conf.cisco
/etc/snmp/snmptt.conf.cisco_port_status
/etc/snmp/snmptt.conf.rad
/etc/snmp/snmptt.conf.mq
END
/etc/snmp/snmptt.conf.apc
/etc/snmp/snmptt.conf.cisco
/etc/snmp/snmptt.conf.cisco_port_status
/etc/snmp/snmptt.conf.rad
/etc/snmp/snmptt.conf.mq
END
Секция в которой перечисляются все конфигурационные файлы. (см. Настройка конфигурационных файлов snmptt)
Установим и настроим PostgreSQL:
# yum install postgresql-server postgresql
# systemctl enable postgresql.service
# systemctl enable postgresql.service
# postgresql-setup initdb
Настроим аутентификацию:
# grep -v ^# /var/lib/pgsql/data/pg_hba.conf
local snmptt snmptt md5
local all all md5
host all all 127.0.0.1/32 md5
host all all ::1/128 md5
local snmptt snmptt md5
local all all md5
host all all 127.0.0.1/32 md5
host all all ::1/128 md5
# systemctl restart postgresql
Создадим базу и необходимые таблицы:
# su - postgres
$ createuser -P snmptt
Enter password for new role:
Enter it again:
Enter password for new role:
Enter it again:
$ createdb -O snmptt snmptt
$ psql snmptt
psql (9.2.7)
Type "help" for help.
snmptt=# CREATE TABLE snmptt (
snmptt(# eventname VARCHAR(50),
snmptt(# eventid VARCHAR(50),
snmptt(# trapoid VARCHAR(100),
snmptt(# enterprise VARCHAR(100),
snmptt(# community VARCHAR(20),
snmptt(# hostname VARCHAR(100),
snmptt(# agentip VARCHAR(16),
snmptt(# category VARCHAR(20),
snmptt(# severity VARCHAR(20),
snmptt(# uptime VARCHAR(20),
snmptt(# traptime VARCHAR(30),
snmptt(# formatline VARCHAR(255));
CREATE TABLE
snmptt=# GRANT ALL ON snmptt TO snmptt;
GRANT
psql (9.2.7)
Type "help" for help.
snmptt=# CREATE TABLE snmptt (
snmptt(# eventname VARCHAR(50),
snmptt(# eventid VARCHAR(50),
snmptt(# trapoid VARCHAR(100),
snmptt(# enterprise VARCHAR(100),
snmptt(# community VARCHAR(20),
snmptt(# hostname VARCHAR(100),
snmptt(# agentip VARCHAR(16),
snmptt(# category VARCHAR(20),
snmptt(# severity VARCHAR(20),
snmptt(# uptime VARCHAR(20),
snmptt(# traptime VARCHAR(30),
snmptt(# formatline VARCHAR(255));
CREATE TABLE
snmptt=# GRANT ALL ON snmptt TO snmptt;
GRANT
snmptt=# CREATE TABLE snmptt_unknown (
snmptt(# trapoid VARCHAR(100),
snmptt(# enterprise VARCHAR(100),
snmptt(# community VARCHAR(20),
snmptt(# hostname VARCHAR(100),
snmptt(# agentip VARCHAR(16),
snmptt(# uptime VARCHAR(20),
snmptt(# traptime VARCHAR(30),
snmptt(# formatline VARCHAR(255));
CREATE TABLE
snmptt=# GRANT ALL ON snmptt_unknown TO snmptt;
GRANT
snmptt=# CREATE TABLE snmptt_statistics (
snmptt(# stat_time VARCHAR(30),
snmptt(# total_received BIGINT,
snmptt(# total_translated BIGINT,
snmptt(# total_ignored BIGINT,
snmptt(# total_unknown BIGINT);
CREATE TABLE
snmptt=# GRANT ALL ON snmptt_statistics TO snmptt;
GRANT
snmptt=# \q
snmptt(# trapoid VARCHAR(100),
snmptt(# enterprise VARCHAR(100),
snmptt(# community VARCHAR(20),
snmptt(# hostname VARCHAR(100),
snmptt(# agentip VARCHAR(16),
snmptt(# uptime VARCHAR(20),
snmptt(# traptime VARCHAR(30),
snmptt(# formatline VARCHAR(255));
CREATE TABLE
snmptt=# GRANT ALL ON snmptt_unknown TO snmptt;
GRANT
snmptt=# CREATE TABLE snmptt_statistics (
snmptt(# stat_time VARCHAR(30),
snmptt(# total_received BIGINT,
snmptt(# total_translated BIGINT,
snmptt(# total_ignored BIGINT,
snmptt(# total_unknown BIGINT);
CREATE TABLE
snmptt=# GRANT ALL ON snmptt_statistics TO snmptt;
GRANT
snmptt=# \q
Добавим пользователя, изменим владельца созданных выше каталогов и настроим запуск демона snmptt:
# useradd snmptt
# id snmptt
# uid=1001(snmptt) gid=1001(snmptt) groups=1001(snmptt)
# cp snmptt-init.d /etc/init.d/snmptt
# ls -la /etc/init.d/ | grep snmp
-rwxr-xr-x. 1 root root 1702 Sep 25 15:56 snmptt
-rwxr-xr-x. 1 root root 1702 Sep 25 15:56 snmptt
# chkconfig --add snmptt
# chkconfig snmptt on
# systemctl --system daemon-reload
# chown snmptt.snmptt /var/spool/snmptt
# chown snmptt.snmptt /var/log/snmptt
# chown snmptt.snmptt /var/spool/snmptt
# chown snmptt.snmptt /var/log/snmptt
# systemctl start snmptt
при запуске получаем ошибку:
snmptt: Starting snmptt: Can't locate Config/IniFiles.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/sbin/snmptt line 4023.
Исправить эту проблему можно многими путями, например, установить пакет perl-Config-IniFiles, но в репозитариях CentOS 7 этот пакет отсутствует, поэтому найдем в интернетах rpm-пакет perl-Config-IniFiles и установим его:
[root@hostname]# rpm -i perl-Config-IniFiles-2.68-1.5.noarch.rpm
(в Fedora 21 этот пакет есть: # yum install perl-Config-IniFiles)
Чтобы соблюсти все зависимости и избавиться при запуске snmptt от следующих ошибок:
snmptt: Starting snmptt: Can't locate Sys/Syslog.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at (eval 5) line 1.
snmptt: Starting snmptt: Can't locate SNMP.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at (eval 7) line 1.
snmptt: Starting snmptt: Can't locate SNMP.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at (eval 7) line 1.
snmptt: Can't locate DBI.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at (eval 9) line 1.
snmptt: Can't locate DBD/Pg.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at (eval 12) line 1.
установим необходимые пакеты:
# yum install perl-Sys-Syslog net-snmp-perl perl-DBD-Pg
Также потребуется пакет perl-Time-HiRes, при использовании встроенного обработчика ошибка о необходимости этого пакета не возникает, но без него и не будет работать передача трапов от snmptrapd в snmptt:
# yum install perl-Time-HiRes
и запустим снова демон snmptt:
# systemctl start snmptt
На этом этапе у нас работаю сервисы PostgreSQL и SNMPTT, теперь запустим snmptrapd:
# systemctl start snmptrapd
и начнём получать, транслировать и складывать в базу трапы.
Сейчас самое время заняться отладкой, для этого заглянем логи, например, в /var/log/snmptt/snmptt.debug обнаружилась следующая ошибка:
Postgres error: Unable to perform INSERT INTO (EXECUTE): ERROR: value too long for type character varying(20)
Находим в логах PostgreSQL:
ERROR: value too long for type character varying(20)
STATEMENT: INSERT INTO snmptt_unknown (trapoid,enterprise,community,hostname,agentip,uptime,traptime,formatline) VALUES ($1,$2,$3,$4,$5,$6,$7,$8)
STATEMENT: INSERT INTO snmptt_unknown (trapoid,enterprise,community,hostname,agentip,uptime,traptime,formatline) VALUES ($1,$2,$3,$4,$5,$6,$7,$8)
Получается, что проблема возникает с трапами которые не знает snmptt, определяем в /var/log/snmptt/snmpttunknown.log параметр, который не влазит в размеры указанные при создании базы и правим его (например, через phpPgAdmin), возможно с некоторым запасом.
И подобным образом добиваемся устранения всех ошибок.
3. Веб-интерфейс к полученным трапам
Данный этап необязателен и не оказывает влияние на работоспособность системы мониторинга.
Сперва установим веб-сервер и для удобства установим phpPgAdmin:
# yum install httpd
# systemctl enable httpd
# systemctl start httpd
# systemctl start httpd
Yum в CentOS 7 не знает пакет phpPgAdmin (в Fedora 21 пакет есть в репозиториях: # yum install phpPgAdmin), скачиваем дистрибутив с phppgadmin.sourceforge.net, распаковываем, например, в /usr/share/ и настраиваем веб-сервер:
# grep -v ^# /etc/httpd/conf.d/phppgadmin.conf
Alias /phppgadmin /usr/share/phppgadmin
<Directory /usr/share/phppgadmin>
DirectoryIndex index.php
AllowOverride None
Require all granted
<IfModule mod_php5.c>
php_flag magic_quotes_gpc Off
php_flag track_vars On
php_value include_path .
</IfModule>
<IfModule !mod_php5.c>
<IfModule mod_actions.c>
<IfModule mod_cgi.c>
AddType application/x-httpd-php .php
Action application/x-httpd-php /cgi-bin/php
</IfModule>
<IfModule mod_cgid.c>
AddType application/x-httpd-php .php
Action application/x-httpd-php /cgi-bin/php
</IfModule>
</IfModule>
</IfModule>
</Directory>
В Fedora 21 правим /etc/httpd/conf.d/phpPgAdmin.conf.
# grep Require /etc/httpd/conf.d/phpPgAdmin.conf
#Require local
Require all granted
#Require host example.com
И перечитываем конфиги веб сервера:
# systemctl restart httpd
Alias /phppgadmin /usr/share/phppgadmin
<Directory /usr/share/phppgadmin>
DirectoryIndex index.php
AllowOverride None
Require all granted
<IfModule mod_php5.c>
php_flag magic_quotes_gpc Off
php_flag track_vars On
php_value include_path .
</IfModule>
<IfModule !mod_php5.c>
<IfModule mod_actions.c>
<IfModule mod_cgi.c>
AddType application/x-httpd-php .php
Action application/x-httpd-php /cgi-bin/php
</IfModule>
<IfModule mod_cgid.c>
AddType application/x-httpd-php .php
Action application/x-httpd-php /cgi-bin/php
</IfModule>
</IfModule>
</IfModule>
</Directory>
В Fedora 21 правим /etc/httpd/conf.d/phpPgAdmin.conf.
# grep Require /etc/httpd/conf.d/phpPgAdmin.conf
#Require local
Require all granted
#Require host example.com
И перечитываем конфиги веб сервера:
# systemctl restart httpd
Простецкий веб-интерфейс WSTL:
Итак, основные вопросы со сбором, трансляцией и хранением трапов рассмотрены можно двигаться дальше к созданию системы мониторинга.
Комментариев нет:
Отправить комментарий