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实现爬虫下载漫画示例
Feb 16 Python
Python判断操作系统类型代码分享
Nov 22 Python
python中的字典操作及字典函数
Jan 03 Python
python实现机器人行走效果
Jan 29 Python
查看TensorFlow checkpoint文件中的变量名和对应值方法
Jun 14 Python
python-itchat 统计微信群、好友数量,及原始消息数据的实例
Feb 21 Python
详解python之heapq模块及排序操作
Apr 04 Python
用Python从0开始实现一个中文拼音输入法的思路详解
Jul 20 Python
如何用Python来理一理红楼梦里的那些关系
Aug 14 Python
python向图片里添加文字
Nov 26 Python
利用 PyCharm 实现本地代码和远端的实时同步功能
Mar 23 Python
Python爬虫过程解析之多线程获取小米应用商店数据
Nov 14 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
造就帕卡马拉的帕卡斯是怎么被发现的
2021/03/03 咖啡文化
PHP内核探索之变量
2015/12/22 PHP
PHP自定义图片缩放函数实现等比例不失真缩放的方法
2016/08/19 PHP
CI框架常用经典操作类总结(路由,伪静态,分页,session,验证码等)
2016/11/21 PHP
让iframe框架网页在任何浏览器下自动伸缩
2006/08/18 Javascript
jQuery 判断元素上是否绑定了事件
2009/10/28 Javascript
Jquery 常用方法经典总结
2010/01/28 Javascript
背景图跟随鼠标移动的Mootools插件实现代码
2011/12/12 Javascript
Chosen 基于jquery的选择框插件使用方法
2012/05/30 Javascript
js 判断上传文件大小及格式代码
2013/11/13 Javascript
基于jquery固定于顶部的导航响应浏览器滚动条事件
2014/11/02 Javascript
实现图片预加载的三大方法及优缺点分析
2014/11/19 Javascript
jquery读写cookie操作实例分析
2015/12/24 Javascript
jQuery中借助deferred来请求及判断AJAX加载的实例讲解
2016/05/24 Javascript
JavaScript知识点总结(四)之逻辑OR运算符详解
2016/05/31 Javascript
JavaScript的new date等日期函数在safari中遇到的坑
2016/10/24 Javascript
js实现下一页页码效果
2017/03/07 Javascript
vue2.0实现倒计时的插件(时间戳 刷新 跳转 都不影响)
2017/03/30 Javascript
React Native如何消除启动时白屏的方法
2017/08/08 Javascript
在vue中实现简单页面逆传值的方法
2017/11/27 Javascript
详解vue引入子组件方法
2019/02/12 Javascript
JavaScript Dom 绑定事件操作实例详解
2019/10/02 Javascript
[52:44]VGJ.T vs infamous Supermajor小组赛D组败者组第一轮 BO3 第一场 6.3
2018/06/04 DOTA
Django unittest 设置跳过某些case的方法
2018/12/26 Python
使用Python+selenium实现第一个自动化测试脚本
2020/03/17 Python
Python如何测试stdout输出
2020/08/10 Python
html5 利用canvas实现超级玛丽简单动画
2013/09/06 HTML / CSS
Otel.com:折扣酒店预订
2017/08/24 全球购物
家长评语和期望
2014/02/10 职场文书
财务工作疏忽检讨书
2014/09/11 职场文书
户籍证明格式
2014/09/15 职场文书
税务干部群众路线教育实践活动自我剖析材料
2014/09/21 职场文书
儿园租房协议书范本
2014/12/02 职场文书
竞选稿之小学班干部
2019/10/31 职场文书
Mysql binlog日志文件过大的解决
2021/10/05 MySQL
《模拟人生4》推出新补丁 “婚礼奇缘”DLC终于得到修复
2022/04/03 其他游戏