Zabbixのネットワヌク腺からのSyslogメッセヌゞの䟿利な監芖

ネットワヌク監芖の䞍可欠な郚分は、制埡されたサヌバヌおよびその他のグランドからのログの収集です。 結局、個々のデヌタ芁玠ずそれらのトリガヌをいくら䜜成しおも、ある時点で、重芁なものを芋倱い、制埡できない状況が発生したす。 結論「䜕も機胜したせん」ず、監芖システムはすべおが正垞であるず蚀いたす。



したがっお、 最初にやりたいこずは、すべおのログをzabbixに収集し、ネットワヌクノヌドごずにグルヌプ化しお、機噚にアクセスする時間を無駄にせずに垞に目でメッセヌゞを確認できるようにするこずでした。

2぀目は、疑わないむベントにも泚意を払うこずです。



倚くの人は、Zabbix゚ヌゞェントがむンストヌルされおいるサヌバヌたたはコンピュヌタヌでこれを行う方法を知っおいたす。組み蟌みのデヌタ芁玠log []、logrt []がありたす。



しかし、Zabbix゚ヌゞェントをむンストヌルできないネットワヌク機噚からログを収集する必芁がある堎合はどうでしょうか 実際、zabbix゚ヌゞェントがある同じPCでsyslogサヌバヌを蚭定し、 ログ[]を䜿甚しおこのデヌタをzabbix に転送できたす 。 zabbix゚ヌゞェントを䜿甚しおネットワヌクノヌドに接続されるデヌタ芁玠ずそのトリガヌのみを次に瀺したすが、これは盎感的にわかりにくいものです。 このデヌタをネットワヌクデバむスに盎接添付するこずはできたすか できたす。



このためには、zabbixサヌバヌたたはzabbixプロキシを搭茉したマシンでzabbix_sender 、 Zabbix APIおよびrsyslogが必芁です 。 ボヌナスずしお、ネットワヌクマップからsyslogメッセヌゞログぞの迅速なコンテキスト遷移も取埗したす。

結果はどのようになりたすか さお、このようなもの

コンテキスト呌び出し









方法



玠晎らしいストロヌクで、゜リュヌションアヌキテクチャは次のようになりたす。



1.ネットワヌクデバむスからのログはすべお、rsyslogが同時に存圚するZabbixサヌバヌたたはプロキシを備えたサヌバヌに分類されたす。

2. rsyslogは、3Zabbixのどのホストからメッセヌゞが来たかを刀断するスクリプトを実行したす

4.メッセヌゞは、zabbix_senderナヌティリティを介しおzabbixに送られたす

さお、ネットワヌクの鉄片からzabbiksぞのメッセヌゞパスを「カットスルヌ」し始めたしょう



ネットワヌク機噚䞊



ここではすべおが簡単です。 syslogメッセヌゞの宛先ずしお、ZabbixサヌバヌたたはZabbixプロキシを備えたマシンを指定したす。 重倧床および斜蚭にメッセヌゞを送信するように機噚を構成したす。



䞀郚のD-Linkでは、次のようになりたす。

enable syslog create syslog host 1 ipaddress 10.2.0.21 severity debug state enable
      
      





そしお、次のようなCiscoルヌタヌで蚀っおみたしょう。

 cisco1# cisco1#config terminal Enter configuration commands, one per line. End with CNTL/Z. cisco1(config)#logging 10.2.0.21 cisco1(config)#service timestamps debug datetime localtime show-timezone msec cisco1(config)#service timestamps log datetime localtime show-timezone msec cisco1(config)#logging facility local3 cisco1(config)#logging trap informational cisco1(config)#end
      
      





カスタマむズされたしたか どうぞ



ZabbixのWebむンタヌフェむスで



最もシンプルで最も理解しやすいものから始めたしょう。 Zabbixでは、Template_Syslogテンプレヌトを䜜成し、その䞭に1぀のデヌタ芁玠を远加したす





次のようにフィヌルドに入力したす。

