使用SNMP获取各服务器资源使用情况,汇总分析后发出巡检报告。

使用的MIB说明:

#Load:
#1 minute
snmpwalk -v 2c -c public $IP 1.3.6.1.4.1.2021.10.1.3.1 | awk -F'STRING:' '{print $NF}'
#5 minute
snmpwalk -v 2c -c public $IP 1.3.6.1.4.1.2021.10.1.3.2 | awk -F'STRING:' '{print $NF}'
#15 minute
snmpwalk -v 2c -c public $IP 1.3.6.1.4.1.2021.10.1.3.3 | awk -F'STRING:' '{print $NF}'

#CPU:
#percentage of user CPU time
snmpwalk -v 2c -c public $IP 1.3.6.1.4.1.2021.11.9.0 | awk -F'INTEGER:' '{print $NF" %"}'
#percentages of system CPU time
snmpwalk -v 2c -c public $IP 1.3.6.1.4.1.2021.11.10.0 | awk -F'INTEGER:' '{print $NF" %"}'
#percentages of idle CPU time
snmpwalk -v 2c -c public $IP 1.3.6.1.4.1.2021.11.11.0 | awk -F'INTEGER:' '{print $NF" %"}'

#MEM:
#memTotalSwap
snmpwalk -v 2c -c public $IP 1.3.6.1.4.1.2021.4.3.0 | awk -F'INTEGER:' '{print $NF}' | awk '{print $1/1024" MB"}'
#memAvailSwap
snmpwalk -v 2c -c public $IP 1.3.6.1.4.1.2021.4.4.0 | awk -F'INTEGER:' '{print $NF}' | awk '{print $1/1024" MB"}'
#memTotalReal
snmpwalk -v 2c -c public $IP 1.3.6.1.4.1.2021.4.5.0 | awk -F'INTEGER:' '{print $NF}' | awk '{print $1/1024" MB"}'
#memAvailReal
snmpwalk -v 2c -c public $IP 1.3.6.1.4.1.2021.4.6.0 | awk -F'INTEGER:' '{print $NF}' | awk '{print $1/1024" MB"}'
#memBuffer
snmpwalk -v 2c -c public $IP 1.3.6.1.4.1.2021.4.14.0 | awk -F'INTEGER:' '{print $NF}' | awk '{print $1/1024" MB"}'
#memCached
snmpwalk -v 2c -c public $IP 1.3.6.1.4.1.2021.4.15.0 | awk -F'INTEGER:' '{print $NF}' | awk '{print $1/1024" MB"}'
#内存实际剩余空间=memAvailReal+memBuffer+memCached

#DISK:(在snmp.conf中必须打开 disk / 10000)
#dskTotal(根分区)
snmpwalk -v 2c -c public $IP 1.3.6.1.4.1.2021.9.1.6.1 | awk -F'INTEGER:' '{print $NF/1024/1024" MB"}'
#dskAvail(根分区)
snmpwalk -v 2c -c public $IP 1.3.6.1.4.1.2021.9.1.7.1 | awk -F'INTEGER:' '{print $NF/1024/1024" MB"}'
#dskUsed(根分区)
snmpwalk -v 2c -c public $IP 1.3.6.1.4.1.2021.9.1.8.1 | awk -F'INTEGER:' '{print $NF/1024/1024" MB"}'
#dskPercent(根分区)
snmpwalk -v 2c -c public $IP 1.3.6.1.4.1.2021.9.1.9.1 | awk -F'INTEGER:' '{print $NF" %"}'

