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的Flask站点中集成xhEditor文本编辑器的教程
Jun 13 Python
Python操作使用MySQL数据库的实例代码
May 25 Python
python+selenium实现登录账户后自动点击的示例
Dec 22 Python
Python获取当前公网ip并自动断开宽带连接实例代码
Jan 12 Python
python3 flask实现文件上传功能
Mar 20 Python
pymongo中聚合查询的使用方法
Mar 22 Python
python字符串替换re.sub()实例解析
Feb 09 Python
Python3操作YAML文件格式方法解析
Apr 10 Python
Python urllib.request对象案例解析
May 11 Python
如何理解python中数字列表
May 29 Python
python 无损批量压缩图片(支持保留图片信息)的示例
Sep 22 Python
Python读取多列数据以及用matplotlib制作图表方法实例
Sep 23 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
Ajax+PHP 边学边练 之二 实例
2009/11/24 PHP
PHP面向对象——访问修饰符介绍
2012/11/08 PHP
深入探讨:Nginx 502 Bad Gateway错误的解决方法
2013/06/03 PHP
php 流程控制switch的简单实例
2016/06/07 PHP
在textarea中屏蔽js的某个function的javascript代码
2007/04/20 Javascript
使用Script元素发送JSONP请求的方法
2016/06/12 Javascript
浅谈在js传递参数中含加号(+)的处理方式
2016/10/11 Javascript
简单理解js的冒泡排序
2016/12/19 Javascript
JS实现HTML标签转义及反转义
2020/04/14 Javascript
JS实现发送短信验证后按钮倒计时功能(防止刷新倒计时失效)
2017/07/07 Javascript
ECMAscript 变量作用域总结概括
2017/08/18 Javascript
angularJs在多个控制器中共享服务数据的方法
2018/09/30 Javascript
[51:00]Secret vs VGJ.S 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
python中threading超线程用法实例分析
2015/05/16 Python
使用Python的Flask框架表单插件Flask-WTF实现Web登录验证
2016/07/12 Python
解决pyqt中ui编译成窗体.py中文乱码的问题
2016/12/23 Python
pandas 数据实现行间计算的方法
2018/06/08 Python
python统计多维数组的行数和列数实例
2018/06/23 Python
使用Flask集成bootstrap的方法
2018/07/24 Python
python MNIST手写识别数据调用API的方法
2018/08/08 Python
Python切片操作去除字符串首尾的空格
2019/04/22 Python
PyQt5+Caffe+Opencv搭建人脸识别登录界面
2019/08/28 Python
Python基于Tensor FLow的图像处理操作详解
2020/01/15 Python
python实现udp传输图片功能
2020/03/20 Python
基于Keras中Conv1D和Conv2D的区别说明
2020/06/19 Python
基于CSS3 animation动画属性实现轮播图效果
2017/09/12 HTML / CSS
英国标志性生活方式品牌:Skinnydip London
2019/12/15 全球购物
土木工程应届生求职信
2013/10/31 职场文书
党章培训心得体会
2014/09/04 职场文书
2014年保卫工作总结
2014/12/05 职场文书
婚礼新人答谢词
2015/01/04 职场文书
创业计划书之宠物店
2019/09/19 职场文书
Nginx解决前端访问资源跨域问题的方法详解
2021/03/31 Servers
python实现层次聚类的方法
2021/11/01 Python
Python函数对象与闭包函数
2022/04/13 Python
详解SQL报错盲注
2022/07/23 SQL Server