您的位置:首页 > 编程语言 > Python开发

检查lvs连接数脚本(nagios插件版)-python

2013-03-22 00:00 92 查看
目标:监控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

...

...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: