Python脚本实现集群检测和管理功能


Posted in Python onMarch 06, 2015

场景是这样的:一个生产机房,会有很多的测试机器和生产机器(也就是30台左右吧),由于管理较为混乱导致了哪台机器有人用、哪台机器没人用都不清楚,从而产生了一个想法--利用一台机器来管理所有的机器,记录设备责任人、设备使用状态等等信息....那么,为什么选择python,python足够简单并且拥有丰富的第三方库的支持。

最初的想法

由于刚参加工作不久,对这些东西也都没有接触过,轮岗到某个部门需要做出点东西来(项目是什么还没情况,就要做出东西来,没办法硬着头皮想点子吧)。。。

本想做一个简单点的自动化测试的工具,但这项目的测试方法和测试用例暂时不能使用这种通用的测试手段(输入和输出都确定不了),从而作罢...

Python脚本实现集群检测和管理功能

那么做点什么东西,经常发现同事们问208谁用的?201谁用的?那IP是我的!!!你是不是把我得网线给拔掉了?242那机器到底是哪台?

突然间,春天来了,是不是可以做一个系统用来检测IP和记录设备的使用人,甚至可以按需要在某台设备上运行一个脚本或命令?把这个矮矬穷的想法和leader沟通过后,确认可以做,那么就开始吧!!!

设计思想

该系统的大概思想:

1.

要获得所有服务器的各种信息,需要在任意一台服务器上部署一个agent作为信息获取的节点,定时向管理服务器节点发送服务器信息数据。

2.

server作为综合管理节点,接收并储存agent提交的信息。

3.

为了方便使用,采用web页面的形式做展示。

Python脚本实现集群检测和管理功能

开发工具选择

1. 开发语言:python

之所以选择python,简单,第三方库丰富,不用造轮子

2. 数据库:mysql

简单、易用

3. webpy:web框架

入门简单、部署方便

4. bootstrap:前端框架

不要关心太多前端问题

5. paramiko:python库,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接

通过SSH方式连接agent服务器:远程运行命令、传输文件

6. scapy: python库,可用来发送、嗅探、解析和伪造网络数据包,这里用来扫描IP

7. MySQLdb: 连接mysql

8. shell 和 python脚本接口: 为其他人提供shell脚本的接口

经验分享

1. 前端对我来说是新东西,从来没弄过,页面的动画效果,脚本运行时的过渡都是需要考虑的,开始考虑利用倒计时,但是这个时间是不可控的,后来采用ajax来处理这个问题

2. agent要自动部署到每台机器,并可以通过server来控制刷新时间

3. 建立一个可扩展的表是非常重要的,而且一些重要的信息需要写入磁盘,在数据库失效的情况下,可以从磁盘获取数据

4. 数据库的连接,如果长时间没有操作的话会超时,要考虑到

... ...

项目结构--webpy

1. website.py为webpy的主程序,设置了url映射

2. model.py为webpy的url映射类,处理请求和返回

3. static中存放静态资源

4. scripts用来存放处理的脚本,这里起的名字有些问题

Python脚本实现集群检测和管理功能

连接数据库

 使用MyQSLdb连接mysql,在这里我没有使用webpy提供的数据库接口,而是自己封装了一套

ssh远程连接服务器

 paramiko实现ssh连接、与数据传输、执行命令和脚本

def executecmd(cmd, host, port=22, user='root', passwd='root'):

    try:

        s = paramiko.SSHClient()

        s.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    s.connect(host, port, user, passwd, timeout = 10)

    except Exception as e:

        s.close()

        print e

        print 'connet error...'

        return
    try:

        stdin,stdout,stderr=s.exec_command(cmd)

        #print 'Host: %s......' %host

        res = stdout.readlines()

    except Exception as e:

        print 'exec_commmand error...'

    s.close()

    return res
def executefile(file, host, port=22, user='root', passwd='root'):

    try:

        s = paramiko.SSHClient()

        s.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    s.connect(host, port, user, passwd,timeout=5)

        t = paramiko.Transport((host, port))

        t.connect(username=user, password=passwd)

        sftp =paramiko.SFTPClient.from_transport(t)

    except Exception as e:

        s.close()

        print e

        print 'connet error...'

        return ''
    try:

        filename = os.path.basename(file)

        if filename.find('.sh') >= 0:

            sftp.put(path+'/'+file, '/tmp/tmp_test.sh')

            stdin,stdout,stderr=s.exec_command('sh /tmp/tmp_test.sh 2>/dev/null', timeout=5)

        else:

            sftp.put(path+'/'+file, '/tmp/tmp_test.py')

            stdin,stdout,stderr=s.exec_command('python /tmp/tmp_test.py', timeout=5)

        #stdin,stdout,stderr=s.exec_command('rm -rf /tmp/tmp_test* 2>/dev/null') 

        res = stdout.readlines()

        s.exec_command('rm -rf /tmp/tmp_test* 2>/dev/null') 

    except Exception as e:

        s.exec_command('rm -rf /tmp/tmp_test* 2>/dev/null') 

        print 'timeout error...'

        print e

        return ''

    return res

IP扫描

使用scapy进行IP扫描

def pro(ip, cc, handle):

    global dict

    dst = ip + str(cc)

    packet = IP(dst=dst, ttl=20)/ICMP()

    reply = sr1(packet, timeout=TIMEOUT)

    if reply:

        print reply.src,' is online'

        tmp = [1, reply.src]

        handle.write(reply.src + '\n')

        #handle.write(reply.src+" is online"+"\n")

 

