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中无限元素列表的实现方法
Aug 18 Python
python列表操作实例
Jan 14 Python
Python使用Beautiful Soup包编写爬虫时的一些关键点
Jan 20 Python
详解Python的Twisted框架中reactor事件管理器的用法
May 25 Python
python 3.6 tkinter+urllib+json实现火车车次信息查询功能
Dec 20 Python
Python实现替换文件中指定内容的方法
Mar 19 Python
Python流程控制 if else实现解析
Sep 02 Python
Python之字典对象的几种创建方法
Sep 30 Python
利用python清除移动硬盘中的临时文件
Oct 28 Python
详解python使用金山词霸的翻译功能(调试工具断点的使用)
Jan 07 Python
python des,aes,rsa加解密的实现
Jan 16 Python
python 装饰器重要在哪
Feb 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 之Section与Cookie使用总结
2012/09/14 PHP
Thinkphp结合AJAX长轮询实现PC与APP推送详解
2017/07/31 PHP
javascript 动态参数判空操作
2008/12/22 Javascript
JavaScript 对任意元素,自定义右键菜单的实现方法
2013/05/08 Javascript
JavaScript中使用stopPropagation函数停止事件传播例子
2014/08/27 Javascript
jQuery中:image选择器用法实例
2015/01/03 Javascript
javascript实现检验的各种规则
2015/07/31 Javascript
jQuery弹簧插件编写基础之“又见弹窗”
2015/12/11 Javascript
一个仿微博登陆邮箱提示框js开发案例
2016/07/28 Javascript
js阻止冒泡和默认事件(默认行为)详解
2016/10/20 Javascript
vue2.0开发实践总结之入门篇
2016/12/06 Javascript
js定时器实例分享
2016/12/20 Javascript
基于JavaScript实现无限加载瀑布流
2017/07/21 Javascript
基于node搭建服务器,写接口,调接口,跨域的实例
2018/05/13 Javascript
利用vue重构有赞商城的思路以及总结整理
2019/02/21 Javascript
vue实现todolist功能、todolist组件拆分及todolist的删除功能
2019/04/11 Javascript
微信小程序实现消息框弹出动画
2020/04/18 Javascript
Vue.js组件props数据验证实现详解
2019/10/19 Javascript
Python开发编码规范
2006/09/08 Python
学习python之编写简单简单连接数据库并执行查询操作
2016/02/27 Python
python fabric实现远程部署
2017/01/05 Python
详解Python进阶之切片的误区与高级用法
2018/12/24 Python
linux查找当前python解释器的位置方法
2019/02/20 Python
Django框架模板文件使用及模板文件加载顺序分析
2019/05/23 Python
Python3内置模块random随机方法小结
2019/07/13 Python
Django Admin中增加导出Excel功能过程解析
2019/09/04 Python
Python range与enumerate函数区别解析
2020/02/28 Python
新闻专业个人求职信
2013/12/19 职场文书
教师党员思想汇报
2014/01/06 职场文书
2014年高三毕业生自我评价
2014/01/11 职场文书
《槐乡五月》教学反思
2014/04/25 职场文书
会计求职信范文
2014/05/24 职场文书
单位员工收入证明样本
2014/10/09 职场文书
学生不参加考试检讨书
2015/02/19 职场文书
话题作文之呼唤
2019/12/18 职场文书
使用react-virtualized实现图片动态高度长列表的问题
2021/05/28 Javascript