Создаем систему мониторинга большой сети удаленных филиалов своими руками

image
Задача: сделать эффективную и! бесплатную! систему мониторинга сети из ~50-60 Cisco маршрутизаторов и 80 серверов на платформе Windows 2003/2008, чтобы службе поддержки было видно когда что-либо падает, отваливаются службы на серверах, тунели на цисках, загруженность каналов и так далее.

Оборудование: Систему в общем то потянет любой сервер, тестировалась со всей этой сеткой она у меня на стареньком Celeron с 768Mb RAM, сейчас стоит на мощном Xeon'е с 8Gb оперативной памяти, но практически не ест ресурсов.

Программное обеспечение: CentOS 5 + Nagios + Cacti + Plugins
По желанию систему можно грузить еще чем-угодно, у меня например на ней же стоит форум phpBB3 использующийся как база знаний Техподдержки, файловая помойка и ssh терминалы.
Nagios был выбран как платформа для мониторинга доступности хостов по пингу, серверов на платформе Windows и сетевых принтеров HP. Cacti — в основном для мониторинга сети.

Почему выбираем эту связку? Решений для мониторинга сейчас очень много, из испробованных мной — эта связка пришлась по душе больше всего, т.к. она а) полностью бесплатная б) не требует много ресурсов в) эстетически приятный вид мониторингов г) высокая конфигурироемость

Описывать как устанавливать CentOS я не буду, в сети достаточно мануалов по этой теме, да и установка там сложностей не представляет. Единственное, что пожалуй добавлю — ставил его в редакции server. Скачать установщик можно тут.
После установки сразу же поставим все необходимые нам пакеты. Для этого установим парочку репозиториев и перезагрузимся:
rpm -Uhv <a href="http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.i386.rpm">apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.i386.rpm</a>
rpm -ivh <a href="http://rpm.livna.org/livna-release-5.rpm">rpm.livna.org/livna-release-5.rpm</a>
rpm -ihv <a href="http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm">download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm</a>
yum -y update
reboot


Теперь можем установить непосредственно пакеты:
yum install -y gcc glibc glibc-common gd gd-devel mysql mysql-server mysql-devel httpd httpd-devel php php-mysql php-gd phpimap php-ldap php-odbc php-pear php-xml php-xmlrpc php-mcrypt curl curl-devel perl-libwwwperl libxml2 php-mbstring mc webmin openssh-server openssh-clients net-snmp net-snmp-utils rrdtool php-snmp net-snmp-devel 


Включаем сервисы для доступа по ssh:
chkconfig sshd start
service sshd start


Включаем apache:
chkconfig httpd on
service httpd start


Открываем доступ к 80 и 22 портам, для этого редактируем файл /etc/sysconfig/iptables (файрволл):
nano /etc/sysconfig/iptables

Добавляем туда строки:
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 80 -j ACCEPT

И убираем или комментируем строку:
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited


У меня после всех модификаций файл выглядит так:
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
#-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 80 -j ACCEPT
COMMIT


Но на этом наши пляски с бубном вокруг фаерволов не закончены. В CentOS есть еще такая вещь, как SELinux (Security Enchanced Linux).
Его нам тоже надо выключить, чтоб не мешался:
Открываем /etc/sysconfig/selinux
nano /etc/sysconfig/selinux

и меняем в нем
SELINUX=enforcing
на
SELINUX=disabled


С фаерволом покончили.

Теперь перейдем к установке непосредственно NAGIOS — его я использую для мониторинга доступности цисок (по пингу) и служб и сервисов Windows.
Создадим юзера для нагиоса и добавим его в нужные группы:
/usr/sbin/useradd -m nagios
/usr/sbin/groupadd nagcmd
passwd nagios
/usr/sbin/usermod -a -G nagcmd nagios
/usr/sbin/usermod -a -G nagcmd apache


Качаем сам нагиос, распаковываем его:
wget <a href="http://prdownloads.sourceforge.net/sourceforge/nagios/nagios-3.2.3.tar.gz">prdownloads.sourceforge.net/sourceforge/nagios/nagios-3.2.3.tar.gz</a>
wget <a href="http://prdownloads.sourceforge.net/sourceforge/nagiosplug/nagios-plugins-1.4.15.tar.gz">prdownloads.sourceforge.net/sourceforge/nagiosplug/nagios-plugins-1.4.15.tar.gz</a>
tar -xzf nagios-3.2.3.tar.gz
tar -xzf nagios-plugins-1.4.15.tar.gz


