Python查看多台服务器进程的脚本分享
最近做自己开发用相关服务的一个checklist,就写了这个脚本,用来在跳板机去检查各个服务器上面的相关服务是否正常
使用expect登录每个机器(因为安全问题,不能直接使用ssh信任),然后根据yaml文件的配置读取服务名字以及启动的进程数量去检查每个服务是否正常PS:难点是没有用端口转发也只有普通用户权限
checklist.py
#coding=utf-8 importsys #因为我这个脚本要让很多人能运行,但是不能给他们看见我的密码算法,所以是pyc #我这个脚本要给很多其他普通用户去用,是用我的ssh登录操作,不能放在我的home目录,所以放在tmp sys.path.append('/tmp/local/lib/python2.6/site-packages/PyYAML-3.10-py2.6-linux-x86_64.egg')#依赖yaml sys.path.append('/tmp/local/lib/python2.6/site-packages/pexpect-2.4-py2.6.egg')#依赖pexpect importyaml importpexpect dataDict=yaml.load(open('/tmp/config.yaml'))#将我的yaml配置load进来
defmyprint(color,mes):#以前写的一个终端彩色打印的函数 '''使用ANSI控制码终端显示彩色''' d=dict(r=31,g=32,gb=36,y=33,b=34,p=35,o=37) color="\x1B[%d;%dm"%(1,d[color]) print"%s%s\x1B[0m"%(color,mes)
defmain(): list=['g','b','y','gb','p'] light=0 forkindataDict: ifk.startswith('bj-'): color=list[light%5]#根据服务器对颜色轮循 SERVER=dataDict[k] #我这是使用了-F是因为我没有root权限不能修改hosts文件,但是我在config.yaml使用了别名, 而这个定义就是自定义了sshconfig,默认是~/.ssh/config child=pexpect.spawn('ssh-F/tmp/sshconfigdongwm@{0}'.format(SERVER['host'])) #因为有其他用户,可能他还没有链接过某服务器,最开始会让你确认服务器标识,需要点yes f=child.expect(['Password:','password:','continueconnecting(yes/no)?']) iff==2: #当这个flag为2 表示那个用户没有登录过某服务器 child.sendline('yes') child.expect('password:') child.sendline('{0}'.format(mypasswd(SERVER['host'])))#mypasswd是加密我服务器权限的函数,每个服务器密码不同 iff==1: child.sendline('{0}'.format(mypasswd(SERVER['host']))) child.expect('~') forserviceinSERVER['service']: flag=0 #我在配置里面会加服务,一般会指定服务的进程数来对比是否正常 ifisinstance(service,dict): data=service.items()[0] service=data[0] num=data[1] else: #假如我在配置只指定服务,不指定进程数,那么只要确定跑了进程不在乎进程数 num=0 flag=1 child.expect('~') child.sendline('ps-ef|grep{0}|grep-vgrep|wc-l'.format( service)) child.readline() #进程数 pro_num=child.readline().split('\r\n')[0] ifint(pro_num)==numorflag: #进程数符合配置标注的数值 myprint(color,'[{0}] [{1}] [{2}] [{3}]'.format(k.center(12), SERVER['ip'].center(14),service.center(20),'ok'.center(4))) else: myprint('r','[{0}] [{1}] [{2}] [{3}] [{4}!={5}]'.format(k.center(12), SERVER['ip'].center(14),service.center(20),'fail', pro_num,num)) light+=1 child.sendline('exit')
if__name__=='__main__': main()