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 06 Python
Python实现基本线性数据结构
Aug 22 Python
windows下python连接oracle数据库
Jun 07 Python
Python图形绘制操作之正弦曲线实现方法分析
Dec 25 Python
python数据批量写入ScrolledText的优化方法
Oct 11 Python
PythonWeb项目Django部署在Ubuntu18.04腾讯云主机上
Apr 01 Python
详解python中的hashlib模块的使用
Apr 22 Python
详解pandas如何去掉、过滤数据集中的某些值或者某些行?
May 15 Python
使用Python计算玩彩票赢钱概率
Jun 26 Python
python使用pip安装模块出现ReadTimeoutError: HTTPSConnectionPool的解决方法
Oct 04 Python
pytorch nn.Conv2d()中的padding以及输出大小方式
Jan 10 Python
python print 格式化输出,动态指定长度的实现
Apr 12 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 变量的定义方法
2010/01/26 PHP
数据库中排序的对比及使用条件详解
2012/02/23 PHP
PHP基于GD库的缩略图生成代码(支持jpg,gif,png格式)
2014/06/19 PHP
php跨站攻击实例分析
2014/10/28 PHP
PHP中使用break跳出多重循环代码实例
2015/01/21 PHP
smarty模板引擎之配置文件数据和保留数据
2015/03/30 PHP
php函数连续调用实例分析
2015/07/30 PHP
PHP实现对二维数组某个键排序的方法
2016/09/14 PHP
JS TextArea字符串长度限制代码集合
2012/10/31 Javascript
JavaScript生成的动态下雨背景效果实现方法
2015/02/25 Javascript
JS实现文字放大效果的方法
2015/03/03 Javascript
TinyMCE提交AjaxForm获取不到数据的解决方法
2015/03/05 Javascript
JS 作用域与作用域链详解
2015/04/07 Javascript
老生常谈javascript的面向对象思想
2017/08/22 Javascript
完美解决axios跨域请求出错的问题
2018/02/05 Javascript
bootstrap treeview 树形菜单带复选框及级联选择功能
2018/06/08 Javascript
Nodejs实现多文件夹文件同步
2018/10/17 NodeJs
vue拖拽组件使用方法详解
2018/12/01 Javascript
基于javascript实现碰撞检测
2020/03/12 Javascript
python实现稀疏矩阵示例代码
2017/06/09 Python
Python 25行代码实现的RSA算法详解
2018/04/10 Python
Django+JS 实现点击头像即可更改头像的方法示例
2018/12/26 Python
python爬虫之自制英汉字典
2019/06/24 Python
python同步windows和linux文件
2019/08/29 Python
Django模板语言 Tags使用详解
2019/09/09 Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
2019/10/10 Python
Python enumerate函数遍历数据对象组合过程解析
2019/12/11 Python
django-orm F对象的使用 按照两个字段的和,乘积排序实例
2020/05/18 Python
介绍一下Java中的Class类
2015/04/10 面试题
入党思想汇报
2014/01/05 职场文书
代办委托书怎样写
2014/04/08 职场文书
男性健康日的活动方案
2014/08/18 职场文书
祖国在我心中演讲稿450字
2014/09/05 职场文书
2014年优质护理服务工作总结
2014/11/14 职场文书
检察院起诉意见书
2015/05/20 职场文书
2016高考感言
2015/08/01 职场文书