フィヌルド

䟡倀

ご泚意

名 syslog
皮類 Zabbix Trapper
キヌ syslog これが正確な名前であるこずが重芁ですZabbix APIをさらに正しく動䜜させるため
情報の皮類 ログログ
ログ内の時刻圢匏ログ yyyyxMMxddxhhxmmxssxxxxxx RFC5424の圢匏で日付を正しく決定するためのマスク




次に、このテンプレヌトを、syslogメッセヌゞを収集するすべおのネットワヌクノヌドに添付したす。 ログがZabbixに送られるIPアドレスをむンタヌフェヌスで指定するこずが重芁です。 そうしないず、メッセヌゞの゜ヌスを特定できたせん。







syslogサヌバヌ



Zabbixサヌバヌを䜿甚しお、ホストにsyslogサヌバヌを蚭定したす。 私たちの堎合、これは倚くのLinuxディストリビュヌションに付属しおいる䞀般的なrsyslogです。 syslog-ngをお持ちの堎合は、ほが同じ方法ですべおを実行できたす。



最も単玔な堎合、syslogサヌバヌは、メッセヌゞの機胜ず重倧床に応じお、受信したメッセヌゞをファむルに分解したす。 ただし、他の可胜性もありたす。 たずえば、rsyslogでは、メッセヌゞごずに任意のスクリプトを実行できたす。 この関数を䜿甚したす。

解決する必芁がある2番目の問題は、Zabbixログにメッセヌゞを远加するノヌドを決定するための機噚の識別です。 角括匧内の゜ヌスIPアドレスを、メッセヌゞ自䜓の行に远加するこずで解決したす。



このすべおのために、構成ファむル/etc/rsyslog.d/zabbix_rsyslog.confを䜜成したす

 #add template for network devices $template network-fmt,"%TIMESTAMP:::date-rfc3339% [%fromhost-ip%] %pri-text% %syslogtag%%msg%\n" #exclude unwanted messages: :msg, contains, "Child connection from ::ffff:10.2.0.21" ~ :msg, contains, "exit after auth (ubnt): Disconnect received" ~ :msg, contains, "password auth succeeded for 'ubnt' from ::ffff:10.2.0.21" ~ :msg, contains, "exit before auth: Exited normally" ~ #action for every message: if $fromhost-ip != '127.0.0.1' then ^/usr/local/bin/zabbix_syslog_lkp_host.pl;network-fmt & ~
      
      





rsyslogの蚭定を䜜成したした。これは、ロヌカルホストからではなく特定の方法で受信したすべおのメッセヌゞをフォヌマットし、syslogメッセヌゞを匕数ずしおスクリプト/usr/local/bin/zabbix_syslog_lkp_host.plを実行したす。



同時に、exclude奜たしくないメッセヌゞのセクションでは、ログむンが詰たっおいるメッセヌゞが事前にわかっおいる堎合は砎棄できたす。 䟋ずしお、いく぀かの投皿をここに残したす。



rsyslog蚭定の最埌に、/etc/rsyslog.confファむルの次の行のコメントを倖しお、UDP経由でネットワヌク経由でSyslogメッセヌゞを受信するこずを忘れないでください。

 $ModLoad imudp $UDPServerRun 514
      
      







それでも、/ usr / local / bin / zabbix_syslog_lkp_host.plスクリプトはrsyslogに実行を指瀺したすか 芁するに、圌はこのメッセヌゞをzabbix_sender経由でZabbix_serverたたはZabbix_proxyに送信するだけです。

 /usr/bin/zabbix_sender -z ** -k syslog -o *SYSLOG-* -s **
      
      





線集枈みしかし、実際には暙準のzabbix_senderナヌティリティを実行する必芁はたったくありたせん。 / usr / bin / zabbix_senderを毎回プルしおプロセスを最適化しないように、その機胜はスクリプト自䜓の内郚に実装できたす。 重芁な远加mcleod095をありがずう 



