现在有一个运维场景是这样的,一共有三台机器,其中的1台类似是另外两台的数据中传站角色,由于业务比较特殊,要求实时能够监控这几台机器的网络连通性,如果发现有问题,就及时报警,基于以上背景,刚开始打算用shell 和telnet来实现,发现不太好用,因为要处理telnet成功后退出的问题,最后还是用了python写了一个简单的脚本实现了该功能,为方便多次使用,做成了可配置的,自带配置文件,只要配置好需要测试的机器的IP和端口,就很方便测试,功能代码如下:
#/usr/bin/env python
#author:mindg.cn
#date:2016-01-27
import socket
def check(add, port):
try:
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.settimeout(5)
sock.connect((add, port))
return True
except socket.error, e:
return False
finally:
sock.close()
if __name__ == '__main__':
import ConfigParser
iplist = []
cf = ConfigParser.ConfigParser()
cf.read('cfg.ini')
s1 = cf.items('server1')
s2 = cf.items('server2')
add1, port1 = s1[0][1], s1[1][1]
add2, port2 = s2[0][1], s2[1][1]
iplist.append((add1, port1))
iplist.append((add2, port2))
while True:
for ip, port in iplist:
stat = check(ip, int(port))
if stat != True:
print 'Found this %s server %s and port is inaccessible' % (ip, port)
# time.sleep(10)
break
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#/usr/bin/env python
#author:mindg.cn
#date:2016-01-27
importsocket
defcheck(add,port):
try:
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.settimeout(5)
sock.connect((add,port))
returnTrue
exceptsocket.error,e:
returnFalse
finally:
sock.close()
if__name__=='__main__':
importConfigParser
iplist=[]
cf=ConfigParser.ConfigParser()
cf.read('cfg.ini')
s1=cf.items('server1')
s2=cf.items('server2')
add1,port1=s1[0][1],s1[1][1]
add2,port2=s2[0][1],s2[1][1]
iplist.append((add1,port1))
iplist.append((add2,port2))
whileTrue:
forip,portiniplist:
stat=check(ip,int(port))
ifstat!=True:
print'Found this %s server %s and port is inaccessible'%(ip,port)
# time.sleep(10)
break
配置文件名称cfg.ini,格式为:
[server1]
address = ip
port = 80
[server2]
address = ip
port = 80
1
2
3
4
5
6
[server1]
address=ip
port=80
[server2]
address=ip
port=80
代码写的比较简单,只用了python的一个socket模块,核心几行解释下:
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
这行是创建TCP/IP套接字,套接字分两种,一种是基于文件型的,一种是基于网络的,比如:socket.AF_INET,就是基于网络的,网络的通讯在开始前都需要创建套接字, 这就跟电话机线插口一样,没它没法打电话,socket本身的英语解释就有插座的意思,socket.SOCK_STREAM,表示采用是TCP套接字,其实可以这么理解,STREAM单词有流的感念,类似水流的感觉,大家可以想象,既然有水流的感觉,就是不能间断,所以就是建立的TCP套接字,我一直是这么理解的,重在理解,方法随意,另外不用猜,除了TCP,对应肯定有UDP套接字,
sock.settimeout(5) #设置超时时间
sock.connect((add, port)) #建立好套接字后,connect是套接字对象的内建方法,因为python是面向对象的语言,所以这也很好理解,每个对象都会带有很多方法或属性。
其它语句就不说了,链接成功就返回True,有任何错误就返回Flase,逻辑比较简单。
程序运行后是死循环,如果发现网络出现不可访问情况,将打印出一行错误日志,具体处理的方法当然有很多了,可以发邮件,也可以发短信报警,就不多说了。