最近由于增加了很多新的服务,服务器经常会因为oom、磁盘空间不足等原因造成各种各样的问题。所以需要写一个小工具完成对各服务器的巡检。

思路比较简单:利用paramiko这个库,在服务器上执行linux命令并将结果返回,然后通过正则表达式匹配想要的数据并进行简单数据处理 就能知道各服务器上资源占用情况了。

话不多说,上代码:

 1 from functools import reduce
2 import paramiko
3 import re
4
5 worker_ips = [
6 '192.168.1.2',
7 '192.168.1.3',
8 '192.168.1.4',
9 ]
10
11 def get_cmd_result(ip,cmd,password="***"):
12 ssh = paramiko.SSHClient()
13 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
14 ssh.connect(hostname=ip,port=22,username='root',password=password)
15 stdin,stdout,stderr = ssh.exec_command(cmd)
16 result = stdout.read()
17
18 return result
19
20 def get_re_result(rule,result):
21 result_li = re.findall(rule,result)
22
23 return result_li
24
25 def check_cpu():
26 cpu_space_ip_dict = {}
27 for worker_ip in worker_ips:
28 result = get_cmd_result(worker_ip,'top -bi -n 4 -d 0.02') # 单独的top命令通过paramiok不会有返回值,-n 表示查看4次,-d 表示隔多久查看一次
29 space_li = get_re_result(r', (\d+.\d+) id', result) # 注意:可能由于网络原因,查看4次结果 列表长度不一定就是4,元素个数会<=4,有可能为0
30 if space_li:
31 # space = 100 - reduce(lambda a,b:float(a) + float(b), space_li) / len(space_li)
32 space = 100 - sum([float(x) for x in space_li]) / len(space_li)
33 cpu_space_ip_dict[worker_ip] = "%d%%" % space
34 else:
35 cpu_space_ip_dict[worker_ip] = "【获取服务器数据异常,需手动获取】"
36
37 return cpu_space_ip_dict
38
39 def check_df():
40 df_space_ip_result = {}
41 for worker_ip in worker_ips:
42 result = get_cmd_result(worker_ip,'df /')
43 space = get_re_result(r'\d+%',result)[0]
44 df_space_ip_result[worker_ip] = space
45
46 return df_space_ip_result
47
48 def check_mem():
49 mem_space_ip_dict = {}
50 for worker_ip in worker_ips:
51 result = get_cmd_result(worker_ip,'free | grep Mem')
52 mem_li = get_re_result(r'\d+',result)
53 mem_space = round(int(mem_li[1]) / int(mem_li[0]+1e-5), 2) * 100
54 mem_space_ip_dict[worker_ip] = mem_space
55
56 return mem_space_ip_dict

附上docker容器资源的解决方法:

存在可能平时的服务是跑在docker容器里面,想要获取容器中某些资源情况,可以如下操作:

1 cmd = 'docker exec test_01 df -h'
2 stdin, stdout, stderr = ssh.exec_command(cmd)
3 result = stdout.read()

更有可能需要在容器中执行多个步骤返回结果,则可以加上bash -c 参数指定多个命令,命令间用&&分隔,如下:

1 cmd = '''docker exec tets_01 bash -c "cd /home/*** && . set_path.sh && 。。。。。。"'''
2 stdin, stdout, stderr = ssh.exec_command(cmd)
3 result = stdout.read()

最新文章

  1. 深入理解java中的ArrayList和LinkedList
  2. linux进程命令
  3. SharePoint Server 2013开发之旅(二):使用在线的开发人员网站进行SharePoint App开发
  4. JSP读取My SQL数据乱码问题的解决
  5. (copy)C#时间日期操作
  6. LInux软件的卸载和安装(转)
  7. python 读写INI配置文件
  8. &lt;Error&gt;: CGContextRestoreGState
  9. FLASH 存储学习-串行SPI NOR FLASH
  10. OpenGL图形管线和坐标变换
  11. DataNode连接错误Retrying connect to server
  12. 垃圾回收机制GC知识再总结兼谈如何用好GC(转)
  13. Fiddler扩展之脚本录制
  14. bind 小测试
  15. SQL 报表 --简易进销系统
  16. liunx的磁盘管理的基本命令
  17. 断言NSAssert的使用
  18. 吾修叫板微软,QMVC说比MVC5快!
  19. postgres常用命令
  20. 2048小游戏4X4C语言

热门文章

  1. Oracle常用的日期操作函数 to_char()和to_date
  2. echarts:双y轴图表刻度均匀分布问题
  3. python菜鸟学习: 13. excel文件编辑openpyxl使用
  4. DEDE在文章列表文章没有缩略图的不显示图片,有的则显示缩略图
  5. STP理论基础
  6. gcc 中weak弱函数
  7. oracle 分配权限命令
  8. 读后笔记 -- Python 全栈测试开发 Chapter9:Postman + Newman 实现接口自动化
  9. jmeter--json格式的请求数据参数化以及断言
  10. Linux: Ensure X Window System is not installed