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 相关文章推荐
简单解析Django框架中的表单验证
Jul 17 Python
Python实现的微信公众号群发图片与文本消息功能实例详解
Jun 30 Python
Python基于高斯消元法计算线性方程组示例
Jan 17 Python
Python中pip更新和三方插件安装说明
Jul 08 Python
Python读取stdin方法实例
May 24 Python
python可视化爬虫界面之天气查询
Jul 03 Python
python实现树的深度优先遍历与广度优先遍历详解
Oct 26 Python
python ubplot使用方法解析
Jan 10 Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
Feb 04 Python
Python plt 利用subplot 实现在一张画布同时画多张图
Feb 26 Python
用python删除文件夹中的重复图片(图片去重)
May 12 Python
Python基础之元组与文件知识总结
May 19 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实现克鲁斯卡尔算法实例解析
2014/08/22 PHP
ThinkPHP分组下自定义标签库实例
2014/11/01 PHP
php实现的debug log日志操作类实例
2016/07/12 PHP
javascript判断用户浏览器插件安装情况的代码
2011/01/01 Javascript
代码触发js事件(click、change)示例应用
2013/12/13 Javascript
一个简单的全屏图片上下打开显示网页效果示例
2014/07/08 Javascript
Javascript中常见的逻辑题和解决方法
2016/09/17 Javascript
BootStrap tab选项卡使用小结
2020/08/09 Javascript
jquery实现点击页面回到顶部
2016/11/23 Javascript
Angular的自定义指令以及实例
2016/12/26 Javascript
原生和jQuery的ajax用法详解
2017/01/23 Javascript
使用Math.max,Math.min获取数组中的最值实例
2017/04/25 Javascript
详解Angular2 之 结构型指令
2017/06/21 Javascript
vue-router权限控制(简单方式)
2018/10/29 Javascript
JS实现提示效果弹出及延迟隐藏的功能
2019/08/26 Javascript
layer的prompt弹出框,点击回车,触发确定事件的方法
2019/09/06 Javascript
[14:20]刀塔大凶女神互压各路奇葩屌丝
2014/05/16 DOTA
Python3.2模拟实现webqq登录
2016/02/15 Python
利用Python破解验证码实例详解
2016/12/08 Python
python 实现检验33品种数据是否是正态分布
2019/12/09 Python
Python startswith()和endswith() 方法原理解析
2020/04/28 Python
css3动画效果小结(推荐)
2016/07/25 HTML / CSS
快速创建 HTML5 Canvas 电信网络拓扑图的示例代码
2018/03/21 HTML / CSS
Flesh Beauty官网:露华浓集团旗下彩妆品牌
2021/02/15 全球购物
PHP开发的一般流程
2013/08/13 面试题
个人自我鉴定怎么写
2013/10/28 职场文书
人力资源部培训专员岗位职责
2014/01/02 职场文书
领导视察欢迎词
2014/01/15 职场文书
学生个人自我鉴定
2014/03/26 职场文书
文体活动总结
2015/02/04 职场文书
天鹅湖观后感
2015/06/09 职场文书
2019财务管理制度最新范本!
2019/07/09 职场文书
pytorch MSELoss计算平均的实现方法
2021/05/12 Python
JavaCV实现照片马赛克效果
2022/01/22 Java/Android
Python利用Turtle绘制哆啦A梦和小猪佩奇
2022/04/04 Python
Oracle 多表查询基本语法实例
2022/04/18 Oracle