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 16 Python
python实现逆波兰计算表达式实例详解
May 06 Python
使用Python操作MySQL的一些基本方法
Aug 16 Python
Python检测网站链接是否已存在
Apr 07 Python
详解Python中表达式i += x与i = i + x是否等价
Feb 08 Python
Python爬虫实例扒取2345天气预报
Mar 04 Python
Python Unittest根据不同测试环境跳过用例的方法
Dec 16 Python
在pyqt5中QLineEdit里面的内容回车发送的实例
Jun 21 Python
python脚本之一键移动自定格式文件方法实例
Sep 02 Python
深入了解如何基于Python读写Kafka
Dec 31 Python
python实现控制台输出彩色字体
Apr 05 Python
python 从list中随机取值的方法
Nov 16 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/05/08 PHP
php empty() 检查一个变量是否为空
2011/11/10 PHP
PHP中使用imagick生成PSD文件缩略图教程
2015/01/26 PHP
php结合正则批量抓取网页中邮箱地址
2015/05/19 PHP
php利用imagemagick实现复古老照片效果实例
2017/02/16 PHP
PHP分享图片的生成方法
2018/04/25 PHP
jQuery 插件 将this下的div轮番显示
2009/04/09 Javascript
javascript 特性检测并非浏览器检测
2010/01/15 Javascript
键盘KeyCode值列表汇总
2013/11/26 Javascript
JavaScript给url网址进行encode编码的方法
2015/03/18 Javascript
简介JavaScript中的getSeconds()方法的使用
2015/06/10 Javascript
jquery实现的伪分页效果代码
2015/10/29 Javascript
javascript实现uploadify上传格式以及个数限制
2015/11/23 Javascript
【JS+CSS3】实现带预览图幻灯片效果的示例代码
2016/03/17 Javascript
JavaScript封装的常用工具类库bee.js用法详解【经典类库】
2018/09/03 Javascript
Intellij IDEA搭建vue-cli项目的方法步骤
2018/10/20 Javascript
Windows下Node爬虫神器Puppeteer安装记
2019/01/09 Javascript
深入浅析Vue 中 ref 的使用
2019/04/29 Javascript
vue中引入mxGraph的步骤详解
2019/05/17 Javascript
vue-cli配置全局sass、less变量的方法
2019/06/06 Javascript
vue element 中的table动态渲染实现(动态表头)
2019/11/21 Javascript
vue-socket.io接收不到数据问题的解决方法
2020/05/13 Javascript
[20:57]Ti4主赛事第三天开幕式
2014/07/21 DOTA
[01:12:40]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第三场 1月25日
2021/03/11 DOTA
python数据结构之二叉树的统计与转换实例
2014/04/29 Python
在Python中使用itertools模块中的组合函数的教程
2015/04/13 Python
详解python中的文件与目录操作
2017/07/11 Python
删除python pandas.DataFrame 的多重index实例
2018/06/08 Python
Python实现投影法分割图像示例(一)
2020/01/17 Python
django序列化时使用外键的真实值操作
2020/07/15 Python
使用css实现android系统的loading加载动画
2019/07/25 HTML / CSS
课程改革实施方案
2014/03/16 职场文书
大学新生军训方案
2014/05/03 职场文书
乡镇2014法制宣传日活动总结
2014/11/01 职场文书
护士工作心得体会
2016/01/25 职场文书
一定要知道的 25 个 Vue 技巧
2021/11/02 Vue.js