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获取邮件地址的方法
Jul 10 Python
实例解析Python的Twisted框架中Deferred对象的用法
May 25 Python
python并发编程之多进程、多线程、异步和协程详解
Oct 28 Python
Python中的pygal安装和绘制直方图代码分享
Dec 08 Python
PyQt5每天必学之拖放事件
Aug 27 Python
python取数作为临时极大值(极小值)的方法
Oct 15 Python
Python查找数组中数值和下标相等的元素示例【二分查找】
Feb 13 Python
详解python中TCP协议中的粘包问题
Mar 22 Python
在python Numpy中求向量和矩阵的范数实例
Aug 26 Python
利用Python绘制Jazz网络图的例子
Nov 21 Python
pytorch三层全连接层实现手写字母识别方式
Jan 14 Python
Python中zipfile压缩包模块的使用
May 14 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 和 MYSQL
2006/10/09 PHP
PHP5+UTF8多文件上传类
2008/10/17 PHP
php实现网站插件机制的方法
2009/11/10 PHP
php中使用ExcelFileParser处理excel获得数据(可作批量导入到数据库使用)
2010/08/21 PHP
PHP中创建空文件的代码[file_put_contents vs touch]
2012/01/20 PHP
PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
2012/04/02 PHP
实现WordPress主题侧边栏切换功能的PHP脚本详解
2015/12/14 PHP
PHP getallheaders无法获取自定义头(headers)的问题
2016/03/23 PHP
Django中的cookie与session操作实例代码
2017/08/17 PHP
javascript Keycode对照表
2009/10/24 Javascript
Bootstrap每天必学之基础排版
2015/11/20 Javascript
Node.js环境下编写爬虫爬取维基百科内容的实例分享
2016/06/12 Javascript
详解jQuery uploadify文件上传插件的使用方法
2016/12/16 Javascript
BootStrap导航栏问题记录
2017/07/31 Javascript
基于Vue.js 2.0实现百度搜索框效果
2020/12/28 Javascript
解决vue v-for 遍历循环时key值报错的问题
2018/09/06 Javascript
深入浅析golang zap 日志库使用(含文件切割、分级别存储和全局使用等)
2020/02/19 Javascript
如何在postman测试用例中实现断言过程解析
2020/07/09 Javascript
JavaScript中的执行环境和作用域链
2020/09/04 Javascript
python两种遍历字典(dict)的方法比较
2014/05/29 Python
python正则中最短匹配实现代码
2018/01/16 Python
Python pyinotify日志监控系统处理日志的方法
2018/03/08 Python
Python基于pyCUDA实现GPU加速并行计算功能入门教程
2018/06/19 Python
python redis连接 有序集合去重的代码
2019/08/04 Python
Python处理session的方法整理
2019/08/29 Python
使用Rasterio读取栅格数据的实例讲解
2019/11/26 Python
Python基于Tkinter编写crc校验工具
2020/05/06 Python
Python-openCV开运算实例
2020/07/05 Python
Python tkinter界面实现历史天气查询的示例代码
2020/08/23 Python
Python基于Serializer实现字段验证及序列化
2020/11/04 Python
详解css3自定义滚动条样式写法
2017/12/25 HTML / CSS
加拿大折扣、优惠券和交易网站:WagJag
2018/02/07 全球购物
Omio俄罗斯:一次搜索公共汽车、火车和飞机的机票
2018/11/17 全球购物
班级活动总结格式
2014/08/30 职场文书
房贷收入证明范本
2015/06/12 职场文书
Python pandas求方差和标准差的方法实例
2021/08/04 Python