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复制目录结构脚本代码分享
Mar 06 Python
Python数据分析之真实IP请求Pandas详解
Nov 18 Python
numpy linalg模块的具体使用方法
May 26 Python
pytorch下大型数据集(大型图片)的导入方式
Jan 08 Python
python实现飞机大战游戏(pygame版)
Oct 26 Python
Python ini文件常用操作方法解析
Apr 26 Python
利用python绘制中国地图(含省界、河流等)
Sep 21 Python
python 如何实现遗传算法
Sep 22 Python
如何使用python写截屏小工具
Sep 29 Python
Python下载的11种姿势(小结)
Nov 18 Python
python 如何对logging日志封装
Dec 02 Python
用Python实现Newton插值法
Apr 17 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与MySQL开发中页面出现乱码的一种解决方法
2007/07/29 PHP
PHP图像处理之使用imagecolorallocate()函数设置颜色例子
2014/11/19 PHP
如何在旧的PHP系统中使用PHP 5.3之后的库
2015/12/02 PHP
Yii2框架redis基本应用示例
2018/07/13 PHP
iis6+javascript Add an Extension File
2007/06/13 Javascript
ExtJs使用总结(非常详细)
2012/03/22 Javascript
JavaScript代码编写中各种各样的坑和填坑方法
2014/06/06 Javascript
js中匿名函数的创建与调用方法分析
2014/12/19 Javascript
JS动态显示表格上下frame的方法
2015/03/31 Javascript
JavaScript实现点击单元格改变背景色的方法
2016/02/12 Javascript
JavaScript弹出对话框的三种方式
2016/03/23 Javascript
微信小程序 Record API详解及实例代码
2016/09/30 Javascript
纯js实现html转pdf的简单实例(推荐)
2017/02/16 Javascript
Vue加载json文件的方法简单示例
2019/01/28 Javascript
javascript面向对象三大特征之封装实例详解
2019/07/24 Javascript
JS事件流与事件处理程序实例分析
2019/08/16 Javascript
vuejs中父子组件之间通信方法实例详解
2020/01/17 Javascript
node.js使用http模块创建服务器和客户端完整示例
2020/02/10 Javascript
vue+ElementUI 关闭对话框清空验证,清除form表单的操作
2020/08/06 Javascript
[18:32]DOTA2 HEROS教学视频教你分分钟做大人-谜团
2014/06/12 DOTA
python实现人脸识别代码
2017/11/08 Python
对web.py设置favicon.ico的方法详解
2018/12/04 Python
Python搭建Spark分布式集群环境
2019/07/05 Python
浅谈Python中(&,|)和(and,or)之间的区别
2019/08/07 Python
python numpy 矩阵堆叠实例
2020/01/17 Python
python把一个字符串切开的实例方法
2020/09/27 Python
html5 offlline 缓存使用示例
2013/06/24 HTML / CSS
Weekendesk意大利:探索多种引人入胜的周末主题
2016/10/14 全球购物
什么是servlet
2012/05/08 面试题
手工社团活动方案
2014/02/17 职场文书
初二学生评语大全
2014/12/26 职场文书
加班费申请报告
2015/05/15 职场文书
行政撤诉申请书
2015/05/18 职场文书
证婚人婚礼致辞
2015/07/28 职场文书
python神经网络学习 使用Keras进行简单分类
2022/05/04 Python
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
2023/05/08 MySQL