python脚本实现集群检测和管理

python脚本实现集群检测和管理

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

最初的想法

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

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

  

  

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

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

设计思想

  该系统的大概思想:

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

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

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

  

开发工具选择

  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用来存放处理的脚本,这里起的名字有些问题

    

  连接数据库

    使用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:%[email protected]%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


本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。欢迎转载,请注明出处:
转载自:cococo点点 http://www.cnblogs.com/coder2012

时间: 2024-10-05 22:12:33

python脚本实现集群检测和管理的相关文章

RedHadoop创始人童小军在北京开讲“Hadoop2.0集群优化与管理”啦!

一.活动介绍 目前Hadoop的应用越来越广泛,开始被很多企业采用,且Hadoop人才十分稀缺和抢手,待遇也远比Java..Net开发好.为了帮助您快速掌握Hadoop的前沿技术,了解企业应用Hadoop的性能优化,CSDN特别邀请您参加我们精心策划的Hadoop2.0运维管理与集群安装监控管理实训班.届时,在历时一天的实训班上,RedHadoop创始人童小军将为您分享Hadoop企业应用成功案例.讲解Hadoop技术架构知识与小窍门. 期待您的加入,名额有限,感兴趣的小伙伴们欲报从速哦!另外,

集群增量会话管理器——DeltaManager

DeltaManager会话管理器是tomcat默认的集群会话管理器,它主要用于集群中各个节点之间会话状态的同步维护,由于相关内容涉及到集群,可能会需要一些集群通信相关知识,如果有疑问可结合集群相关章节. 集群增量会话管理器的职责是将某节点的会话该变同步到集群内其他成员节点上,它属于全节点复制模式,所谓全节点复制是指集群中某个节点的状态变化后需要同步到集群中剩余的节点,非全节点方式可能只是同步到其中某个或若干节点.在集群中全节点会话复制的一个大致步骤如下图所示,客户端发起一个请求,假设通过一定的

【摘自大型网站技术架构书】应用服务器集群的session管理

由于负载均衡服务器可能会将请求分发到集群任何一台服务器上,所以保证每次请求能够获得正确的session比单机时复杂. 集群环境下,session管理的主要几种手段 1.session复制 session复制是早期的企业级的使用比较多的一种服务器集群session管理机制.应用服务器开启web容器的session复制功能,在集群中的几台服务器之间同步session对象,使得每台服务器上都保存所有的session信息,这样任何一台宕机都不会导致session的数据丢失,服务器使用session时,直

rabbitMQ集群(安装+管理+测试)

rabbitMQ集群(安装+管理+测试),详细见附件

应用服务器集群的session管理

1.什么是session a.web应用中将这些多次请求修改使用的上下文对象称作会话(session) b.Session 对象存储特定用户会话所需的信息.这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去. c.当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象.当会话过期或被放弃后,服务器将终止该会话 2.session的应用场景 在高可用的架构中,

redis集群搭建与管理

集群简介: Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施(installation). Redis 集群不支持那些需要同时处理多个键的 Redis 命令, 因为执行这些命令需要在多个 Redis 节点之间移动数据, 并且在高负载的情况下, 这些命令将降低 Redis 集群的性能, 并导致不可预测的行为. Redis 集群通过分区(partition)来提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命

34. Python Memcached 安装 集群

1.Memcache 安装 安装过程略,查询官网有安装方法. 官方网站下载地址:http://memcached.org/downloads memcache简介 Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载. 它通过在内存中缓存数据和对象减少读取数据库的次数,从而提高动态.数据库驱动网站的速度. Memcached基于一个存储键/值的hashmap. 其守护进程(daemon)是用C语言写的,但是客户端可以用任何语言来编写,并通过memcached

15.9,python操作redis集群

上代码 1.对redis的单实例进行连接操作 python3 >>>import redis >>>r = redis.StrictRedis(host='localhost', port=6379, db=0,password='root') >>>r.set('lufei', 'guojialei') True >>>r.get('lufei') 'bar' -------------------- 2.sentinel集群连接并

Redis3.2+Tomcat实现集群的Session管理 -- tomcat-redis-session-manager的编译和开发部署环境搭建

已经有不少文章介绍使用tomcat-redis-session-manager来实现Redis存储Tomcat的Session,实现分布式Session管理.但是现在官方编译的tomcat-redis-session-manager的jar包已经很旧了,基于的Redis版本也很低.这里我把我自己重新编译并部署它的步骤介绍一下. 1,首先,从Github上clone下载tomcat-redis-session-manager工程的源代码,地址是: https://github.com/jcolem