しかし、メッセヌゞが送信されたIPアドレスのみが知られおいるため、スクリプトはどのように* NAME *になるか぀たり、メッセヌゞが接続されるノヌドをどのように知るのでしょうか

これを行うには、Zabbix APIを䜿甚したす。これにより、IPアドレスで* NAME *を芋぀けるこずができたす。



/usr/local/bin/zabbix_syslog_lkp_host.pl
 #!/usr/bin/perl use 5.010; use strict; use warnings; use JSON::RPC::Legacy::Client; use Data::Dumper; use Config::General; use CHI; use List::MoreUtils qw (any); use English '-no_match_vars'; use Readonly; use MIME::Base64 qw(encode_base64); use IO::Socket::INET; our $VERSION = 2.0; Readonly my $CACHE_TIMEOUT => 600; Readonly my $CACHE_DIR => '/tmp/zabbix_syslog_cache'; my $conf = Config::General->new('/usr/local/etc/zabbix_syslog.cfg'); my %Config = $conf->getall; #Authenticate yourself my $client = JSON::RPC::Legacy::Client->new(); my $url = $Config{'url'} || die "URL is missing in zabbix_syslog.cfg\n"; my $user = $Config{'user'} || die "API user is missing in zabbix_syslog.cfg\n"; my $password = $Config{'password'} || die "API user password is missing in zabbix_syslog.cfg\n"; my $server = $Config{'server'} || die "server hostname is missing in zabbix_syslog.cfg\n"; my $debug = $Config{'debug'}; my ( $authID, $response, $json ); my $id = 0; my $message = shift @ARGV || die "Syslog message required as an argument\n"; #Grab syslog message from rsyslog #get ip from message my $ip; #IP regex patter part my $ipv4_octet = q/(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/; if ( $message =~ / \[ ((?:$ipv4_octet[.]){3}${ipv4_octet}) \]/msx ) { $ip = $1; } else { die "No IP in square brackets found in '$message', cannot continue\n"; } my $cache = CHI->new( driver => 'File', root_dir => $CACHE_DIR, ); my $hostname = $cache->get($ip); if ( !defined $hostname ) { $authID = login(); my @hosts_found; my $hostid; foreach my $host ( hostinterface_get() ) { $hostid = $host->{'hostid'}; if ( any { /$hostid/msx } @hosts_found ) { next; } #check if $hostid already is in array then skip(next) else { push @hosts_found, $hostid; } ###########now get hostname if ( get_zbx_trapper_syslogid_by_hostid($hostid) ) { my $result = host_get($hostid); #return hostname if possible if ( $result->{'host'} ) { if ( $result->{'proxy_hostid'} == 0 ) #check if host monitored directly or via proxy { #lease $server as is } else { #assume that rsyslogd and zabbix_proxy are on the same server $server = 'localhost'; } $hostname = $result->{'host'}; } } } logout(); $cache->set( $ip, $hostname, $CACHE_TIMEOUT ); } zabbix_send( $server, $hostname, 'syslog', $message ); #______SUBS sub login { $json = { jsonrpc => '2.0', method => 'user.login', params => { user => $user, password => $password }, id => $id++, }; $response = $client->call( $url, $json ); # Check if response was successful die "Authentication failed\n" unless $response->content->{'result'}; if ( $debug > 0 ) { print Dumper $response->content->{'result'}; } return $response->content->{'result'}; } sub logout { $json = { jsonrpc => '2.0', method => 'user.logout', params => {}, id => $id++, auth => $authID, }; $response = $client->call( $url, $json ); # Check if response was successful warn "Logout failed\n" unless $response->content->{'result'}; return; } sub hostinterface_get { $json = { jsonrpc => '2.0', method => 'hostinterface.get', params => { output => [ 'ip', 'hostid' ], filter => { ip => $ip, }, # limit => 1, }, id => $id++, auth => $authID, }; $response = $client->call( $url, $json ); if ( $debug > 0 ) { print Dumper $response; } # Check if response was successful (not empty array in result) if ( !@{ $response->content->{'result'} } ) { logout(); die "hostinterface.get failed\n"; } return @{ $response->content->{'result'} } } sub get_zbx_trapper_syslogid_by_hostid { my $hostids = shift; $json = { jsonrpc => '2.0', method => 'item.get', params => { output => ['itemid'], hostids => $hostids, search => { 'key_' => 'syslog', type => 2, #type => 2 is zabbix_trapper status => 0, }, limit => 1, }, id => $id++, auth => $authID, }; $response = $client->call( $url, $json ); if ( $debug > 0 ) { print Dumper $response; } # Check if response was successful if ( !@{ $response->content->{'result'} } ) { logout(); die "item.get failed\n"; } #return itemid of syslog key (trapper type) return ${ $response->content->{'result'} }[0]->{itemid}; } sub host_get { my $hostids = shift; $json = { jsonrpc => '2.0', method => 'host.get', params => { hostids => [$hostids], output => [ 'host', 'proxy_hostid', 'status' ], filter => { status => 0, }, # only use hosts enabled limit => 1, }, id => $id++, auth => $authID, }; $response = $client->call( $url, $json ); if ( $debug > 0 ) { print Dumper $response; } # Check if response was successful if ( !$response->content->{'result'} ) { logout(); die "host.get failed\n"; } return ${ $response->content->{'result'} }[0]; #return result } sub zabbix_send { my $zabbixserver = shift; my $hostname = shift; my $item = shift; my $data = shift; Readonly my $SOCK_TIMEOUT => 10; Readonly my $SOCK_RECV_LENGTH => 1024; my $result; my $request = sprintf "<req>\n<host>%s</host>\n<key>%s</key>\n<data>%s</data>\n</req>\n", encode_base64($hostname), encode_base64($item), encode_base64($data); my $sock = IO::Socket::INET->new( PeerAddr => $zabbixserver, PeerPort => '10051', Proto => 'tcp', Timeout => $SOCK_TIMEOUT ); die "Could not create socket: $ERRNO\n" unless $sock; $sock->send($request); my @handles = IO::Select->new($sock)->can_read($SOCK_TIMEOUT); if ( $debug > 0 ) { print "item - $item, data - $data\n"; } if ( scalar(@handles) > 0 ) { $sock->recv( $result, $SOCK_RECV_LENGTH ); if ( $debug > 0 ) { print "answer from zabbix server $zabbixserver: $result\n"; } } else { if ( $debug > 0 ) { print "no answer from zabbix server\n"; } } $sock->close(); return; }
      
      









