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获取远程图片大小和尺寸的方法
Mar 26 Python
深入浅析python中的多进程、多线程、协程
Jun 22 Python
python生成词云的实现方法(推荐)
Jun 13 Python
详解python分布式进程
Oct 08 Python
使用Python实现从各个子文件夹中复制指定文件的方法
Oct 25 Python
Python中的Socket 与 ScoketServer 通信及遇到问题解决方法
Apr 01 Python
Python 用matplotlib画以时间日期为x轴的图像
Aug 06 Python
Python之数据序列化(json、pickle、shelve)详解
Aug 30 Python
Python性能分析工具Profile使用实例
Nov 19 Python
python 协程 gevent原理与用法分析
Nov 22 Python
Python MOCK SERVER moco模拟接口测试过程解析
Apr 13 Python
python cookie反爬处理的实现
Nov 01 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
咖啡豆的最常见发酵处理方法,详细了解一下
2021/03/03 冲泡冲煮
实现PHP多线程异步请求的3种方法
2014/01/17 PHP
调用WordPress函数统计文章访问量及PHP原生计数器的实现
2016/03/21 PHP
使用PHP+MySql实现微信投票功能实例代码
2017/09/29 PHP
关于laravel模板中生成URL的几种模式总结
2019/10/18 PHP
Underscore.js 的模板功能介绍与应用
2012/12/24 Javascript
getAsDataURL在Firefox7.0下无法预览本地图片的解决方法
2013/11/15 Javascript
javascript:void(0)是什么意思示例介绍
2013/11/17 Javascript
JavaScript中创建类/对象的几种方法总结
2013/11/29 Javascript
同域jQuery(跨)iframe操作DOM(实例讲解)
2013/12/19 Javascript
JavaScript获取图片的原始尺寸以宽度为例
2014/05/04 Javascript
解析JavaScript的ES6版本中的解构赋值
2015/07/28 Javascript
js表单处理中单选、多选、选择框值的获取及表单的序列化
2016/03/08 Javascript
jQuery 利用$.ajax 时获取原生XMLHttpRequest 对象的方法
2016/08/25 Javascript
javascript 单例模式详解及简单实例
2017/02/14 Javascript
springMVC + easyui + $.ajaxFileUpload实现文件上传注意事项
2017/04/23 Javascript
完美解决axios在ie下的兼容性问题
2018/03/05 Javascript
在vue项目中引用Iview的方法
2018/09/14 Javascript
vue 2.8.2版本配置刚进入时候的默认页面方法
2018/09/21 Javascript
node.js域名解析实现方法详解
2019/11/05 Javascript
JS操作Fckeditor的一些常用方法(获取、插入等)
2020/02/19 Javascript
[01:21]DOTA2周边文化主题展 神秘商店火热开售
2017/07/30 DOTA
[05:20]2018DOTA2亚洲邀请赛主赛事第三日战况回顾 LGD率先挺进胜者组决赛
2018/04/06 DOTA
Python 使用os.remove删除文件夹时报错的解决方法
2017/01/13 Python
使用python画个小猪佩奇的示例代码
2018/06/06 Python
Flask实现图片的上传、下载及展示示例代码
2018/08/03 Python
python绘制无向图度分布曲线示例
2019/11/22 Python
python爬虫实现爬取同一个网站的多页数据的实例讲解
2021/01/18 Python
纯CSS3实现的8种Loading动画效果
2014/07/05 HTML / CSS
非常漂亮的CSS3百叶窗焦点图动画
2016/02/24 HTML / CSS
党员干部承诺书
2014/03/25 职场文书
老公给老婆的保证书
2014/04/28 职场文书
五分钟演讲稿
2014/04/30 职场文书
2014年专项整治工作总结
2014/11/17 职场文书
业务内勤岗位职责
2015/04/13 职场文书
一文彻底理解js原生语法prototype,__proto__和constructor
2021/10/24 Javascript