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の勉強もかねてまたコードを書いてみようと思います。


今日はこんなところで。