Идем к нему в директорию и инсталлируем:
cd nagios-3.2.3
./configure –with-command-group=nagcmd
make all
make install
make install-init
make install-config
make install-commandmode
make install-webconf


Перезапускаем apache:
service httpd restart


Теперь ставим плагины:
cd nagios-plugins-1.4.15
./configure –with-nagios-user=nagios –with-nagios-group=nagios
make
make install


Выставляем пароль на Nagios и запускаем его:
htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin
/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
service nagios start


Поздравляю, маленькую часть работы мы завершили. Пару слов о нагиосе как о системе.
Все конфигурации как и везде осуществляются через конфиги .cfg в конфигурационных папках нагиоса:
/usr/local/nagios/etc/

Любые хосты, как и любые процедуры для их мониторинга описываются через эти конфиги.
Из основных, которые вам 100% пригодятся —
hostgroups_nagios2.cfg
extinfo_nagios2.cfg

В первом файле — хосты объединяются в группы мониторинга, по которым потом можно будет упорядочивать просмотр
Во втором — хостгруппам можно присвоить значки, как например:
image

Иконки размером 40х40 лежат в
/usr/local/nagios/share/images/logos/

Для линуксовых систем есть куча плагинов, которыми можно мониторить систему — их все легко посмотреть в примере локалхоста, который создается автоматически. Нас же интересует мониторинг именно Windows систем.
Для него мы будем использоватьNsclient++ — его нужно установить на все хосты, которые будем мониторить. Он распространяется в пакете msi, так что его можно легко накатить через групповую политику на все машины.

Устанавливать можно в дефолтной конфигурации, т.к. вся конфигурация осуществляется через .ini файл. Единственное что нужно будет сделать — в свойствах службы NSclient (Start -> Run -> Services.msc) нужно выставить «Allow service to interact with desktop»
image

В файле NSC.ini вам нужно будет поправить несколько параметров:
allowed_hosts=192.168.2.10 ; IP адрес сервера NAGIOS
use_file=1 ; Указывает, что необходимо брать параметры из файла
port=12489 ; Номер порта (стандартный)

На этом настройка клиентов в-общем то закончена.

Настройка конфигов мониторинга:
Мне надо было мониторить большую группу (около 50) серверов с одинаковыми функиями и сервисами. Поэтому я использовал следующую структуру — хосты описаны в одном файле (пример):
define host{
 use generic-host
 host_name SHOP9
 alias SHOP 9
 address 10.0.9.25
 check_period 24x7
 check_interval 5
 retry_interval 1
}
define host{
 use generic-host
 host_name SHOP10
 alias SHOP 10
 address 10.0.10.25
 check_period 24x7
 check_interval 5
 retry_interval 1
}


Кстати пинги до хостов проверяются автоматически, когда вы хосты создаете.
Все эти сервера объединены в группу shopservers в файле hostgroups, описанном выше.
И cfg файл для описания сервисов, которые будут мониторится для группы этих хостов:
# Стандартные процедуры мониторинга (версия клиента, загрузка ЦПУ, оперативки, места на жестком диске)
define service {
 use generic-service
 hostgroup_name Shopservers
 service_description NSClient++ Version
 check_command check_nt!CLIENTVERSION
}
define service {
 use generic-service
 hostgroup_name Shopservers
 service_description Uptime
 check_command check_nt!UPTIME
}
define service {
 use generic-service
 hostgroup_name Shopservers
 service_description CPU Load
 check_command check_nt!CPULOAD!-l 5,80,90
}
define service {
 use generic-service
 hostgroup_name Shopservers
 service_description Memory Usage
 check_command check_nt!MEMUSE!-w 80 -c 90
}
define service {
 use generic-service
 hostgroup_name Shopservers
 service_description C: Drive Space
 check_command check_nt!USEDDISKSPACE!-l c -w 80 -c 90
}

