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 相关文章推荐
Windows系统下安装Python的SSH模块教程
Feb 05 Python
Java编程迭代地删除文件夹及其下的所有文件实例
Feb 10 Python
python用BeautifulSoup库简单爬虫实例分析
Jul 30 Python
Python 确定多项式拟合/回归的阶数实例
Dec 29 Python
Python2和Python3之间的str处理方式导致乱码的讲解
Jan 03 Python
决策树剪枝算法的python实现方法详解
Sep 18 Python
pycharm运行程序时看不到任何结果显示的解决
Feb 21 Python
Django中和时区相关的安全问题详解
Oct 12 Python
Python用户自定义异常的实现
Dec 25 Python
Python创建简单的神经网络实例讲解
Jan 04 Python
利用python查看数组中的所有元素是否相同
Jan 08 Python
Python内置数据结构列表与元组示例详解
Aug 04 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
ThinkPHP验证码和分页实例教程
2014/08/22 PHP
PHP @ at 记号的作用示例介绍
2014/10/10 PHP
thinkphp中html:list标签传递多个参数实例
2014/10/30 PHP
php中异常处理方法小结
2015/01/09 PHP
CI框架AR操作(数组形式)实现插入多条sql数据的方法
2016/05/18 PHP
js自带函数备忘 数组
2006/12/29 Javascript
javascript 跨浏览器开发经验总结(五) js 事件
2010/05/19 Javascript
基于jQuery的实现简单的分页控件
2010/10/10 Javascript
Moment.js 不容错过的超棒Javascript日期处理类库
2012/04/15 Javascript
从QQ网站中提取的纯JS省市区三级联动菜单
2013/12/25 Javascript
javascript实现下拉提示选择框
2015/12/29 Javascript
jQuery实时显示鼠标指针位置和键盘ASCII码
2016/03/28 Javascript
Vue.js每天必学之构造器与生命周期
2016/09/05 Javascript
原生JS:Date对象全面解析
2016/09/06 Javascript
JS控制FileUpload的上传文件类型实例代码
2016/10/07 Javascript
微信小程序 底部导航栏目开发资料
2016/12/05 Javascript
JS实现一个简单的日历
2017/02/22 Javascript
微信小程序实现滑动删除效果
2017/05/19 Javascript
Cropper.js 实现裁剪图片并上传(PC端)
2017/08/20 Javascript
Three.js入门之hello world以及如何绘制线
2017/09/25 Javascript
js实现图片粘贴上传到服务器并展示的实例
2017/11/08 Javascript
解决Mac node版本升级失败的问题
2018/05/16 Javascript
微信小程序 MinUI组件库系列之badge徽章组件示例
2018/08/20 Javascript
react实现antd线上主题动态切换功能
2019/08/12 Javascript
sharp.js安装过程中遇到的问题总结
2020/04/02 Javascript
浅谈vue中使用编辑器vue-quill-editor踩过的坑
2020/08/03 Javascript
vant-ui AddressEdit地址编辑和van-area的用法说明
2020/11/03 Javascript
详解JavaScript中的链式调用
2020/11/27 Javascript
Appium Python自动化测试之环境搭建的步骤
2019/01/23 Python
Python参数解析模块sys、getopt、argparse使用与对比分析
2019/04/02 Python
python 实现12bit灰度图像映射到8bit显示的方法
2019/07/08 Python
python进阶之自定义可迭代的类
2019/08/20 Python
Python爬虫开发与项目实战
2020/12/16 Python
拥有超过850家商店的美国在线派对商店:Party City
2018/10/21 全球购物
Order by的几种用法
2013/06/16 面试题
用Python编写简单的gRPC服务的详细过程
2021/07/04 Python