def main():

    threads=[]

    ip = '192.168.1.1'

    s = 2

    e = 254

    f=open('ip.log','w')

    for i in range(s, e):

        t=threading.Thread(target=pro,args=(ip,i,f))

        threads.append(t)

    print "main Thread begins at ",ctime()

    for t in threads :

        t.start()

    for t in threads :

        t.join()

    print "main Thread ends at ",ctime()

批量添加ssh-key

home_dir = '/home/xx'

id_rsa_pub = '%s/.ssh/id_rsa.pub' %home_dir
if not  id_rsa_pub:

    print 'id_rsa.pub Does not exist!'

    sys.exit(0)
file_object = open('%s/.ssh/config' %home_dir ,'w')

file_object.write('StrictHostKeyChecking no\n')

file_object.write('UserKnownHostsFile /dev/null')

file_object.close()


def up_key(host,port,user,passwd):

    try:

        s = paramiko.SSHClient()

    s.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    s.connect(host, port, user, passwd)
        t = paramiko.Transport((host, port))

        t.connect(username=user, password=passwd, timeout=3)

        sftp =paramiko.SFTPClient.from_transport(t)
        print 'create Host:%s .ssh dir......' %host

        stdin,stdout,stderr=s.exec_command('mkdir ~/.ssh/')

        print 'upload id_rsa.pub to Host:%s......' %host

        sftp.put(id_rsa_pub, "/tmp/temp_key")

        stdin,stdout,stderr=s.exec_command('cat /tmp/temp_key >> ~/.ssh/authorized_keys && rm -rf /tmp/temp_key')

        print 'host:%s@%s auth success!\n' %(user, host)

        s.close()

        t.close()

    except Exception, e:

        #import traceback

        #traceback.print_exc()

        print 'connect error...'

        print 'delete ' + host  + ' from database...'

        delip(host)

        #delete from mysql****

        try:

            s.close()

            t.close()

        except:

            pass
Python 相关文章推荐
利用Python的装饰器解决Bottle框架中用户验证问题
Apr 24 Python
python编写Logistic逻辑回归
Dec 30 Python
对python:循环定义多个变量的实例详解
Jan 20 Python
Python如何处理大数据?3个技巧效率提升攻略(推荐)
Apr 15 Python
python监控进程状态,记录重启时间及进程号的实例
Jul 15 Python
python集合的创建、添加及删除操作示例
Oct 08 Python
Python 获取numpy.array索引值的实例
Dec 06 Python
解决Python spyder显示不全df列和行的问题
Apr 20 Python
python根据完整路径获得盘名/路径名/文件名/文件扩展名的方法
Apr 22 Python
PyQt5结合matplotlib绘图的实现示例
Sep 15 Python
Python使用UDP实现720p视频传输的操作
Apr 24 Python
python 如何在list中找Topk的数值和索引
May 20 Python
Python守护进程(daemon)代码实例
Mar 06 #Python
Python类方法__init__和__del__构造、析构过程分析
Mar 06 #Python
Python列表生成器的循环技巧分享
Mar 06 #Python
Python装饰器使用示例及实际应用例子
Mar 06 #Python
Python迭代器和生成器介绍
Mar 06 #Python
Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
Mar 06 #Python
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
Mar 05 #Python
You might like
如何限制访问者的ip(PHPBB的代码)
2006/10/09 PHP
php发送html格式文本邮件的方法
2015/06/10 PHP
yii2-GridView在开发中常用的功能及技巧总结
2017/01/07 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
2017/05/05 PHP
php高清晰度无损图片压缩功能的实现代码
2018/12/09 PHP
javascritp实现input输入框相关限制用法
2007/06/29 Javascript
javascript 实现父窗口引用弹出窗口的值的脚本
2007/08/07 Javascript
javascript实现的网页局布刷新效果
2008/12/01 Javascript
用Javascript实现锚点(Anchor)间平滑跳转
2009/09/08 Javascript
jQuery插件实现带圆点的焦点图片轮播切换
2016/01/18 Javascript
angular基于路由控制ui-router实现系统权限控制
2016/09/27 Javascript
ReactJs设置css样式的方法
2017/06/08 Javascript
微信小程序如何获取用户手机号
2018/01/26 Javascript
js中el表达式的使用和非空判断方法
2018/03/28 Javascript
详解js访问对象的属性和方法
2018/10/25 Javascript
JS实现获取当前所在周的周六、周日示例分析
2019/05/11 Javascript
微信小程序 网络通信实现详解
2019/07/23 Javascript
js回调函数原理与用法案例分析
2020/03/04 Javascript
js实现拖拽元素选择和删除
2020/08/25 Javascript
理解JavaScript中的对象
2020/08/25 Javascript
js数组的基本使用总结
2021/01/18 Javascript
[01:25]2015国际邀请赛最佳短片奖——斧王《拆塔英雄:天赋异禀》
2015/09/22 DOTA
Python基础教程之利用期物处理并发
2018/03/29 Python
Appium+Python自动化测试之运行App程序示例
2019/01/23 Python
Python检查ping终端的方法
2019/01/26 Python
python 返回一个列表中第二大的数方法
2019/07/09 Python
python 进程的几种创建方式详解
2019/08/29 Python
python3安装OCR识别库tesserocr过程图解
2020/04/02 Python
Python 保存加载mat格式文件的示例代码
2020/08/04 Python
美国女士时尚珠宝及配饰购物网站:Icing
2018/07/02 全球购物
法国一家多品牌成衣精品中/高档商店:Graduate Store
2019/08/28 全球购物
大学拉赞助协议书范文
2014/09/26 职场文书
专业技术人员年度考核评语
2014/12/31 职场文书
交通事故调解协议书
2015/05/20 职场文书
2016国培研修心得体会
2016/01/08 职场文书
Go中的条件语句Switch示例详解
2021/08/23 Golang