# Пример мониторинга состояния службы с именем SETExchange (определяет работает ли она)

define service {
 use generic-service
 hostgroup_name Shopservers
 service_description SES Transport
 check_command check_nt!SERVICESTATE! -d SHOWALL -l SETExchange
}

# Пример мониторинга состояния процесса в памяти (определяет запущен ли ехешник, в данном случае sqlservr.exe)

define service {
 use generic-service
 hostgroup_name Shopservers
 service_description SQL Server
 check_command check_nt!PROCSTATE! -d SHOWALL -l sqlservr.exe
}


Если для какого то сервера нужно мониторить что-то отдельное — можете дописывать процедуру сразу же после описания хоста сервера в 1-м файле. Она будет действовать только для него. Т.е. у вас сначала должен идти тег
define host {} 
, а потом
define service {}


Собственно нагиосом я мониторю:
1) Пинги, телнет и ssh до маршрутизаторов Cisco 871 / 1841 / 2841
2) Пинги, телнет, ssh, вебсервер для Juniper Netscreen
3) ЦПУ, температуру, жесткий диск, оперативку, аптайм серверов, службы виндовс серверов, например Exchange и так далее
4) Состояние принтеров в локальной сети. Для сетевых HP принтеров — показывает даже состояния замятия бумаги и недостатка чернил. Весьма полезная функция.

Вот скрин одной из страниц мониторинга для примера:
image

Теоретически плагины пишутся для чего угодно, но графические решения Nagios лично мне не приглянулись, поэтому ставим Cacti!
Пакеты мы уже установили, так что включаем и конфигурим MySQL:
chkconfig mysqld on
service mysqld start
mysql_secure_installation


В конфигурации MySQL нас сначала попросят ввести рутовый пароль, его по умолчанию нет — нажимаем Enter, затем попросят его установить — устанавливайте какой вам удобно. Это понадобится вам, если вы потом решите поставить например Webmin или форум какой-то на тот же сервер.
Убираем anonymous users, на вопрос Disallow root login remotely? отвечаем no, удаляем тестовую базу и перезагружаем таблицу привилегий.
Включаем snmpd:
chkconfig snmpd on
service snmpd start


Создаем папку с кактусом:
mkdir /var/www/cacti


