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 13 Python
python Django模板的使用方法(图文)
Nov 04 Python
python3批量删除豆瓣分组下的好友的实现代码
Jun 07 Python
Windows上使用virtualenv搭建Python+Flask开发环境
Jun 07 Python
Python入门之三角函数sin()函数实例详解
Nov 08 Python
python自动截取需要区域,进行图像识别的方法
May 17 Python
django解决跨域请求的问题详解
Jan 20 Python
python的pytest框架之命令行参数详解(下)
Jun 27 Python
在Python中append以及extend返回None的例子
Jul 20 Python
python 实现仿微信聊天时间格式化显示的代码
Apr 17 Python
使用python无账号无限制获取企查查信息的实例代码
Apr 17 Python
python利用文件时间批量重命名照片和视频
Feb 09 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中的字符串函数
2006/11/24 PHP
Yii入门教程之目录结构、入口文件及路由设置
2014/11/25 PHP
在php和MySql中计算时间差的方法详解
2015/03/27 PHP
PHP中is_file()函数使用指南
2015/05/08 PHP
PHP实现全角字符转为半角方法汇总
2015/07/09 PHP
php支付宝在线支付接口开发教程
2016/09/19 PHP
jQuery实现公告新闻自动滚屏效果实例代码
2016/07/14 Javascript
Nodejs抓取html页面内容(推荐)
2016/08/11 NodeJs
适用于手机端的jQuery图片滑块动画
2016/12/09 Javascript
node实现简单的反向代理服务器
2017/07/26 Javascript
详解vue项目打包后通过百度的BAE发布到网上的流程
2018/03/05 Javascript
js+css实现打字效果
2020/06/24 Javascript
微信小程序实现动态获取元素宽高的方法分析
2018/12/10 Javascript
Node.js assert断言原理与用法分析
2019/01/04 Javascript
vue+web端仿微信网页版聊天室功能
2019/04/30 Javascript
Node.js HTTP服务器中的文件、图片上传的方法
2019/09/23 Javascript
JavaScript代码模拟鼠标自动点击事件示例
2020/08/07 Javascript
跟老齐学Python之玩转字符串(1)
2014/09/14 Python
深入理解Python装饰器
2016/07/27 Python
python绘制铅球的运行轨迹代码分享
2017/11/14 Python
利用python编写一个图片主色转换的脚本
2017/12/07 Python
pandas.loc 选取指定列进行操作的实例
2018/05/18 Python
python pytest进阶之conftest.py详解
2019/06/27 Python
Django中提供的6种缓存方式详解
2019/08/05 Python
Python 基于wxpy库实现微信添加好友功能(简洁)
2019/11/29 Python
pytorch中的自定义反向传播,求导实例
2020/01/06 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
2020/03/14 Python
Python实现转换图片背景颜色代码
2020/04/30 Python
Python 解决相对路径问题:"No such file or directory"
2020/06/05 Python
CSS3中animation实现流光按钮效果
2020/12/21 HTML / CSS
Too Faced官网:美国知名彩妆品牌
2017/03/07 全球购物
美国滑雪和滑雪板商店:Buckman
2018/03/03 全球购物
超市后勤自我鉴定
2014/01/17 职场文书
优秀团员事迹材料2000字
2014/08/20 职场文书
2014年向国旗敬礼活动方案
2014/09/27 职场文书
TV动画《政宗君的复仇》第二季制作决定PV公布
2022/04/02 日漫