Ad Widget

Collapse

Как создать новый хост (api)

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • DRVTiny
    Senior Member
    • Sep 2011
    • 162

    #1

    Как создать новый хост (api)

    Пример на Perl Zabbix API (Zabipi) - в аттаче.

    Процедура/функция doCreateHostWithTmpls позволяет создать хост с произвольным количеством приатаченных к нему шаблонов и включить его в произвольное количество групп.
    При этом шаблоны и группы можно передавать как списком имён, так и списком ID-шников, а также по именам и ID-шникам вперемешку (для этого конечно у вас не должно быть групп под названием "999" или шаблонов с именами, похожими на "12345").
    Ограничение одно: имя хоста должно либо резолвится в IP-адрес само по себе, либо должно быть изначально IP-адресом.
    Сама программулина - по сути просто тест для соотв. функции.

    Questions?
    Attached Files
  • DRVTiny
    Senior Member
    • Sep 2011
    • 162

    #2
    Немного дополнил процедуру/функцию, чтобы можно было 1-м параметром передавать ссылку на список из двух элементов: технического хостнейма и "видимого". Также осталась возможность передавать только "техническое" имя строковым значением.

    Теперь процедура выглядит так:
    Code:
    sub doCreateHostWithTmpls {
     my $hostNames=shift;
     my ($hostName,$hostVisName)={ ''       =>sub { ($_[0], $_[0]) },
                                   'ARRAY'  =>sub { @{$_[0]} },
                                   'HASH'   =>sub { @{$_[0]}{qw(host name)} },
                                  }->{ref $hostNames}->($hostNames);
     my %Deps=(
      'group'    =>     {'names'=>$_[0],'zobjName'=>'hostgroup'},
      'template' =>     {'names'=>$_[1],'fldName'=>'host'},
     );
    
     my @hostIFaces=$hostName=~m/^\d{1,3}(?:.\d{1,3}){3}$/?
                    ('useip'=>1,'ip'=>$hostName,'dns'=>''):
              do {
                    return {'error'=>'Cant resolve host '.$hostName} unless my $hostAddr=host2ip($hostName);
                    ('useip'=>0,'dns'=>$hostAddr->{'name'},'ip'=>$hostAddr->{'ip'}[0])
                 };
    
     while (my ($depType,$dep)=each %Deps) {
      $dep->{'zobjs'}=[map {
       /^\d+$/?{$depType.'id'=>$_}:do{
        return {'error'=>sprintf('Cant find %s "%s", which we are depends on',$depType,$_)}
         unless my ($zobj)=@{zbx(($dep->{'zobjName'} || $depType).'.get',{'search'=>{($dep->{'fldName'} || 'name')=>$_},'searchWildcardsEnabled'=>0,'output'=>[$depType.'id']})};
        $zobj
       }
      } @{$dep->{'names'}}];
     }
    
     if ( my ($hostid)=map $_->{'hostid'},@{zbx('host.get',{'search'=>{'host'=>$hostName},'output'=>['hostid']})} ) {
     # Dummy stub. There must be some code to attach templates and groups to already existing host.
      return {'error'=>'Host '.$hostName.' already exists'};
     } else {
      my $rslt=zbx('host.create',{
        'host'=>$hostName,
        'name'=>$hostVisName,
        'groups'    =>  $Deps{'group'}{'zobjs'},
        'templates' =>  $Deps{'template'}{'zobjs'},
        'interfaces'=>[{
                      'type'=>IFACE_TYPE_ZABBIX_AGENT,
                      'main'=>1,
                      @hostIFaces,
                      'port'=>10050,
        }],
      });
      return $rslt || {'error'=>zbx_last_err()};
     };
    }
    Last edited by DRVTiny; 14-04-2016, 18:12. Reason: Был баг в коде внутри while'а

    Comment

    • DRVTiny
      Senior Member
      • Sep 2011
      • 162

      #3
      Теперь и с поддержкой proxyid, а также inventory:
      Code:
      sub doCreateHostWithTmpls {
       my $hostPars=shift;
       my ($hostName,$hostVisName,$hostProxyID,$hostInventory)=
                                   { ''       =>sub { ($_[0], $_[0]) },
                                     'ARRAY'  =>sub { @{$_[0]} },
                                     'HASH'   =>sub { @{$_[0]}{qw(host name proxyid inventory)} },
                                   }->{ref $hostPars}->($hostPars);
       my %Deps=(
        'group'    =>     {'names'=>$_[0],'zobjName'=>'hostgroup'},
        'template' =>     {'names'=>$_[1],'fldName'=>'host'},
       );
      
       my @hostIFaces=$hostName=~m/^\d{1,3}(?:.\d{1,3}){3}$/?
                      ('useip'=>1,'ip'=>$hostName,'dns'=>''):
                do {
                      return {'error'=>'Cant resolve host '.$hostName} unless my $hostAddr=host2ip($hostName);
                      ('useip'=>0,'dns'=>$hostAddr->{'name'},'ip'=>$hostAddr->{'ip'}[0])
                   };
      
       while (my ($depType,$dep)=each %Deps) {
        $dep->{'zobjs'}=[map {
         /^\d+$/?{$depType.'id'=>$_}:do{
          return {'error'=>sprintf('Cant find %s "%s", which we are depends on',$depType,$_)}
           unless my ($zobj)=@{zbx(($dep->{'zobjName'} || $depType).'.get',{'search'=>{($dep->{'fldName'} || 'name')=>$_},'searchWildcardsEnabled'=>0,'output'=>[$depType.'id']})};
          $zobj
         }
        } @{$dep->{'names'}}];
       }
       if ( my ($hostid)=map $_->{'hostid'},@{zbx('host.get',{'search'=>{'host'=>$hostName},'output'=>['hostid']})} ) {
       # Dummy stub. There must be some code to attach templates and groups to already existing host.
        return {'error'=>'Host '.$hostName.' already exists'};
       } else {
        my $rslt=zbx('host.create',{
          'host'=>$hostName,
          'name'=>$hostVisName,
          'groups'    =>  $Deps{'group'}{'zobjs'},
          'templates' =>  $Deps{'template'}{'zobjs'},
          ($hostProxyID?('proxy_hostid'=>$hostProxyID):()),
          ($hostInventory?('inventory_mode'=>0,'inventory'=>$hostInventory):()),
          'interfaces'=>[{
                        'type'=>IFACE_TYPE_ZABBIX_AGENT,
                        'main'=>1,
                        @hostIFaces,
                        'port'=>10050,
          }],
        });
        return $rslt || {'error'=>zbx_last_err()};
       };
      }
      Пример вызова:
      Code:
      my $r=doCreateHostWithTmpls({
       'host'=>$hostName,
       'name'=>'Test_'.$hostName,
       'proxyid'=>zbx('proxy.get',{'search'=>{'host'=>$proxyName},'output'=>['proxyid']})->[0]{'proxyid'},
       'inventory'=>{'macaddress_a'=>'00:11:22:33:44:55'},
      },\@groupNames,[$tmplName]);

      Comment

      Working...