Скачиваем и распаковываем пакеты инсталляции кактуса:
wget <a href="http://www.cacti.net/downloads/cacti-0.8.7g.tar.gz">www.cacti.net/downloads/cacti-0.8.7g.tar.gz</a>
tar -xzvf cacti-0.8.7g.tar.gz
wget <a href="http://www.cacti.net/downloads/pia/cacti-plugin-0.8.7g-PA-v2.9.tar.gz">www.cacti.net/downloads/pia/cacti-plugin-0.8.7g-PA-v2.9.tar.gz</a>
tar -xzvf cacti-plugin-0.8.7g-PA-v2.9.tar.gz
wget <a href="http://www.cacti.net/downloads/spine/cacti-spine-0.8.7g.tar.gz">www.cacti.net/downloads/spine/cacti-spine-0.8.7g.tar.gz</a>
tar -xzvf cacti-spine-0.8.7g.tar.gz
cp -rf cacti-0.8.7g/* /var/www/cacti/


Создаем пользователя для кактуса и даем ему права:
useradd -c CactiUser -d /var/www/cacti/ -s /sbin/nologin cactiuser
chown -R cactiuser /var/www/cacti/log /var/www/cacti/rra


Создаем MySQL базу для кактуса:
mysql -u root -p


Вводим пароль рута для MySQL (тот, который вводили при конфигурации MySQL) и создаем непосредственно базу.
create database cacti;
GRANT ALL ON cacti.* TO cactiuser@localhost IDENTIFIED BY ' ВАШ ПАРОЛЬ ';
flush privileges;
quit


Даем Cacti понять, что ей нужно работать с этой базой:
mysql -u cactiuser -p cacti < /var/www/cacti/cacti.sql (Вводим ВАШ ПАРОЛЬ)


Открываем файл конфигурации:
nano /var/www/cacti/include/config.php


В нем правим пароль на тот, который вы указали, затем идем в директорию кактуса и начинаем его патчить.
cd /var/www/cacti
wget <a href="http://www.cacti.net/downloads/patches/0.8.7g/data_source_deactivate.patch">www.cacti.net/downloads/patches/0.8.7g/data_source_deactivate.patch</a>
wget <a href="http://www.cacti.net/downloads/patches/0.8.7g/graph_list_view.patch">www.cacti.net/downloads/patches/0.8.7g/graph_list_view.patch</a>
wget <a href="http://www.cacti.net/downloads/patches/0.8.7g/html_output.patch">www.cacti.net/downloads/patches/0.8.7g/html_output.patch</a>
wget <a href="http://www.cacti.net/downloads/patches/0.8.7g/ldap_group_authenication.patch">www.cacti.net/downloads/patches/0.8.7g/ldap_group_authenication.patch</a>
wget <a href="http://www.cacti.net/downloads/patches/0.8.7g/script_server_command_line_parse.patch">www.cacti.net/downloads/patches/0.8.7g/script_server_command_line_parse.patch</a>
wget <a href="http://www.cacti.net/downloads/patches/0.8.7g/ping.patch">www.cacti.net/downloads/patches/0.8.7g/ping.patch</a>
wget <a href="http://www.cacti.net/downloads/patches/0.8.7g/poller_interval.patch">www.cacti.net/downloads/patches/0.8.7g/poller_interval.patch</a>
patch -p1 -N < data_source_deactivate.patch
patch -p1 -N < graph_list_view.patch
patch -p1 -N < html_output.patch
patch -p1 -N < ldap_group_authenication.patch
patch -p1 -N < script_server_command_line_parse.patch
patch -p1 -N < ping.patch
patch -p1 -N < poller_interval.patch


Создаем файл конфигурации для апача:
nano /etc/httpd/conf.d/cacti.conf


Вот что в нем у меня:
Alias /cacti/ /var/www/cacti/
<Directory /var/www/cacti/>
 DirectoryIndex index.php
 Options -Indexes
 AllowOverride all
 order deny,allow
 allow from all
 AddType application/x-httpd-php .php
 php_flag magic_quotes_gpc on
 php_flag track_vars on


Затем открываем файл конфигурации самого apache;
nano /etc/httpd/conf.httpd.conf


Там меняем следующие строчки (у меня сервер лежит на IP 10.11.8.251)
ServerName 10.11.8.251:80

<VirtualHost 10.11.8.251:80>
 ServerAdmin root@root.root
 DocumentRoot /
 ServerName 10.11.8.251
 ErrorLog logs/dummy-host.example.com-error_log
 CustomLog logs/dummy-host.example.com-access_log common


Теперь создаем задачу для кактуса и перезагружаем apache:
nano /etc/cron.d/cacti
*/5 * * * * cactiuser php /var/www/cacti/poller.php > /dev/null 2>&1


service httpd restart


Ставим необходимые плагины:
cp cacti-plugin-arch/cacti-plugin-0.8.7g-PA-v2.9.diff /var/www/cacti/
cd /var/www/cacti/
patch -p1 -N < cacti-plugin-0.8.7g-PA-v2.9.diff


Теперь открываем /var/www/cacti/include/config.php
nano /var/www/cacti/include/config.php


И правим в нем строчку
$url_path = "/";
на
$url_path = "/cacti/"


Импортируем базу данных плагина в нашу MySQL, вводим ВАШ ПАРОЛЬ.
mysql -u cactiuser -p cacti < /root/cacti-plugin-arch/pa.sql


Ставим Spine (чтоб графики были красивее и плавнее обрабатывались)
cd /root/cacti-spine-0.8.7g
./configure --prefix=
make
make install
mv /etc/spine.conf.dist /etc/spine.conf


Редактируем файл его конфигурации:
nano mv /etc/spine.conf.dist /etc/spine.conf


Он должен быть вот такой:
DB_Host localhost
DB_Database cacti
DB_User cactiuser
DB_Pass ВАШ ПАРОЛЬ
DB_Port 3306
DB_PreG 0


Заходим на веб страницу:
server_ip/cacti/
Инсталлируем кактус (жмем next -> next -> finish)
Логинимся и меняем пароль на свой:
login:admin
password: admin