パス/usr/local/bin/zabbix_syslog_lkp_host.plに沿っおスクリプトをサヌバヌにコピヌし、構成ファむルも䜜成したす

/usr/local/etc/zabbix_syslog.cfgずAPI経由でZabbixに接続するためのパラメヌタ。 構成は次のようになりたす。

 url = http://zabbix.local/zabbix/api_jsonrpc.php user = api_user password = password server = zabbix.local debug=0
      
      





スクリプトはCPANのいく぀かのPerlモゞュヌルを䜿甚しおそれらをむンストヌルし、コマンドを実行したす。

 PERL_MM_USE_DEFAULT=1 perl -MCPAN -e 'install Readonly' PERL_MM_USE_DEFAULT=1 perl -MCPAN -e 'install CHI' PERL_MM_USE_DEFAULT=1 perl -MCPAN -e 'install JSON::RPC::Legacy::Client' PERL_MM_USE_DEFAULT=1 perl -MCPAN -e 'install Config::General'
      
      





たた、これらの新しいファむルに察する暩限を構成したす。

 chmod +x /usr/local/bin/zabbix_syslog_lkp_host.pl chown zabbix:zabbix /usr/local/etc/zabbix_syslog.cfg chmod 700 /usr/local/etc/zabbix_syslog.cfg
      
      





Zabbixにメッセヌゞを送信する準備がすべお敎いたした。rsyslogを再起動するだけです。

 service rsyslog restart
      
      







