среда, 24 сентября 2014 г.

Обработка и хранения snmp трапов

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

1. Сбор трапов

Этой задачей будет заниматься snmptrapd. Устанавливается он из пакета net-snmp.
После установки необходимо проверить, скомпилирован ли snmptrapd со встроенной поддержкой Perl:
[root@hostname]#snmptrapd -H 2>&1 | grep perl
    perl                     PERLCODE
    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"
;

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

Чтобы не возникали проблемы с переводом символьных OID'ов в числовые, добавим опцию к сервису snmptrapd:
# grep -v ^# /etc/sysconfig/snmptrapd
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
# 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
Секция в которой перечисляются все конфигурационные файлы. (см. Настройка конфигурационных файлов snmptt)

Установим и настроим PostgreSQL:
# yum install postgresql-server postgresql
# 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
# systemctl restart postgresql

Создадим базу и необходимые таблицы:
# su - postgres
$ createuser -P snmptt
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
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:
# 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
# chkconfig --add snmptt
# chkconfig snmptt on
# systemctl --system daemon-reload
# 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)

Получается, что проблема возникает с трапами которые не знает snmptt, определяем в /var/log/snmptt/snmpttunknown.log параметр, который не влазит в размеры указанные при создании базы и правим его (например, через phpPgAdmin), возможно с некоторым запасом.
И подобным образом добиваемся устранения всех ошибок.

3. Веб-интерфейс к полученным трапам

Данный этап необязателен и не оказывает влияние на работоспособность системы мониторинга.
Сперва установим веб-сервер и для удобства установим phpPgAdmin:
# yum install httpd
# systemctl enable 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

Простецкий веб-интерфейс WSTL:


Итак, основные вопросы со сбором, трансляцией и хранением трапов рассмотрены можно двигаться дальше к созданию системы мониторинга.

Комментариев нет:

Отправить комментарий