Python查看多台服务器进程的脚本分享


Posted in Python onJune 11, 2014

最近做自己开发用相关服务的一个checklist,就写了这个脚本,用来在跳板机去检查各个服务器上面的相关服务是否正常

使用expect登录每个机器(因为安全问题,不能直接使用ssh信任),然后根据yaml文件的配置读取服务名字以及启动的进程数量 去检查每个服务是否正常 PS:难点是没有用端口转发也只有普通用户权限

checklist.py

#coding=utf-8
import sys
#因为我这个脚本要让很多人能运行,但是不能给他们看见我的密码算法,所以是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
import yaml
import pexpect
dataDict = yaml.load(open('/tmp/config.yaml')) #将我的yaml配置load进来
def myprint(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)
def main():
    list = ['g', 'b', 'y', 'gb', 'p']
    light = 0
    for k in dataDict:
        if k.startswith('bj-'):
        color = list[light%5] #根据服务器对颜色轮循
            SERVER = dataDict[k]
        #我这是使用了-F 是因为我没有root权限不能修改hosts文件,但是我在config.yaml使用了别名,
        而这个定义就是自定义了sshconfig,默认是~/.ssh/config
        child = pexpect.spawn('ssh -F /tmp/sshconfig dongwm@{0}'.format(SERVER['host']))
        #因为有其他用户,可能他还没有链接过某服务器,最开始会让你确认服务器标识,需要点yes
        f = child.expect(['Password: ', 'password: ', 'continue connecting (yes/no)?'])
        if f == 2:
            #当这个flag为2  表示那个用户没有登录过某服务器
            child.sendline('yes')
            child.expect('password:')
            child.sendline('{0}'.format(mypasswd(SERVER['host']))) #mypasswd是加密我服务器权限的函数,每个服务器密码不同
        if f == 1:
            child.sendline('{0}'.format(mypasswd(SERVER['host'])))
        child.expect('~')
        for service in SERVER['service']:
        flag = 0
        #我在配置里面会加服务,一般会指定服务的进程数来对比是否正常
        if isinstance(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 -v grep|wc -l'.format(
            service))
            child.readline()
            #进程数
            pro_num = child.readline().split('\r\n')[0]
        if int(pro_num) == num or flag:
            #进程数符合配置标注的数值
            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()

config.yaml 我这里只截取了其中一段

bj-2:
  host: s233 #这个s233在sshconfig指定
  ip: XXX.XXX.XXX.233 #只是为了显示出ip 好确认
  service: #服务load后是一个列表
  #给XX用
  - nginx: 5
  - uwsgi: 25
  - supervisord: 1
  #给本机XX提供mysql服务
  - mysql: 3 #django
  #给本机XX提供XX
  - celery: 12 
  #给本机XX提供XX
  - rabbitmq: 9
  - redis: 1
  - mongod: 2
Python 相关文章推荐
python的三目运算符和not in运算符使用示例
Mar 03 Python
python单线程实现多个定时器示例
Mar 30 Python
介绍Python中的一些高级编程技巧
Apr 02 Python
Python中zfill()方法的使用教程
May 20 Python
python实现域名系统(DNS)正向查询的方法
Apr 19 Python
python实现可以断点续传和并发的ftp程序
Sep 13 Python
Django如何实现内容缓存示例详解
Sep 24 Python
Python判断文件和字符串编码类型的实例
Dec 21 Python
Python简单定义与使用二叉树示例
May 11 Python
Python实现直方图均衡基本原理解析
Aug 08 Python
python scrapy重复执行实现代码详解
Dec 28 Python
再谈python_tkinter弹出对话框创建
Mar 20 Python
Python SQLite3数据库操作类分享
Jun 10 #Python
Python不规范的日期字符串处理类
Jun 10 #Python
Python ORM框架SQLAlchemy学习笔记之数据查询实例
Jun 10 #Python
Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
Jun 10 #Python
Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍
Jun 10 #Python
Python ORM框架SQLAlchemy学习笔记之关系映射实例
Jun 10 #Python
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
Jun 10 #Python
You might like
destoon实现不同会员组公司名称显示不同的颜色的方法
2014/08/22 PHP
javascript 无提示关闭窗口脚本
2009/08/17 Javascript
鼠标左键单击冲突的问题解决方法(防止冒泡)
2014/05/14 Javascript
jquery动态添加元素事件失效问题解决方法
2014/05/23 Javascript
利用javascript实现全部删或清空所选的操作
2014/05/27 Javascript
jQueryUI DatePicker 添加时分秒
2016/06/04 Javascript
jQuery插件扩展操作入门示例
2017/01/16 Javascript
vue.js事件处理器是什么
2017/03/20 Javascript
vue.js 使用v-if v-else发现没有执行解决办法
2017/05/15 Javascript
Angular使用 ng-img-max 调整浏览器中的图片的示例代码
2017/08/17 Javascript
layui 给数据表格加序号的方法
2018/08/20 Javascript
Python 调用VC++的动态链接库(DLL)
2008/09/06 Python
python通过urllib2获取带有中文参数url内容的方法
2015/03/13 Python
python如何重载模块实例解析
2018/01/25 Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
2019/01/05 Python
python ddt数据驱动最简实例代码
2019/02/22 Python
python3 自动识别usb连接状态,即对usb重连的判断方法
2019/07/03 Python
PyTorch实现AlexNet示例
2020/01/14 Python
pandas中ix的使用详细讲解
2020/03/09 Python
Python3以GitHub为例来实现模拟登录和爬取的实例讲解
2020/07/30 Python
解决使用Pandas 读取超过65536行的Excel文件问题
2020/11/10 Python
python 发送邮件的四种方法汇总
2020/12/02 Python
传统HTML页面实现模块化加载的方法
2018/10/15 HTML / CSS
日本最新流行服饰网购:Nissen
2016/07/24 全球购物
英国大码女性时装零售商:Evans
2018/08/29 全球购物
市场营销个人求职信范文
2014/02/02 职场文书
三月法制宣传月活动总结
2014/07/03 职场文书
关于感恩的演讲稿500字
2014/08/26 职场文书
刑事辩护授权委托书格式
2014/10/13 职场文书
学生上课迟到检讨书
2015/01/01 职场文书
一年级数学上册复习计划
2015/01/17 职场文书
大卫科波菲尔读书笔记
2015/06/30 职场文书
重阳节简报
2015/07/20 职场文书
担保书格式范文
2015/09/22 职场文书
导游词之西安骊山
2019/12/20 职场文书
MySQL中连接查询和子查询的问题
2021/09/04 MySQL