##获取所有分区的磁盘空间使用情况
#先获取全部信息
snmpwalk -v 1 -c public $IP 1.3.6.1.2.1.25.2.3
#在全部信息中找出“hrStorageType”类的信息(分区类型:物理还是存储还是虚拟等等),信息中“hrStorageFixedDisk”代表物理磁盘,“hrStorageNetworkDisk”代表挂载的存储,最后取出物理磁盘信息的编号
-----------------------------------------------
HOST-RESOURCES-MIB::hrStorageType.31 = OID: HOST-RESOURCES-TYPES::hrStorageFixedDisk
HOST-RESOURCES-MIB::hrStorageType.35 = OID: HOST-RESOURCES-TYPES::hrStorageFixedDisk
HOST-RESOURCES-MIB::hrStorageType.36 = OID: HOST-RESOURCES-TYPES::hrStorageFixedDisk
-----------------------------------------------
#按照编号在全部信息中找出“hrStorageDescr”类的信息,取出对应的分区名字
-----------------------------------------------
HOST-RESOURCES-MIB::hrStorageDescr.31 = STRING: /
HOST-RESOURCES-MIB::hrStorageDescr.35 = STRING: /test
HOST-RESOURCES-MIB::hrStorageDescr.36 = STRING: /boot
-----------------------------------------------
#按照编号在全部信息中找出“hrStorageAllocationUnits”类的信息,取出对应分区的簇大小,注意这里的单位是【字节】
-----------------------------------------------
HOST-RESOURCES-MIB::hrStorageAllocationUnits.31 = INTEGER: 4096 Bytes
HOST-RESOURCES-MIB::hrStorageAllocationUnits.35 = INTEGER: 4096 Bytes
HOST-RESOURCES-MIB::hrStorageAllocationUnits.36 = INTEGER: 1024 Bytes
-----------------------------------------------
#按照编号在全部信息中找出“hrStorageSize”类的信息,取出对应分区的总空间,注意这里的单位是【kb】,代表拥有的簇的个数,先把簇大小换算成kb,再乘以簇个数,得出的就是空间大小并且单位是kb,如果前面不换算簇大小,那么后面得出的空间大小的单位就是字节了,最后还要换算为MB。 
-----------------------------------------------
HOST-RESOURCES-MIB::hrStorageSize.31 = INTEGER: 24797125
HOST-RESOURCES-MIB::hrStorageSize.35 = INTEGER: 145032289
HOST-RESOURCES-MIB::hrStorageSize.36 = INTEGER: 101086
-----------------------------------------------
#按照编号在全部信息中找出“hrStorageUsed”类的信息,取出对应分区的已使用空间大小,计算同上
-----------------------------------------------
HOST-RESOURCES-MIB::hrStorageUsed.31 = INTEGER: 19569085
HOST-RESOURCES-MIB::hrStorageUsed.35 = INTEGER: 103091229
HOST-RESOURCES-MIB::hrStorageUsed.36 = INTEGER: 11772
-----------------------------------------------
#按照“hrStorageSize”和“hrStorageUsed”计算出使用率

 

#获取网卡流量(单位:字节)
#网卡信息在 .1 里,这样可以查出所有的信息
snmpwalk -v 2c -c public $IP .1 | grep "^IF-MIB"
#获取网卡序号
snmpwalk -v 2c -c public $IP RFC1213-MIB::ifDescr
-----------------------------------------------
IF-MIB::ifDescr.1 = STRING: lo
IF-MIB::ifDescr.2 = STRING: eth0
IF-MIB::ifDescr.3 = STRING: eth1
IF-MIB::ifDescr.4 = STRING: sit0
-----------------------------------------------
#获取入口、出口流量
snmpwalk -v 2c -c public $IP RFC1213-MIB::ifInOctets
-----------------------------------------------
IF-MIB::ifInOctets.1 = Counter32: 2889517936
IF-MIB::ifInOctets.2 = Counter32: 859891476
IF-MIB::ifInOctets.3 = Counter32: 0
IF-MIB::ifInOctets.4 = Counter32: 0
-----------------------------------------------
snmpwalk -v 2c -c public $IP RFC1213-MIB::ifOutOctets
-----------------------------------------------
IF-MIB::ifOutOctets.1 = Counter32: 2889518264
IF-MIB::ifOutOctets.2 = Counter32: 2043742155
IF-MIB::ifOutOctets.3 = Counter32: 0
IF-MIB::ifOutOctets.4 = Counter32: 0
-----------------------------------------------
#根据网卡序号查找对应的流量。这个是累加值,可以用24点的值减去0点的值得出全天的流量;每隔5分钟查一次,两次之差就是这5分钟的流量;由于得到的数据单位是bytes,而且是5分钟的,所以需要乘以8(位)除以300(秒)得出bps(每秒的bit数),再除以1000得出kbps,汇总一天中各个5分钟查询的kbps,可以得出峰值和均值。需要注意:这些查出的数据是区分In和Out的,也就是说最后得到的应该是入口流量峰值、入口流量均值、出口流量峰值、出口流量均值,此服务器一天使用的带宽=各个5分钟查询结果的总和/1000000,得出的单位是比特位MB。

 

数据采集:dataColletion.sh

数据分析:dataAnalysis.sh

数据发送:dataSend.sh

数据每5分钟采集一次,汇总一天的数据后进行分析,分析得出峰值、均值以及异常值,将分析数据作为邮件附件,并且将异常值作为邮件正文发送。

 

 

缺点:SNMP是明文的,不建议在外网使用,在内网使用也应该设置好防火墙。