Pull to refresh

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

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 http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
rpm -ivh http://rpm.livna.org/livna-release-5.rpm
rpm -ihv http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
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 http://prdownloads.sourceforge.net/sourceforge/nagios/nagios-3.2.3.tar.gz
wget http://prdownloads.sourceforge.net/sourceforge/nagiosplug/nagios-plugins-1.4.15.tar.gz
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 http://www.cacti.net/downloads/cacti-0.8.7g.tar.gz
tar -xzvf cacti-0.8.7g.tar.gz
wget http://www.cacti.net/downloads/pia/cacti-plugin-0.8.7g-PA-v2.9.tar.gz
tar -xzvf cacti-plugin-0.8.7g-PA-v2.9.tar.gz
wget http://www.cacti.net/downloads/spine/cacti-spine-0.8.7g.tar.gz
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 http://www.cacti.net/downloads/patches/0.8.7g/data_source_deactivate.patch
wget http://www.cacti.net/downloads/patches/0.8.7g/graph_list_view.patch
wget http://www.cacti.net/downloads/patches/0.8.7g/html_output.patch
wget http://www.cacti.net/downloads/patches/0.8.7g/ldap_group_authenication.patch
wget http://www.cacti.net/downloads/patches/0.8.7g/script_server_command_line_parse.patch
wget http://www.cacti.net/downloads/patches/0.8.7g/ping.patch
wget http://www.cacti.net/downloads/patches/0.8.7g/poller_interval.patch
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 http://docs.cacti.net/_media/plugin:settings-v0.7-1.tgz
wget http://www.network-weathermap.com/files/php-weathermap-0.97a.zip
wget http://docs.cacti.net/_media/plugin:aggregate-v0.75.tgz
wget http://cactiusers.org/downloads/discovery.zip
wget http://cactiusers.org/downloads/monitor.tar.gz
wget http://cactiusers.org/downloads/thold.tar.gz
wget http://docs.cacti.net/_media/plugin: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 команды ругается на ссылку — скопируйте ее в буфер вручную через правый клик и вставьте отдельно.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.