当前位置: 首页 > 编程笔记 >

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

陆星文
2023-03-14
本文向大家介绍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:%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

 类似资料:
  • 本文向大家介绍Java基于elasticsearch实现集群管理,包括了Java基于elasticsearch实现集群管理的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了java基于elasticsearch实现集群管理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 本篇文章主要是查看集群中的相关信息,具体请看代码和注释 以上就是本文

  • 主要内容:使用简介 Docker Swarm 是 Docker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机。 Docker Swarm 提供了标准的 Docker API,所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机。 支持的工具包括但不限于以下各项: Dokku Docker Compose Docker Machine Jen

  • 集群管理架构概述。 { "clusters": [], "sds": "{...}", "local_cluster_name": "...", "outlier_detection": "{...}", "cds": "{...}" } clusters (required, array) 群集管理器将执行服务发现,健康检查和负载平衡的上游群集列表。 sds (someti

  • 集群管理架构概述 v1 API 参考 v2 API 参考 统计 概述 健康检查统计 离群检测统计 动态HTTP统计 动态HTTP交叉树统计 按服务区动态HTTP统计 负载均衡统计 负载均衡子集统计 运行时设置 主动健康检查 离群异常检测 核心 区域负载均衡 熔断 集群发现服务 统计 健康检查 TCP健康检查 熔断 运行时配置

  • Envoy的集群管理器管理所有配置的上游集群。就像Envoy配置可以包含任意数量的监听器一样,配置也可以包含任意数量的独立配置的上游集群。 上游集群和主机从网络/HTTP过滤器堆栈中抽象出来,因为上游集群和主机可以用于任意数量的不同代理任务。集群管理器向过滤器堆栈公开API,允许过滤器获得到上游集群的L3/L4连接,或者到上游集群的抽象HTTP连接池的句柄(无论上游主机是支持HTTP/1.1还是H

  • 用户除了通过控制台管理集群外,还可以通过ssh直接登陆到主节点上进行操作。主节点上已经完成了集群环境的相关配置,您可以直接在主节点上执行命令。 您还可以通过ssh架设SOCKS5代理服务器后,访问到集群内原生的hadoop管理页面。 生成密钥对 在自己机器上,执行命令如下 ssh-keygen -f ./hadoop_key -C "emr public key" 其中-f指定文件,-C添加