场景是这样的:一个生产机房,会有很多的测试机器和生产机器(也就是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...' returntry: 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_dirif 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添加