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编写简单的定时器的方法
May 02 Python
总结Python中逻辑运算符的使用
May 13 Python
深入解析Python中的urllib2模块
Nov 13 Python
如何实现删除numpy.array中的行或列
May 08 Python
详解Python最长公共子串和最长公共子序列的实现
Jul 07 Python
python中的逆序遍历实例
Dec 25 Python
Python Pickle 实现在同一个文件中序列化多个对象
Dec 30 Python
pytorch下大型数据集(大型图片)的导入方式
Jan 08 Python
Tensorflow限制CPU个数实例
Feb 06 Python
Pytorch maxpool的ceil_mode用法
Feb 18 Python
Java byte数组操纵方式代码实例解析
Jul 22 Python
baselines示例程序train_cartpole.py的ImportError
May 20 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/07/08 PHP
PHP分页显示制作详细讲解
2008/11/19 PHP
PHP中的插件机制原理和实例
2014/07/08 PHP
PHP接收App端发送文件流的方法
2016/09/23 PHP
php删除txt文件指定行及按行读取txt文档数据的方法
2017/01/30 PHP
原生JS实现Ajax通过GET方式与PHP进行交互操作示例
2018/05/12 PHP
laravel 5.3 单用户登录简单实现方法
2019/10/14 PHP
漂亮的thinkphp 跳转页封装示例
2019/10/16 PHP
Javascript 面向对象编程(一) 封装
2011/08/28 Javascript
关于IE BUG与字符串截取substr的解决办法
2013/04/10 Javascript
JavaScript中判断函数、变量是否存在
2015/06/10 Javascript
JS中多步骤多分步的StepJump组件实例详解
2016/04/01 Javascript
Vue.js每天必学之过渡与动画
2016/09/06 Javascript
Bootstrap警告框(Alert)插件使用方法
2017/03/21 Javascript
BetterScroll 在移动端滚动场景的应用
2017/09/18 Javascript
Vue 中axios配置实例详解
2018/07/27 Javascript
vue使用localStorage保存登录信息 适用于移动端、PC端
2019/05/27 Javascript
浅谈Vue为什么不能检测数组变动
2019/10/14 Javascript
VUE解决 v-html不能触发点击事件的问题
2019/10/28 Javascript
原生js实现照片墙效果
2020/10/13 Javascript
[03:30]DOTA2完美“圣”典精彩集锦
2016/12/27 DOTA
[36:54]Mineski vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python中set与frozenset方法和区别详解
2016/05/23 Python
Flask框架的学习指南之开发环境搭建
2016/11/20 Python
解决python selenium3启动不了firefox的问题
2018/10/13 Python
jupyter notebook 重装教程
2020/04/16 Python
如何卸载python插件
2020/07/08 Python
Python多线程的退出控制实现
2020/08/10 Python
Django restful framework生成API文档过程详解
2020/11/12 Python
详解CSS3弹性伸缩盒
2020/09/21 HTML / CSS
奥巴马演讲稿
2014/01/08 职场文书
打架检讨书300字
2014/02/02 职场文书
网页美工求职信
2014/02/15 职场文书
房屋买卖协议样本
2014/11/16 职场文书
建党伟业的观后感
2015/06/01 职场文书
2016大学生形势与政策心得体会
2016/01/12 职场文书