PDA

View Full Version : Автозаполнение нostname данных железки


sersad
11-06-2009, 18:24
Есть много однотипного железа, и по определенному oid они возвращают свое имя. Как можно сделать чтобы полученное значение автоматически подставлялось в имя хоста - {HOSTNAME}. Все железки находятся обнаружением.

Поиск по форуму мне ничего не дал (может не правильно сформулировал запросы). Гугл на это тоже молчит.

Возможно ли как-нибудь этот процесс автоматизировать?

ig3
13-06-2009, 09:29
Полностью поддерживаю автора этого вопроса!
Конечно, можно, с помощью скрипта, при обнаружении вписывать найденные хосты в DNS или в /etc/hosts, но вопрос этим не исчерпывается, т.к. в мониторинге, в качестве узла сети указывается его ip-адрес, а не DNS-имя.
Может кто уже решал эту задачу? Как с помощью штатных средств заббикс записать в {HOSTNAME}, что либо отличное от ip-адреса, например значение возвращаемого OID? Или, может есть возможность настроить заббикс таким образом, чтобы во всех его отчетах показывалось совместно с ip-адресом и его DNS-имя? Какие могут быть ещё решения?

codework
15-06-2009, 10:32
У меня такая же ситуация, 300 управляемых свитчей, что я сделал: Поднял на ДНС зоны для этих свитчей и написал скрипт:


#!/usr/bin/perl

use Net::DNS;
use Net::SNMP;
use strict;
use Socket;
use DBI;

my $update;
my $res;
my $reply;

my $drh = DBI->install_driver('mysql');
my $dsn = "dbi:mysql:zabbix:localhost:3306";
my $dbh = DBI->connect($dsn, "zabbix", "password");

for (my $i = 0; $i <= 1; $i++)
{
for (my $n = 1; $n <= 254; $n++)
{
my $host = "192.168.$i.$n";

my ($session, $error)=Net::SNMP->session(hostname=>$host, community=>'public', version=>'2', timeout=>'3', retries=>'2');

if (defined($session))
{
my $sysLocation = '.1.3.6.1.2.1.1.6.0';

my $result = $session->get_request(varbindlist => [$sysLocation]);

if (defined($result))
{
my $iaddr = inet_aton($host);
my $name = gethostbyaddr($iaddr, AF_INET);
my $reverse = join( '.', reverse( split /\./, $host )).'.in-addr.arpa';

if (defined($name))
{
$update = Net::DNS::Update->new('net.local');
$update->push(pre=>yxrrset("$name A"));
$update->push(update=>rr_del("$name A"));

$res = Net::DNS::Resolver->new;
$res->nameservers('127.0.0.1');
$reply = $res->send($update);

my $update = Net::DNS::Update->new('168.192.in-addr.arpa');
$update->push(pre=>yxrrset("$reverse PTR"));
$update->push(update=>rr_del("$reverse PTR"));

my $res = Net::DNS::Resolver->new;
$res->nameservers('127.0.0.1');
my $reply = $res->send($update);
}


my $Location = $result->{$sysLocation};

print "$Location\n";

$Location =~ s/ /-/g;
$Location =~ s/\.//g;
$Location =~ s/\,//g;

if ($Location)
{
$update = Net::DNS::Update->new('net.local');
$update->push(pre => nxrrset(".net.local. A"));
$update->push(update => rr_add("$Location.brevis.local. A $host"));

$res = Net::DNS::Resolver->new;
$res->nameservers('127.0.0.1');

$reply = $res->send($update);

$update = Net::DNS::Update->new('168.192.in-addr.arpa');
$update->push(pre => nxrrset("$reverse PTR"));
$update->push(update => rr_add("$reverse. IN PTR $Location.brevis.local."));

$res = Net::DNS::Resolver->new;
$res->nameservers('127.0.0.1');

$reply = $res->send($update);


$dbh->do("UPDATE hosts SET host='$Location' WHERE ip='$host'");
}
}
$session->close;
}
}
}

exit 0;



Что делает скрипт, сканирует диапазон адресов на предмет наличия ответа по снмп, берет местоположение свитча и обновляет DNS зоны в соответствии с местоположением свитча, т.к. zabbix периодически смотрит обратную зону. Также коннектимся к базе zabbix и обновляем hostname. Если не надо DNS то можно просто с базой работать.

