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 SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)
May 06 Python
python生成随机mac地址的方法
Mar 16 Python
Python的Flask框架应用调用Redis队列数据的方法
Jun 06 Python
Django Admin实现三级联动的示例代码(省市区)
Jun 22 Python
Python Dataframe 指定多列去重、求差集的方法
Jul 10 Python
计算机二级python学习教程(3) python语言基本数据类型
May 16 Python
Python 3.6 -win64环境安装PIL模块的教程
Jun 20 Python
解决python3 安装不了PIL的问题
Aug 16 Python
Python制作简易版小工具之计算天数的实现思路
Feb 13 Python
一个入门级python爬虫教程详解
Jan 27 Python
Python中else的三种使用场景
Jun 16 Python
baselines示例程序train_cartpole.py的ImportError
May 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
《逃离塔科夫》——“萌新劝退,老手自嗨”的硬核FPS游戏
2020/04/03 其他游戏
重量级动漫纷纷停播!唯独OVERLORD第四季正在英魂之刃继续更新
2020/05/06 日漫
php中用socket模拟http中post或者get提交数据的示例代码
2013/08/08 PHP
为PHP安装imagick时出现Cannot locate header file MagickWand.h错误的解决方法
2014/11/03 PHP
yii的入口文件index.php中为什么会有这两句
2016/08/04 PHP
javascript之bind使用介绍
2011/10/09 Javascript
js实现拉伸拖动iframe的具体代码
2013/08/03 Javascript
JS实现定时自动关闭DIV层提示框的方法
2015/05/11 Javascript
基于JS实现新闻列表无缝向上滚动实例代码
2016/01/22 Javascript
AngularJS中比较两个数组是否相同
2016/08/24 Javascript
js实现碰撞检测特效代码分享
2016/10/16 Javascript
关于jquery form表单序列化的注意事项详解
2017/08/01 jQuery
php main 与 iframe 相互通讯类(js+php同域/跨域)
2017/09/14 Javascript
NodeJS加密解密及node-rsa加密解密用法详解
2018/10/12 NodeJs
NodeJs 文件系统操作模块fs使用方法详解
2018/11/26 NodeJs
微信小程序项目总结之记账小程序功能的实现(包括后端)
2019/08/20 Javascript
js时间转换毫秒的实例代码
2019/08/21 Javascript
js实现带箭头的进度流程
2020/03/26 Javascript
jQuery实现飞机大战小游戏
2020/07/05 jQuery
Python获取脚本所在目录的正确方法
2014/04/15 Python
解决Django数据库makemigrations有变化但是migrate时未变动问题
2018/05/30 Python
Python socket模块实现的udp通信功能示例
2019/04/10 Python
关于keras中keras.layers.merge的用法说明
2020/05/23 Python
宝拉珍选美国官网:Paula’s Choice美国
2018/01/07 全球购物
加拿大专业美发产品购物网站:Chatters
2021/02/28 全球购物
欧姆龙医疗欧洲有限公司:Omron Healthcare Europe B.V
2020/06/13 全球购物
DOM和JQuery对象有什么区别
2016/11/11 面试题
三年级数学教学反思
2014/01/31 职场文书
法人授权委托书范本
2014/04/04 职场文书
解除劳动合同协议书
2014/04/14 职场文书
球队口号
2014/06/18 职场文书
学生实习证明范文
2014/09/28 职场文书
有限公司股东合作协议书
2014/10/29 职场文书
2014年租房协议书范本
2014/10/30 职场文书
JavaScript高级程序设计之基本引用类型
2021/11/17 Javascript