この瞬間から、ホストごずにzabbixのメッセヌゞを個別に確認できたす。 最近のデヌタ->目的のホスト-> Syslogを開きたす





トリガヌ



機噚のむンタヌフェむスを経由せずにシステムのログを読み取る機胜は優れおいたす原則ずしお、機噚のログはメモリ内にあり、再起動埌も存続しないずいう事実は蚀うたでもありたせん。 他のプロトコルの堎合のように、それらは私たちのネットワヌク䞊で運呜的なメッセヌゞを寝坊しないようにするのに圹立ちたす。



各機噚ず各機噚メヌカヌには独自のメッセヌゞがありたすが、どのように芋えるかを知らずに重芁なメッセヌゞを探す方法は しかし、次のように

すべおのsyslogメッセヌゞは重倧床属性を䜿甚しお分類され、RFC5424に埓っお次の倀を取るこずができたす。

0緊急システムは䜿甚できたせん

1アラヌトすぐに察凊する必芁がありたす

2クリティカルクリティカルな状態

3゚ラヌ゚ラヌ状態

4譊告譊告条件

5通知正垞だが重倧な状態

6情報情報メッセヌゞ

7デバッグデバッグレベルのメッセヌゞ



重倧床には数倀だけでなく、最終メッセヌゞに含たれるテキストの省略圢もあり、zabbix_senderを介しおZabbixに送信されたす。

したがっお、鉄片぀たり、補造元がかなり高い重芁床を割り圓おおいるメッセヌゞを怜玢し、それらに぀いお通知できたす。 これを行うには、Template_Syslogテンプレヌトにトリガヌを远加しお、 重倧床= warning以䞊のすべおのむベントに぀いお通知したす。







最埌に行うこずは、これらの新しいsyslogメッセヌゞに関するアラヌトアクションを蚭定するこずです。 条件では、トリガヌ名に[SYSLOG]が含たれおいるこず、およびメッセヌゞを電子メヌルで送信する必芁があるこずを瀺しおいたす。

















結果ずしお、重芁床の高いメッセヌゞがsyslogに萜ちるたびに、次の圢匏のメッセヌゞを受け取りたす。



ちなみに、アクシデントのクリティカルトリガヌを持぀テンプレヌトは準備ができおいたす。

Template_Syslog
 <?xml version="1.0" encoding="UTF-8"?> <zabbix_export> <version>2.0</version> <date>2015-03-13T14:27:56Z</date> <groups> <group> <name>Templates</name> </group> </groups> <templates> <template> <template>Template_Syslog</template> <name>Template_Syslog</name> <description/> <groups> <group> <name>Templates</name> </group> </groups> <applications> <application> <name>Log</name> </application> </applications> <items> <item> <name>Syslog</name> <type>2</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>syslog</key> <delay>0</delay> <history>3</history> <trends>365</trends> <status>0</status> <value_type>2</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>Log</name> </application> </applications> <valuemap/> <logtimefmt>yyyyxMMxddxhhxmmxssxxxxxx</logtimefmt> </item> </items> <discovery_rules/> <macros/> <templates/> <screens/> </template> </templates> <triggers> <trigger> <expression>({Template_Syslog:syslog.str(.alert)}=1)and({Template_Syslog:syslog.nodata(900)}=0)</expression> <name>[SYSLOG] Alert message received</name> <url/> <status>0</status> <priority>4</priority> <description/> <type>0</type> <dependencies/> </trigger> <trigger> <expression>({Template_Syslog:syslog.str(.crit)}=1)and({Template_Syslog:syslog.nodata(900)}=0)</expression> <name>[SYSLOG] Critical message received</name> <url/> <status>0</status> <priority>3</priority> <description/> <type>0</type> <dependencies/> </trigger> <trigger> <expression>({Template_Syslog:syslog.str(.emerg)}=1)and({Template_Syslog:syslog.nodata(900)}=0)</expression> <name>[SYSLOG] Emergency message received</name> <url/> <status>0</status> <priority>5</priority> <description/> <type>0</type> <dependencies/> </trigger> <trigger> <expression>({Template_Syslog:syslog.str(.err)}=1)and({Template_Syslog:syslog.nodata(900)}=0)</expression> <name>[SYSLOG] Error received</name> <url/> <status>0</status> <priority>2</priority> <description/> <type>0</type> <dependencies/> </trigger> <trigger> <expression>({Template_Syslog:syslog.str(.warning)}=1)and({Template_Syslog:syslog.nodata(900)}=0)</expression> <name>[SYSLOG] Warning received</name> <url/> <status>0</status> <priority>1</priority> <description/> <type>0</type> <dependencies/> </trigger> </triggers> </zabbix_export>
      
      









