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使用MD5加密字符串示例
Aug 22 Python
使用Python操作excel文件的实例代码
Oct 15 Python
python爬虫之urllib,伪装,超时设置,异常处理的方法
Dec 19 Python
Python使用folium excel绘制point
Jan 03 Python
Python函数返回不定数量的值方法
Jan 22 Python
浅谈Python中eval的强大与危害
Mar 13 Python
pycharm 安装JPype的教程
Aug 08 Python
解析python的局部变量和全局变量
Aug 15 Python
Python中的相关分析correlation analysis的实现
Aug 29 Python
Ubuntu下Python+Flask分分钟搭建自己的服务器教程
Nov 19 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
Apr 01 Python
pytorch finetuning 自己的图片进行训练操作
Jun 05 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
PHP之COOKIE支持详解
2010/09/20 PHP
PHP Undefined index报错的修复方法
2011/07/17 PHP
通达OA公共代码 php常用检测函数
2011/12/14 PHP
PHP包含文件函数include、include_once、require、require_once区别总结
2014/04/05 PHP
DOM基础及php读取xml内容操作的方法
2015/01/23 PHP
php输出xml属性的方法
2015/03/19 PHP
使用PHP编写发红包程序
2015/07/22 PHP
php使用APC实现实时上传进度条功能
2015/10/26 PHP
详解PHP的Yii框架的运行机制及其路由功能
2016/03/17 PHP
如何用PHP做到页面注册审核
2017/03/02 PHP
php实现的数组转xml案例分析
2019/09/28 PHP
JavaScript 开发中规范性的一点感想
2009/06/23 Javascript
jQuery 可以拖动的div实现代码 脚本之家修正版
2009/06/26 Javascript
location.search在客户端获取Url参数的方法
2010/06/08 Javascript
js数字转换为float,取N位小数
2014/02/08 Javascript
AngularJS基础 ng-include 指令简单示例
2016/08/01 Javascript
AngularJS实践之使用ng-repeat中$index的注意点
2016/12/22 Javascript
js 获取图像缩放后的实际宽高,位置等信息
2017/03/07 Javascript
js判断PC端与移动端跳转
2020/12/24 Javascript
详解使用Visual Studio Code对Node.js进行断点调试
2017/09/14 Javascript
Vue2.0子同级组件之间数据交互方法
2018/02/28 Javascript
vue 简单自动补全的输入框的示例
2018/03/12 Javascript
laydate如何根据开始时间或者结束时间限制范围
2018/11/15 Javascript
JavaScript实现多个物体同时运动
2020/03/12 Javascript
微信小程序单选框自定义赋值
2020/05/26 Javascript
[03:55]2014DOTA2国际邀请赛 Fnatic经理采访赢DK在情理之中
2014/07/10 DOTA
[42:11]TNC vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
使用Python读写及压缩和解压缩文件的示例
2016/07/08 Python
利用Python如何将数据写到CSV文件中
2018/06/05 Python
浅谈PyQt5中异步刷新UI和Python多线程总结
2019/12/13 Python
Python函数默认参数常见问题及解决方案
2020/03/26 Python
估算杭州有多少软件工程师
2015/08/11 面试题
工厂实习感言
2014/01/14 职场文书
火锅店营销方案
2014/02/26 职场文书
管理标语大全
2014/06/24 职场文书
告诉你创业计划书的8个实用技巧
2019/07/12 职场文书