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の負荷が高まってしまうため、使用には注意が必要だが。。。