Ad Widget

Collapse

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

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • sersad
    Senior Member
    • May 2009
    • 518

    #1

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

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

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

    Возможно ли как-нибудь этот процесс автоматизировать?
  • ig3
    Junior Member
    • May 2009
    • 8

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

    Comment

    • codework
      Junior Member
      • May 2009
      • 6

      #3
      У меня такая же ситуация, 300 управляемых свитчей, что я сделал: Поднял на ДНС зоны для этих свитчей и написал скрипт:

      Code:
      #!/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 то можно просто с базой работать.

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

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

      Comment

      • sersad
        Senior Member
        • May 2009
        • 518

        #4
        Originally posted by codework
        У меня такая же ситуация, 300 управляемых свитчей, что я сделал: Поднял на ДНС зоны для этих свитчей и написал скрипт:
        Спасибо за скрип, обязательно попробую.

        Comment

        • ig3
          Junior Member
          • May 2009
          • 8

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

          Comment

          • dotneft
            Senior Member
            • Nov 2008
            • 699

            #6
            У меня ситуация более жестокая, чем описано здесь)

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

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

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

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

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

            Comment

            • novoselov.ai
              Senior Member
              • Jun 2009
              • 107

              #7
              Originally posted by ig3
              Вероятно его можно будет запускать и при автообнаружении хостов.
              Вот как внешний скрипт при автообнаружении сделать???

              #!/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
              Last edited by novoselov.ai; 17-06-2009, 10:03.

              Comment

              • ig3
                Junior Member
                • May 2009
                • 8

                #8
                to novoselov.ai :
                Не устаю восхищаться изяществом shell. Можно сказать, почти физически ощущается его мощь! Спасибо, большое за скрипт! Поскольку железо в группах однотипное, возможно, по аналогии, реализовать добавление обнаруженных хостов на схемы и процесс автоматизации обнаружения хостов будем считать выполненным.

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

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

                Comment

                • sersad
                  Senior Member
                  • May 2009
                  • 518

                  #9
                  novoselov.ai спасибо большой Ваш скрипт отлично работает.

                  Comment

                  Working...