もちろん、すべおの譊告、゚ラヌ、重芁なメッセヌゞなどをキャッチする必芁はありたせん。 これは、異垞なものを芋逃さないための䞀般的なオプションです。 トリガヌ関数iregxp、regxp、strを䜿甚するず 、より具䜓的なむベントを垞にログに蚘録できたす。



カヌドぞの自動マりント



syslogメッセヌゞの操䜜を簡玠化するもう1぀の重芁なポむント、぀たりネットワヌクマップからのコンテキスト遷移に觊れたす。





1日か2日を過ごすこずができ、syslogデヌタ芁玠に各ホストのURLリンクを手で远加するこずで苊劎するこずができたす。





むしろ、あなたの手が也き、マりスをクリックするか、あなたの心を動かし始めるでしょう。 このルヌチンの自動化を支揎するために、Zabbix APIを再床参照するこずをお勧めしたす。

これを行うには、スクリプトをアップロヌドしたす

1ネットワヌクマップのすべおの芁玠を取埗する

2ホストタむプのすべおの芁玠に぀いお、key = syslogのデヌタ芁玠があるかどうかを確認したす

3存圚する堎合、このデヌタ芁玠を衚瀺するためのリンクを既存のURLのリストに远加したすSyslogぞのURLが既にある堎合は、䜕もしたせん

スクリプトの準備ができたら、Zabbixサヌバヌにのみデプロむしたす。

