読者です 読者をやめる 読者になる 読者になる

nagiosのpassive checkとrsyslogを組み合わせてみた(3)

名前付きパイプの使い方について書こうと思ったのだが、先に結果のPythonスクリプト(rsyslogfifo.py)を貼っておく。

使い方としては、あらかじめ /tmp/aaa にmkfifo コマンドを実施しておく必要がある。( /tmp/aaa 経由でrsyslogからrsyslogfifo.py へのログを引き渡すため。 )

なお、起動順序があり、この順で起動を行う必要がある。
ただし、rsyslog, Nagios については、 あらかじめstopしておいて、startを行うのではなく、reload だけでもよいようである。

# mkfifo /tmp/aaa
# /etc/init.d/nagios2 start
# python /etc/nagios2/libexec/rsyslogfifo.py &
# /etc/init.d/rsyslog start


スクリプトはここからである。使用の際は、自己責任でお願いします (ry

$ cat /etc/nagios2/libexec/rsyslogfifo.py 
import sys, os,time
fipath='/tmp/aaa'

#try:
# a=os.unlink(fipath)
# a=os.mkfifo(fipath)
#except OSError, e:
# print e

f=file(fipath)
nagiosfifopath='/var/lib/nagios2/rw/nagios.cmd'
nagiosf=file(nagiosfifopath, 'w')

while True:
 st=f.readline()
 sys.stdout.write(st)
 tmp=st.split(',')
 (priority,facility,timestamp,hostname,tag,message)= (
   int(tmp[0]),int(tmp[1]),tmp[2],tmp[3],tmp[4],','.join(tmp[5:]) )
 year=int(timestamp[0:4])
 month=int(timestamp[4:6])
 day=int(timestamp[6:8])
 hour=int(timestamp[8:10])
 minute=int(timestamp[10:12])
 second=int(timestamp[12:14])
 t=time.mktime ( ( year,month,day,hour,minute,second,0,0,0 ) )

 if (priority<3):
	 sys.stdout.write('[%d] PROCESS_SERVICE_CHECK_RESULT;%s;check_log;2;%s %s' %(t, hostname, tag, message) )
	 nagiosf.write('[%d] PROCESS_SERVICE_CHECK_RESULT;%s;check_log;2;%s %s' %(t, hostname, tag, message) )
 elif (priority<5):
	 sys.stdout.write('[%d] PROCESS_SERVICE_CHECK_RESULT;%s;check_log;1;%s %s' %(t, hostname, tag, message) )
	 nagiosf.write('[%d] PROCESS_SERVICE_CHECK_RESULT;%s;check_log;1;%s %s' %(t, hostname, tag, message) )
 else:
	pass 
 sys.stdout.flush()
 nagiosf.flush()
 f.close() 
 f=file(fipath)


また、rsyslog から rsyslogfifo.py へのログ受け渡しのため、rsyslog.confについては、次の記述を加えておく。

$template preciseaaa,"%syslogpriority%,%syslogfacility%,%timereported:::date-mysql%,%HOSTNAME%,%syslogtag%,%msg%\n"
 *.*;auth,authpriv.none	  /tmp/aaa;preciseaaa

順番としては、次の順でメッセージが伝達される。

syslogメッセージ ==> rsyslog ==> rsyslogfifo.py
==> (alert, crit については CRITICAL, err, warn については、WARNとして)
==> Nagios

rsyslog, SNMPTrapを自由にNagiosに送れるようになれば、いろいろと便利そうだ。

また、実際のところLinuxでは、CRIT以上のsyslogはあまり生じないので、優先度の高いsyslogを無条件で監視にかけるのはそれほど悪くない選択肢かと思う。ただし、メッセージがあまりにも多いとNagiosの負荷が高まってしまうため、使用には注意が必要だが。。。