Информация
На главную Главная

Мой t-cards.ru
Войти Войти
Зарегистрироваться Регистрация

Разное
Форум Форум
Вернуться Форумы на t-cards.ru> Hard"n"Soft
Логин
Пароль
Регистрация Участники Поиск >> FAQ


Сообщения в теме: "Простой RSH мониторинг с базой RRD..."
29.05.2008 14:09
Admin

Регистрация: 19.04.2006
Проживание: Калуга
Сообщения: 57
По умолчаниюПростой RSH мониторинг с базой RRD

Основная идея - скрипт по крону раз в минуту выполняет многопоточный опрос всех сконфигуреных источников данных и осуществляет запись результата каждого запроса в свою ррд базу. Потом на основе этих данных можно выводить графики в соответствии с пользовательскими темплейтами их отображения.
источники хранятся в таблице следующего формата:
mysql> describe unit;
+--------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| descr | varchar(255) | YES | | NULL | |
| rrd | varchar(255) | YES | | NULL | |
| loop | int(11) | YES | | NULL | |
| lastupdate | int(11) | YES | | NULL | |
| isactive | int(11) | NO | | 1 | |
| serverid | int(11) | NO | | | |
| cmd | varchar(255) | YES | | NULL | |
| lastresult | varchar(255) | YES | | NULL | |
| updateresult | varchar(255) | YES | | NULL | |
+--------------+--------------+------+-----+---------+----------------+
10 rows in set (0.06 sec)

cmd - комманда на удалённом сервере для выполнения, это может быть полный путь к выполняемому скрипту, который возвращает одну строку с результатом запроса. Результат запроса должен совпадать с типом и количеством необходимых данных для записи в предварительно сконфигурированную RRD базу.
rrd - имя базы данных для обновления значиний.
loop - время обновления базы в секундах. Надо учитывать, что крон запускается раз в минуту. Для исключения возможности пропускания данных следует немного занижать это значение относительно цикличности в минутах. Так, к примеру, для обновления раз в минуту необходимо вписывать значение в 55 секунд.
lastupdate - время последнего обновления базы RRD
lastresult - Данные ответа сервера.
updateresult - результат записи в RRD

Необходимо также дать RSH машине, с которой будет осуществляться доступ к скриптам. Реализация данного протокола существует для всех существующих ОС, а также ряда железяк, подобно CISCO.
29.05.2008 14:25
Admin

Регистрация: 19.04.2006
Проживание: Калуга
Сообщения: 57
По умолчаниюПростой RSH мониторинг с базой RRD

пример скрипта:

#!/usr/bin/perl

use Net::Rsh;
use RRDs;
use DBI;

use strict;


my $dbuser = 'root';
my $dbpass= '';
my $db = 'mon';

my $rrdpath = '/usr/home/ro/perl/monitoring/rrd/';

my $dbh = DBI->connect("DBI:mysqlatabase=mon;host=localhost",'root','') || die;

my $a=Net::Rsh->new();

my $luser = 'ro';
my $ruser = 'ro';

my $time = time();


my $q = 'SELECT u.id, s.ip, u.cmd, u.loop, u.lastupdate FROM unit u INNER JOIN server s ON s.id = u.serverid';
my $sth = $dbh->prepare($q);
$sth->execute();
while (my $str = $sth->fetchrow_hashref())
{
if (fork() == 0)
{
if ($str->{lastupdate} + $str->{loop} > time)
{
exit;
}
my $dbc = DBI->connect("DBI:mysqlatabase=$db;host=localhost",$dbuser,$dbpass) || die;
my $t = '';
my @c;
eval
{
@c = $a->rsh($str->{ip},$luser,$ruser,$str->{cmd});
};

if ($@)
{
$t = $@;
}
else
{
if ($#c > 0)
{
for (my $i = 0; $i <= $#c; $i++)
{
$t .= $c[$i];
}
$t .= "\\n";
}
elsif ($#c == 0)
{
$t = $c[0];
}
}

$t =~ s/\\n/\\ /g;
$t =~ s/\\0//g;
$t =~ s/^\\ {1,}//g;
$t =~ s/\\ {1,}$//g;
print $str->{ip}.' \\''.$str->{cmd}."' result '$t'\\n";

RRDs::update $rrdpath.$str->{id}.'.rrd', $time.':'.$t;
my $er = RRDs::error;
if ($er)
{
$er =~ s/\\'/\\\\\\'/g;
}
$q = 'UPDATE unit SET lastupdate = '.$time.', lastresult =\\''.$t.'\\', updateresult = \\''.(($er)?$er:'OK').'\\' WHERE id = '.$str->{id};
$dbc->do($q);
open (LOG, '>>/var/log/rrd.log');
print LOG $q."\\n";
close LOG;
}
}