Python批量监控主机内存/CPU利用率/磁盘/网络等信息

环境使用python3.6.2版本,linux使用centos7


这个程序主要使用paramiko模块实现。我们实现相关信息的获取,具体的监控系统和手段由于大家实现方式不一,就不举例了。

1、内存信息的读取。

通过远程执行‘cat /proc/meminfo’可以获取内存相关信息。这里我只读取MemTotal和MemFree的信息。需要读取其他信息可以利用正则表达式匹配获取其他数据。例子把这两个信息输出到标准输出中,实际应用可以通过crontab定时执行脚本,把结果写入文件,可以给传给监控系统,当超越一定阀值的时候进行相应的处理

import paramiko
import re

#设置主机列表
host_list=({'ip':'192.168.98.130', 'port':22, 'username':'root', 'password':'123'},
           {'ip':'192.168.98.131', 'port':22, 'username':'root', 'password':'123'},)

ssh = paramiko.SSHClient()
# 设置为接受不在known_hosts 列表的主机可以进行ssh连接
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

for host in host_list:
    ssh.connect(hostname=host['ip'], port=host['port'], username=host['username'], password=host['password'])
    print(host['ip'])
    stdin, stdout, stderr = ssh.exec_command('cat /proc/meminfo')
    str_out = stdout.read().decode()
    str_err = stderr.read().decode()
    
    if str_err != "":
        print(str_err)
        continue

    
    str_total = re.search('MemTotal:.*?\n', str_out).group()
    print(str_total)
    totalmem = re.search('\d+',str_total).group()
    
    str_free = re.search('MemFree:.*?\n', str_out).group()
    print(str_free)
    freemem = re.search('\d+',str_free).group()
    use = round(float(freemem)/float(totalmem), 2)
    print('当前内存使用率为:'+ str(use))
    
    ssh.close()

2、CPU使用率的读取

这里使用cat /proc/stat命令读取实时的CPU使用率。这个命令可以获取到cpu的各种时间。具体的分析请自行百度。由于这个时间数值是从开机之后一直累加的,因此我们要取一次值之后,隔一小段时间再取一次值,前后两次的值相减,再计算这段时间的CPU利用率。具体公式是:

CPU利用率= 1-(CPU空闲时间2 - CPU空闲时间1) / (CPU总时间2 - CPU总时间1)

其中"CPU空闲时间1"为第一次取值时第4项的值,"CPU空闲时间2"为第二次取值时第4项的值,"CPU总时间1"为第一次取值时各项数值的总和,"CPU总时间2"为第二次取值时各项数值的总和

import paramiko
import re
import time
import sys

#设置主机列表
host_list=({'ip':'192.168.98.130', 'port':22, 'username':'root', 'password':'123'},
           {'ip':'192.168.98.131', 'port':22, 'username':'root', 'password':'123'},)

ssh = paramiko.SSHClient()
# 设置为接受不在known_hosts 列表的主机可以进行ssh连接
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

for host in host_list:
    ssh.connect(hostname=host['ip'], port=host['port'], username=host['username'], password=host['password'])
    print(host['ip'])
    stdin, stdout, stderr = ssh.exec_command('cat /proc/stat | grep "cpu "')
    str_out = stdout.read().decode()
    str_err = stderr.read().decode()

    if str_err != "":
        print(str_err)
        continue
    else:
        cpu_time_list = re.findall('\d+', str_out)
        cpu_idle1 = cpu_time_list[3]
        total_cpu_time1 = 0
        for t in cpu_time_list:
            total_cpu_time1 = total_cpu_time1 + int(t)

    time.sleep(2)

    stdin, stdout, stderr = ssh.exec_command('cat /proc/stat | grep "cpu "')
    str_out = stdout.read().decode()
    str_err = stderr.read().decode()
    if str_err != "":
        print(str_err)
        continue
    else:
        cpu_time_list = re.findall('\d+', str_out)
        cpu_idle2 = cpu_time_list[3]
        total_cpu_time2 = 0
        for t in cpu_time_list:
            total_cpu_time2 = total_cpu_time2 + int(t)

    cpu_usage = round(1 - (float(cpu_idle2) - float(cpu_idle1)) / (total_cpu_time2 - total_cpu_time1), 2)
    print('当前CPU使用率为:' + str(cpu_usage))

    
    ssh.close()

3、磁盘使用率

这里使用df命令获取磁盘使用情况。这个命令相当方便,既获取了磁盘的容量,也获取了使用率,可以根据需要进行后续的处理

import paramiko
import re

#设置主机列表
host_list=({'ip':'192.168.98.130', 'port':22, 'username':'root', 'password':'123'},
           {'ip':'192.168.98.131', 'port':22, 'username':'root', 'password':'123'},)

ssh = paramiko.SSHClient()
# 设置为接受不在known_hosts 列表的主机可以进行ssh连接
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

for host in host_list:
    ssh.connect(hostname=host['ip'], port=host['port'], username=host['username'], password=host['password'])
    print(host['ip'])
    stdin, stdout, stderr = ssh.exec_command('df -lm')
    str_out = stdout.read().decode()
    str_err = stderr.read().decode()
    
    if str_err != "":
        print(str_err)
        continue

    print(str_out)

    ssh.close()

4、网络流量

网络流量可以使用cat /proc/net/dev查看,可以看到每个网络接口当前发送和接收的字节和包的数量,由于是一个累计的值,如果需要计算一定时间间隔内的流量,可以让程序sleep一定时间,然后再次获取,进行计算。个人建议每隔一段时间获取这个值,并且写入文件中,然后再使用其他程序去计算其速度和流量

import paramiko
import re

#设置主机列表
host_list=({'ip':'192.168.98.130', 'port':22, 'username':'root', 'password':'123'},
           {'ip':'192.168.98.131', 'port':22, 'username':'root', 'password':'123'},)

ssh = paramiko.SSHClient()
# 设置为接受不在known_hosts 列表的主机可以进行ssh连接
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

for host in host_list:
    ssh.connect(hostname=host['ip'], port=host['port'], username=host['username'], password=host['password'])
    print(host['ip'])
    stdin, stdout, stderr = ssh.exec_command('cat /proc/net/dev')
    str_out = stdout.read().decode()
    str_err = stderr.read().decode()
    
    if str_err != "":
        print(str_err)
        continue

    print(str_out)

    ssh.close()


你可能感兴趣的:(Python)