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使用scrapy抓取网站sitemap信息的方法
Apr 08 Python
python 调用HBase的简单实例
Dec 18 Python
Python 稀疏矩阵-sparse 存储和转换
May 27 Python
Python如何发布程序的详细教程
Oct 09 Python
python3使用flask编写注册post接口的方法
Dec 28 Python
python pcm音频添加头转成Wav格式文件的方法
Jan 09 Python
Linux上使用Python统计每天的键盘输入次数
Apr 17 Python
Python简易计算器制作方法代码详解
Oct 31 Python
Python将列表中的元素转化为数字并排序的示例
Dec 25 Python
在python中修改.properties文件的操作
Apr 08 Python
如何通过Python3和ssl实现加密通信功能
May 09 Python
python map比for循环快在哪
Sep 21 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结束标签的使用细节探讨及联想
2013/03/04 PHP
Yii中使用PHPExcel导出Excel的方法
2014/12/26 PHP
Yii2如何批量添加数据
2016/05/17 PHP
jquery ready()的几种实现方法小结
2010/06/18 Javascript
imgAreaSelect 中文文档帮助说明
2011/10/08 Javascript
$.get获取一个文件的内容示例代码
2013/09/11 Javascript
nodejs中转换URL字符串与查询字符串详解
2014/11/26 NodeJs
javascript实现的闭包简单实例
2015/07/17 Javascript
学习javascript面向对象 理解javascript原型和原型链
2016/01/04 Javascript
微信开发之调起摄像头、本地展示图片、上传下载图片实例
2016/12/08 Javascript
vue2.0的contextmenu右键弹出菜单的实例代码
2017/07/24 Javascript
JavaScript实现重力下落与弹性效果的方法分析
2017/12/20 Javascript
用Axios Element实现全局的请求loading的方法
2018/03/15 Javascript
vue实现通讯录功能
2018/07/14 Javascript
axios的拦截请求与响应方法
2018/08/11 Javascript
实现一个 Vue 吸顶锚点组件方法
2019/07/10 Javascript
vue中组件通信详解(父子组件, 爷孙组件, 兄弟组件)
2020/07/27 Javascript
[01:08:32]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第二场 1月18日
2021/03/11 DOTA
python中self原理实例分析
2015/04/30 Python
Python数据结构之翻转链表
2017/02/25 Python
《与孩子一起学编程》python自测题
2018/05/27 Python
python安装scipy的方法步骤
2019/06/26 Python
PyQt5使用QTimer实现电子时钟
2019/07/29 Python
django的模型类管理器——数据库操作的封装详解
2020/04/01 Python
Ubuntu20.04环境安装tensorflow2的方法步骤
2021/01/29 Python
美国受信赖的教育产品供应商:Nest Learning
2018/06/14 全球购物
美国爆米花工厂:The Popcorn Factory
2019/09/14 全球购物
入党申请人的自我鉴定
2013/12/01 职场文书
编辑找工作求职信分享
2014/01/03 职场文书
校园餐饮创业计划书
2014/01/10 职场文书
优秀党员获奖感言
2014/02/18 职场文书
施工员岗位职责
2014/03/16 职场文书
2014年大学生职业规划书:未来不是梦,只要勇敢冲!
2014/09/22 职场文书
python四个坐标点对图片区域最小外接矩形进行裁剪
2021/06/04 Python
一文彻底理解js原生语法prototype,__proto__和constructor
2021/10/24 Javascript
Windows 11要来了?微软文档揭示Win11太阳谷 / Win10有两个不同版本
2021/11/21 数码科技