pynagをつかってダウンタイム設定を一覧化する
以前からNagios(Icinga)の設定ファイルを宜しく処理してくれるパーサが欲しいなと思っていたのですが、
今回pynagというものがあることを知りました。
コマンドラインプログラムとパッケージを使ってプログラムを書く方法と2種類あります。
まだ調べ途中ですが、コンフィグ操作に関することは一通り出来る模様です。
※ソースコードを見る限り、servicedependency, hostdependency に関する操作は実装これからっぽい感じでした。。
インストール方法はここを参照してみてください。
コマンドラインで試す
今回はダウンタイムの一覧を取得できないかと調べていたところ、こんな形で実現できました。
# pynag downtime --list --cfg_file='/usr/local/icinga/etc/icinga.cfg' downtime_id host_name service_description start_time end_time
コマンドの出力結果は以下の通りです。
downtime_id host_name service_description start_time end_time -------------------------------------------------------------------------------- 580 ss-bk01 CPU 1380521064 1412064264 581 ss-bk01 Connection 1380521064 1412064264 582 ss-bk01 DISK:/ 1380521064 1412064264 583 ss-bk01 DISKI/O:/dev/sda 1380521064 1412064264 584 ss-bk01 ICMP 1380521064 1412064264 585 ss-bk01 INODE:/ 1380521064 1412064264 586 ss-bk01 LOADAVERAGE 1380521064 1412064264 587 ss-bk01 MEMORY 1380521064 1412064264 588 ss-bk01 NTP 1380521064 1412064264 589 ss-bk01 PROCESS:crond 1380521064 1412064264 590 ss-bk01 PROCESS:rsyslogd 1380521064 1412064264 591 ss-bk01 PROCESS:xinetd 1380521064 1412064264 592 ss-bk01 SSH 1380521064 1412064264 593 ss-bk01 SWAP 1380521064 1412064264 594 ss-bk01 TRAFFIC:eth0 1380521064 1412064264 595 ss-bk01 TRAFFIC:eth1 1380521064 1412064264 596 ss-db01 CPU 1380521064 1412064264 597 ss-db01 Connection 1380521064 1412064264 598 ss-db01 DISK:/ 1380521064 1412064264 599 ss-db01 DISKI/O:/dev/sda 1380521064 1412064264 600 ss-db01 ICMP 1380521064 1412064264 601 ss-db01 INODE:/ 1380521064 1412064264 602 ss-db01 LOADAVERAGE 1380521064 1412064264 603 ss-db01 MEMORY 1380521064 1412064264 604 ss-db01 NTP 1380521064 1412064264 605 ss-db01 PROCESS:crond 1380521064 1412064264 606 ss-db01 PROCESS:rsyslogd 1380521064 1412064264 607 ss-db01 PROCESS:xinetd 1380521064 1412064264 608 ss-db01 SSH 1380521064 1412064264 609 ss-db01 SWAP 1380521064 1412064264 610 ss-db01 TRAFFIC:eth0 1380521064 1412064264 611 ss-db01 TRAFFIC:eth1 1380521064 1412064264 612 ss-db02 CPU 1380521064 1412064264 613 ss-db02 Connection 1380521064 1412064264 614 ss-db02 DISK:/ 1380521064 1412064264 615 ss-db02 DISKI/O:/dev/sda 1380521064 1412064264 616 ss-db02 ICMP 1380521064 1412064264 617 ss-db02 INODE:/ 1380521064 1412064264 618 ss-db02 LOADAVERAGE 1380521064 1412064264 619 ss-db02 MEMORY 1380521064 1412064264 620 ss-db02 NTP 1380521064 1412064264 621 ss-db02 PROCESS:crond 1380521064 1412064264 622 ss-db02 PROCESS:rsyslogd 1380521064 1412064264 623 ss-db02 PROCESS:xinetd 1380521064 1412064264 624 ss-db02 SSH 1380521064 1412064264 625 ss-db02 SWAP 1380521064 1412064264 626 ss-db02 TRAFFIC:eth0 1380521064 1412064264 627 ss-db02 TRAFFIC:eth1 1380521064 1412064264 628 ss-icinga Apache:Performance 1380521064 1412064264 629 ss-icinga CPU 1380521064 1412064264 ----------50 objects matches search condition-----------------------------------
をー!と思ったのですが、ダウンタイムの開始/終了時間がUNIXタイムで出てしまうのが残念。。。
Pythonでプログラムを書いてみる
ということで、Pythonでプログラムを書いてみることにしました。
自分にとっては記念すべき初pythonプログラムです。
結果を標準出力に表示するつくりにしてしまったので、
ファイルにする場合はリダイレクトで。
(そのうちファイルに出力するように変えようと思っています)
#!/usr/bin/python import os import pynag.Model import pynag.Parsers import pynag.Utils import sys import time monitor_host_name = '%s' % os.uname()[1] icinga_cfg='/usr/local/icinga/etc/icinga.cfg' status = pynag.Parsers.status(cfg_file=icinga_cfg) status.parse() downtimes = [] downtimes += status.data.get('servicedowntime', []) downtime_list = [] for downtime in xrange(len(downtimes)): host_name = downtimes[downtime]['host_name'] service_description = downtimes[downtime]['service_description'] start_time = time.strftime("%Y/%m/%d %H:%M:%S", time.localtime(float(downtimes[downtime]['start_time']))) end_time = time.strftime("%Y/%m/%d %H:%M:%S" ,time.localtime(float(downtimes[downtime]['end_time']))) line = monitor_host_name + ',' + host_name + ',' + service_description + ',' + start_time + ',' + end_time downtime_list.append(line) for line in downtime_list: print line
実行した結果はこんな感じです。複数サーバから同様にデータを取得して、一覧化したいなと思ったこともあり、
一列目に監視サーバのホスト名を含めるようにしました。
# python check_downtime.py ss-icinga,ss-bk01,CPU,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-bk01,Connection,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-bk01,DISK:/,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-bk01,DISKI/O:/dev/sda,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-bk01,ICMP,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-bk01,INODE:/,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-bk01,LOADAVERAGE,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-bk01,MEMORY,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-bk01,NTP,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-bk01,PROCESS:crond,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-bk01,PROCESS:rsyslogd,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-bk01,PROCESS:xinetd,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-bk01,SSH,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-bk01,SWAP,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-bk01,TRAFFIC:eth0,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-bk01,TRAFFIC:eth1,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-db01,CPU,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-db01,Connection,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-db01,DISK:/,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-db01,DISKI/O:/dev/sda,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-db01,ICMP,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-db01,INODE:/,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-db01,LOADAVERAGE,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-db01,MEMORY,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-db01,NTP,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-db01,PROCESS:crond,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-db01,PROCESS:rsyslogd,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-db01,PROCESS:xinetd,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-db01,SSH,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-db01,SWAP,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-db01,TRAFFIC:eth0,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-db01,TRAFFIC:eth1,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-db02,CPU,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-db02,Connection,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-db02,DISK:/,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-db02,DISKI/O:/dev/sda,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-db02,ICMP,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-db02,INODE:/,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-db02,LOADAVERAGE,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-db02,MEMORY,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-db02,NTP,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-db02,PROCESS:crond,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-db02,PROCESS:rsyslogd,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-db02,PROCESS:xinetd,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-db02,SSH,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-db02,SWAP,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-db02,TRAFFIC:eth0,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-db02,TRAFFIC:eth1,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-icinga,Apache:Performance,2013/09/30 15:04:24,2014/09/30 17:04:24 ss-icinga,ss-icinga,CPU,2013/09/30 15:04:24,2014/09/30 17:04:24
テンプレートを使って一覧にしてみる
先に生成したCSVファイルをテンプレートに基づきHTML化してみようと思い、
もう一つプログラムを書いてみました。
#!/usr/bin/python import glob from Cheetah.Template import Template template = Template(file='/dir/downtime.tmpl') downtimes = [] for file in glob.glob('/dir/*.log'): for line in open(file, 'r'): line = line.rstrip() list = line.split(',') downtimes.append({'monitor_host_name': str(list[0]), 'host_name': str(list[1]), 'service_description': str(list[2]), 'start_time': str(list[3]), 'end_time': str(list[4])}) template.downtimes = downtimes print template
テンプレートファイルはこんな感じです。
# cat downtime.tmpl <html> <head> <title>Downtime List</title> </head> <body> <table border="1" cellpadding="5" cellspacing="0"> <tr> <th>Monitor Server</th> <th>Host Name</th> <th>Service Description</th> <th>Downtime start</th> <th>Downtime end</th> </tr> #for $downtime in $downtimes <tr> <td>$downtime['monitor_host_name']</td> <td>$downtime['host_name']</td> <td>$downtime['service_description']</td> <td>$downtime['start_time']</td> <td>$downtime['end_time']</td> </tr> #end for </table> </body> </html>
実行すると、以下のようなHTMLが標準出力に表示されます。
<html> <head> <title>Downtime List</title> </head> <body> <table border="1" cellpadding="5" cellspacing="0"> <tr> <th>Monitor Server</th> <th>Host Name</th> <th>Service Description</th> <th>Downtime start</th> <th>Downtime end</th> </tr> <tr> <td>ss-icinga</td> <td>ss-icinga</td> <td>CPU</td> <td>2013/09/30 15:04:24</td> <td>2014/09/30 17:04:24</td> </tr> <tr> <td>ss-icinga</td> <td>ss-icinga</td> <td>Apache:Performance</td> <td>2013/09/30 15:04:24</td> <td>2014/09/30 17:04:24</td> </tr> <tr> <td>ss-icinga</td> <td>ss-db02</td> <td>TRAFFIC:eth1</td> <td>2013/09/30 15:04:24</td> <td>2014/09/30 17:04:24</td> </tr> ・・・(略)・・・ <tr> <td>ss-icinga</td> <td>ss-bk01</td> <td>CPU</td> <td>2013/09/30 15:04:24</td> <td>2014/09/30 17:04:24</td> </tr> </table> </body> </html>
ブラウザで表示するとこんな感じです。
pynag自体、他にも色々出来るので、pythonの勉強もかねてまたコードを書いてみようと思います。
今日はこんなところで。