檢查lvs鏈接數腳本(nagios插件版)-python

目標:監控lvs的ActiveConn和InActConn鏈接數
準備工做:因爲使用ipvsadm -L -n命令查看lvs鏈接數通常配置須要root權限,因此須要使用visuo命名在/etc/sudoers中添加下行內容(注意這麼使用nagios須要是可登錄用戶):
nagios         ALL=(root)      NOPASSWD: /sbin/ipvsadm -L -n
輸入:活躍鏈接數報警值、非活躍鏈接數報警值
輸出:相關數值大於報警值則進行報警,腳本退出裝套爲2,將所需報警內容打印在stdout中。
使用方法:
./check_lvs_conn.py  -a 10000 -i 10000
可能輸出:
lvs warn!:;ip_prot:111.111.111.116:80 active_conn:16980 inact_conn:12590 
check_result函數稍做修改就能夠改爲crontab中的監控形式

#! /usr/bin/python

import subprocess
import re
import sys
import optparse

class ip_info():
    def __init__(self,ip_port,active_conn,inact_conn):
        self.ip_port=ip_port
        self.active_conn=active_conn
        self.inact_conn=inact_conn
    def __str__(self):
        return ('ip_prot:%s active_conn:%s inact_conn:%s' % (
        self.ip_port,self.active_conn,self.inact_conn))
    def str(self):
        return self.__str__()

def get_lvs_status():
	#這裏須要linux使用visudo命令爲腳本執行者執行該命令的權限
	#例如:nagios         ALL=(root)      NOPASSWD: /sbin/ipvsadm -L -n
    command=['/usr/bin/sudo','/sbin/ipvsadm','-L','-n']
    lvs_status_p=subprocess.Popen(command,stdout=subprocess.PIPE)
    return lvs_status_p.stdout

def check_lvs_status(lvs_status,warn_active_conn,warn_inact_conn):
    warn_content=list()
	# 針對ipvsadm的輸出去掉不須要處理的行
    require_pattern=re.compile('->')
    exclusive_pattern=re.compile('RemoteAddress')
    separate_pattern=re.compile('\s+')
    for line in lvs_status:
        if require_pattern.search(line) and not exclusive_pattern.search(line):
			# 2字段爲ip:port,5字段爲活躍鏈接數,6字段爲非活躍鏈接數
            info_per_line=separate_pattern.split(line)
            active_conn=int(info_per_line[5]) 
            inact_conn=int(info_per_line[6])
            if active_conn >= warn_active_conn or inact_conn >= warn_inact_conn:
                ip_port=info_per_line[2]
                info_per_line=ip_info(ip_port,active_conn,inact_conn)
                warn_content.append(info_per_line)
    return warn_content

def check_result(warn_content):
    warn_message='lvs warn!:'
    if len(warn_content):
        for warn_ip in warn_content:
            warn_message+=(';'+warn_ip.str())
        print(warn_message)
        sys.exit(2)
    else:
        sys.exit(0)

def exec_check(warn_active_conn,warn_inact_conn):
    lvs_status=get_lvs_status()
    warn_content=check_lvs_status(lvs_status,warn_active_conn,warn_inact_conn)
    check_result(warn_content)

def generate_arguments():
	#爲兼容舊版使用optparse
    parser=optparse.OptionParser()
    parser.add_option('-a',action='store',type='int',dest='warn_active_conn',help='active conn warn counts')
    parser.add_option('-i',action='store',type='int',dest='warn_inact_conn',help='inactive conn warn counts')
    (options,others)=parser.parse_args()
    return (options.warn_active_conn,options.warn_inact_conn)

if __name__ == '__main__':
    (warn_active_conn,warn_inact_conn)=generate_arguments()
    exec_check(warn_active_conn,warn_inact_conn)
附: 一次sudo /sbin/ipvsadm -L -n命令的可能輸出以下: IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags   -> RemoteAddress:Port          Forward     Weight     ActiveConn         InActConn     TCP  111.111.111.111:80 wlc   -> 111.111.111.112:80           Route           2              240                     260           -> 111.111.111.113:80           Route           2              240                     390           -> 111.111.111.114:80           Route           2              240                     280           -> 111.111.111.115:80           Route           60            6990                   1520         -> 111.111.111.116:80           Route           60            16980                12590 ... ...
相關文章
相關標籤/搜索