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实现计算资源图标crc值的方法
Oct 05 Python
详解Python函数作用域的LEGB顺序
May 14 Python
python字典多键值及重复键值的使用方法(详解)
Oct 31 Python
Python与R语言的简要对比
Nov 14 Python
numpy排序与集合运算用法示例
Dec 15 Python
Python调用C语言的方法【基于ctypes模块】
Jan 22 Python
Python FTP两个文件夹间的同步实例代码
May 25 Python
PyQt5实现简易电子词典
Jun 25 Python
解决python flask中config配置管理的问题
Jul 26 Python
详解python路径拼接os.path.join()函数的用法
Oct 09 Python
Python Django框架防御CSRF攻击的方法分析
Oct 18 Python
python 逐步回归算法
Apr 06 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修改时间格式的代码
2011/05/29 PHP
php文件缓存类汇总
2014/11/21 PHP
php银联网页支付实现方法
2015/03/04 PHP
php通过function_exists检测函数是否存在的方法
2015/03/18 PHP
phpStudy中升级MySQL版本到5.7.17的方法步骤
2017/08/03 PHP
Laravel使用支付宝进行支付的示例代码
2017/08/16 PHP
Laravel框架基础语法与知识点整理【模板变量、输出、include引入子视图等】
2019/12/03 PHP
js png图片(有含有透明)在IE6中为什么不透明了
2010/02/07 Javascript
nodejs中使用多线程编程的方法实例
2015/03/24 NodeJs
JavaScript学习笔记整理之引用类型
2016/01/22 Javascript
利用jQuery设计一个简单的web音乐播放器的实例分享
2016/03/08 Javascript
如何利用模板将HTML从JavaScript中抽离
2016/10/08 Javascript
jQuery焦点图左右转换效果
2016/12/12 Javascript
vue双向数据绑定原理探究(附demo)
2017/01/17 Javascript
JavaScript数据结构之二叉树的遍历算法示例
2017/04/13 Javascript
Vue路由跳转问题记录详解
2017/06/15 Javascript
浅谈ECMAScript6新特性之let、const
2017/08/02 Javascript
记一次webapck4 配置文件无效的解决历程
2018/09/19 Javascript
vue实现登录页面的验证码以及验证过程解析(面向新手)
2019/08/02 Javascript
微信小程序拼接图片链接无底洞深入探究
2019/09/03 Javascript
JSONP解决JS跨域问题的实现
2020/05/25 Javascript
Python中使用copy模块实现列表(list)拷贝
2015/04/14 Python
Python中的特殊语法:filter、map、reduce、lambda介绍
2015/04/14 Python
简单介绍Python中用于求最小值的min()方法
2015/05/15 Python
Python实现复杂对象转JSON的方法示例
2017/06/22 Python
numpy.random.seed()的使用实例解析
2018/02/03 Python
Python多版本开发环境管理工具介绍
2019/07/03 Python
Python线上环境使用日志的及配置文件
2019/07/28 Python
python字符串替换re.sub()方法解析
2019/09/18 Python
在html5的Canvas上绘制椭圆的几种方法总结
2013/01/07 HTML / CSS
解决HTML5中的audio在手机端和微信端的不能自动播放问题
2019/11/04 HTML / CSS
Sarenza德国:法国最大的时尚鞋和包包网上商店
2019/06/08 全球购物
物业管理员岗位职责范文
2013/11/25 职场文书
人力资源经理自我评价
2014/01/04 职场文书
承诺书的格式范文
2014/03/28 职场文书
小程序实现筛子抽奖
2021/05/26 Javascript