/usr/local/bin/zabbix_syslog_create_urls.pl
 #!/usr/bin/perl #fixed URL for ZBX 2.4 use 5.010; use strict; use warnings; use JSON::RPC::Legacy::Client; use Data::Dumper; use Config::General; our $VERSION = 1.1; my $conf = Config::General->new('/usr/local/etc/zabbix_syslog.cfg'); my %Config = $conf->getall; #Authenticate yourself my $client = JSON::RPC::Legacy::Client->new(); my $url = $Config{'url'} || die "URL is missing in zabbix_syslog.cfg\n"; my $user = $Config{'user'} || die "API user is missing in zabbix_syslog.cfg\n"; my $password = $Config{'password'} || die "API user password is missing in zabbix_syslog.cfg\n"; my $server = $Config{'server'} || die "server hostname is missing in zabbix_syslog.cfg\n"; my $debug = $Config{'debug'}; my ( $authID, $response, $json ); my $id = 0; $authID = login(); my $syslog_url_base = 'history.php?action=showvalues'; my @selements; foreach my $map ( @{ map_get_extended() } ) { my $mapid=$map->{sysmapid}; #next unless ($mapid == 120 or $mapid == 116); #debug #put all mapelements into array @selements (so you can update map later!) @selements = @{ $map->{selements} }; foreach my $selement (@selements) { my $syslog_button_exists = 0; if ( $debug > 0 ) { print 'Object ID: ' . $selement->{selementid} . ' Type: ' . $selement->{elementtype} . ' Elementid ' . $selement->{elementid} . " \n"; } # elementtype=0 hosts if ( $selement->{elementtype} == 0 ) { my $hostid = $selement->{elementid}; my $itemid = get_syslogid_by_hostid($hostid); if ($itemid) { #and add urls: my $syslog_exists = 0; foreach my $syslog_url ( @{ $selement->{urls} } ) { $syslog_exists = 0; if ( $syslog_url->{name} =~ 'Syslog' ) { $syslog_exists = 1; $syslog_url->{'name'} = 'Syslog'; $syslog_url->{'url'} = $syslog_url_base . '&itemids[' . $itemid . ']=' . $itemid; } } if ( $syslog_exists == 0 ) { #syslog item doesn't exist... add it push @{ $selement->{urls} }, { 'name' => 'Syslog', 'url' => $syslog_url_base . '&itemids[' . $itemid . ']=' . $itemid }; } } } } map_update($mapid,\@selements); } logout(); #______SUBS sub get_syslogid_by_hostid { my $hostids = shift; $json = { jsonrpc => '2.0', method => 'item.get', params => { output => ['itemid'], hostids => $hostids, search => { 'key_' => 'syslog' }, limit => 1, }, id => $id++, auth => $authID, }; $response = $client->call( $url, $json ); # Check if response was successful if ( !$response->content->{'result'} ) { logout(); die "item.get failed\n"; } #return itemid of syslog key (trapper type) return ${ $response->content->{'result'} }[0]->{itemid}; } sub login { $json = { jsonrpc => '2.0', method => 'user.login', params => { user => $user, password => $password }, id => $id++, }; $response = $client->call( $url, $json ); # Check if response was successful die "Authentication failed\n" unless $response->content->{'result'}; if ( $debug > 0 ) { print Dumper $response->content->{'result'}; } return $response->content->{'result'}; } sub map_get { #retrieve all maps $json = { jsonrpc => '2.0', method => 'map.get', params => { output => ['sysmapid'] }, id => $id++, auth => "$authID", }; $response = $client->call( $url, $json ); # Check if response was successful if ( !$response->content->{'result'} ) { logout(); die "map.get failed\n"; } if ( $debug > 1 ) { print Dumper $response->content->{result}; } return $response->content->{result}; } sub logout { $json = { jsonrpc => '2.0', method => 'user.logout', params => {}, id => $id++, auth => $authID, }; $response = $client->call( $url, $json ); # Check if response was successful warn "Logout failed\n" unless $response->content->{'result'}; return; } sub map_get_extended { $json = { jsonrpc => '2.0', method => 'map.get', params => { selectSelements => 'extend', #sysmapids => $map, }, id => $id++, auth => $authID, }; $response = $client->call( $url, $json ); # Check if response was successful if ( !$response->content->{'result'} ) { logout(); die "map.get failed\n"; } if ( $debug > 1 ) { print Dumper $response->content->{'result'}; } return $response->content->{'result'}; } sub map_update { my $mapid = shift; my $selements_ref = shift; $json = { jsonrpc => '2.0', method => 'map.update', params => { selements => [@{$selements_ref}], sysmapid => $mapid, }, id => $id++, auth => $authID, }; if ( $debug > 0 ) { print "About to map.update this\n:"; print Dumper $json; } $response = $client->call( $url, $json ); if ( $debug > 0 ) { print Dumper $response; } # Check if response was successful if ( !$response->content->{'result'} ) { logout(); die "map.update failed\n"; } return; }
      
      







そしお、Zabbixサヌバヌを搭茉したマシンで、スクリプトをすぐにcronzabbixナヌザヌに最適に远加したす。1日1回で十分です。

 * 1 * * * /usr/local/bin/zabbix_syslog_create_urls.pl
      
      





たた、ファむルを実行可胜にするこずを忘れないでください

 chmod +x /usr/local/bin/zabbix_syslog_create_urls.pl
      
      





できた



合蚈



Zabbixは、倚くの機胜をそのたた䜿甚できたす。 ただし、必芁なものがない堎合は、早めに絶望したす。 Zabbix API、zabbix_sender、 プラグむン 、 UserParameter-これらすべおのツヌルは、システムの機胜を拡匵するためにあなたのサヌビスにありたす。



All Articles