Заходим в User Management, ставим галочку на Plugin Management

Заходим в Settings -> Paths и в поле Spine Puller File Path вводим:
/bin/spine


Потом заходим в Poller и выбираем там Poller Type — Spine

Теперь ставим несколько нужных плагинов (settings, monitor, discovery, thold, aggregate, rddclean) которые нам будут помогать (более подробно можно на сайте docs.cacti.net прочитать для чего они нужны) и самое главное ради чего лично я все это затевал — weathermap:
cd /var/www/cacti/plugins
wget <a href="http://docs.cacti.net/_media/plugin">docs.cacti.net/_media/plugin</a>:settings-v0.7-1.tgz
wget <a href="http://www.network-weathermap.com/files/php-weathermap-0.97a.zip">www.network-weathermap.com/files/php-weathermap-0.97a.zip</a>
wget <a href="http://docs.cacti.net/_media/plugin">docs.cacti.net/_media/plugin</a>:aggregate-v0.75.tgz
wget <a href="http://cactiusers.org/downloads/discovery.zip">cactiusers.org/downloads/discovery.zip</a>
wget <a href="http://cactiusers.org/downloads/monitor.tar.gz">cactiusers.org/downloads/monitor.tar.gz</a>
wget <a href="http://cactiusers.org/downloads/thold.tar.gz">cactiusers.org/downloads/thold.tar.gz</a>
wget <a href="http://docs.cacti.net/_media/plugin">docs.cacti.net/_media/plugin</a>:rrdclean-v0.41.tgz


Распаковываем все для быстроты через
mc
(mc — midnight commander, он же far для linux)
Заходим в консоль кактуса в Plugin Management и устанавливаем их все.

Настройка самого мониторинга:
Предварительно включаем SNMP версии 2 на Cisco девайсах:
conf t
access-list 1 permit ИП нашего сервера
access-list 1 deny any
dialer-list 1 protocol ip permit
snmp-server community public RO 1


Во вкладке Devices создаем девайс, как пример приведем циску. Использую я snmp версии2, для мониторинга кучи устройств это проще чем третья.
Заполняем поля с IP и так далее, в поле host Template выбираем Cisco Router, в snmp — Version2.
Жмем ОК. Затем создаем графики для этого устройства с помощью соответствующей кнопки Create New Graphs
Для примера сейчас мы можем создать графики по загрузке интерфейсов трафиком и загрузке CPU:
image

Выглядеть они будут вот так. Правда появятся они не сразу, а как только CRON начнет отрабатывать задание, возможно придется 5-10 минут подождать. Для их отображения в меню Graph Trees нужно добавить в дерево графиков соответствующий хост, или отдельный график. Там все интуитивно понятно.
Теперь о карте сети, а конкретно о плагине Weathermap. С его помощью делается например вот такая карта сети:
image

На ней можно практически в режиме реального времени посмотреть процентную загрузку интерфейсов, пингов, всего чего захотите.
По кликам на стрелочки и устройства можно открыть привязанные к ним графики.
Для того, чтобы пользоваться всем этим добром нужно в User Management дать права на создание и редактирование карт и дать права веб юзеру на файлы самих карт.
chmod -R 777 /var/www/cacti/plugins/weathermap/


Редактирование и создание карт производится из встроенного редактора: адрес_кактуса/plugins/weathermap/editor.phpДля отображения карт из под админа зайдите в Console -> weathermaps и поставьте галочки на нужных картах.
Рекомендую сначала сделать основную схему, потом уже баловаться с фонами, цветами и так далее. И почаще бекапить карту, т.к. эдитор достаточно глючный.

Напоследок поделюсь также одним шаблоном для отслеживания пингов и потерь до оборудования:

forums.cacti.net/download/file.php?id=3436&sid=f9e64dce3afd9ce1bdc4065e3b8259da
Импортировать его можно в разделе Console -> Import Templates

Выглядит примерно вот так:
image

Более подробно по настройкам самих систем естественно в мануалах т.к. описывать все это можно бесконечно.

Удачи в мониторинге, и чтоб все стояло как надо.

P.S. Если копипаст wget команды ругается на ссылку — скопируйте ее в буфер вручную через правый клик и вставьте отдельно.


0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.