Запускается раз в сутки, и все работает как надо.

Других вариантов нет, задавал вопрос тут на форуме, даже никто не ответил. :)

sersad
15-06-2009, 10:39
У меня такая же ситуация, 300 управляемых свитчей, что я сделал: Поднял на ДНС зоны для этих свитчей и написал скрипт:

Спасибо за скрип, обязательно попробую.

ig3
15-06-2009, 15:36
Да, отличная идея! Мысль простая и ясная. Ведь и правда, можно же писать и напрямую в базу, обходя фронтенд. Большое спасибо! Остаётся только отследить, чтобы не нарушить работоспособности мониторинга. Думается, здесь без ДНС не обойтись, иначе заббикс не сможет разыскать тогда хосты.
Отдельное спасибо за скрипт! Действительно ценная вещь. Вероятно его можно будет запускать и при автообнаружении хостов. Вроде-бы должно получиться. Будем делать. Ещё раз большое спасибо!

dotneft
15-06-2009, 15:54
У меня ситуация более жестокая, чем описано здесь)

Дело в том что мониторятся VOIP-шлюзы, которые вообще не имеют DNS имени, а айпи получают по dhcp:)

Написал примерно похожий скрипт с такой логикой:

1) Нашелся шлюз, проверяем на VOIP серверах его регистрацию, если зарегистрирован выдираем логин
2) Если логин в группе VOIP шлюзов уже имеется, то меняем айпи на текущий, а найденный с именем хоста удаляем
3) Если логина нет, просто меняем айпи в имени хоста на логин возвращенный VOIP-сервером

Жестоко? Да:) НО работает:)

ЗЫ: причем удаление хоста происходит вызовом функции php (аналог кнопки "Удалить") с привязкой к скриптам php frontend'а:)

novoselov.ai
15-06-2009, 18:46
Вероятно его можно будет запускать и при автообнаружении хостов.

Вот как внешний скрипт при автообнаружении сделать???

#!/bin/bash

MYSQL="mysql --connect_timeout 10 zabbix -h localhost -u zabbix --password=zabbix --skip-column-names -B -e"

$MYSQL "SELECT ip FROM hosts where ip like '192.168.120.%'" | while read line
do
arr=($line)
x=`snmpwalk -Ou -Oq -v1 -c public ${arr[0]} system.sysName.0 2> /dev/null | awk '{print$2}' | tr "[:upper:]" "[:lower:] " `
[[ -n $x ]] && $MYSQL "UPDATE hosts SET host = '$x' WHERE ip ='${arr[0]}'" && /bin/echo -e "${arr[0]}\t$x "
done

Тут подразумевается что перед выносом свитча у него в настройках указывается имя, настроено автообнаружение, и устройство добавлено. Добавляется оно с именем=IP

ig3
16-06-2009, 11:59
to novoselov.ai :
Не устаю восхищаться изяществом shell. Можно сказать, почти физически ощущается его мощь! ;) Спасибо, большое за скрипт! Поскольку железо в группах однотипное, возможно, по аналогии, реализовать добавление обнаруженных хостов на схемы и процесс автоматизации обнаружения хостов будем считать выполненным.

to dotneft :
Да, задачка у Вас, действительно, не тривиальная. В динамике перестраивать мониторинг, есть над чем поразмыслить.
Исходя из Вашего опыта, для себя делаю заметку о необходимости отслеживания ситуации, когда хост удаляется из сети. В моём случае, для начала, попробую это реализовать штатными средствами фронтенда. Спасибо!

Очень радует то, что наша веточка форума потихоньку обрастает идеями и реальными скриптами. Возможно, всё изложенное здесь, очень и очень кому-то ещё пригодится. Хорошо, когда есть возможность выбора решения под определённую задачу. И очень тяжек "глас вопиющего в пустыне", каждый сталкивался и не раз. От нас зависит в этой пустыне создать хоть небольшой оазис. ;)

sersad
21-06-2009, 02:13
novoselov.ai спасибо большой Ваш скрипт отлично работает.