shell + python 服务器巡检,生成excel巡检报告
需求:过百台服务器需要巡检,考虑到人工巡检太浪费时间,于是写了如下脚本,每天定时统计各服务器资源使用情况,统一汇总到一台服务器,进行合并、转换excel
1、shell脚本统计系统资源使用情况,,根据阈值判断是否正常,生成txt文件
1 #!/bin/bash 2 #获取主机名 3 system_hostname=$(hostname | awk '{print $1}') 4 5 #获取服务器IP 6 system_ip=$(ifconfig eth0 |awk -F '[ :]+' 'NR==2{print $3}') 7 8 #获取总内存 9 mem_total=$(free -m | grep Mem| awk -F " " '{print $2}') 10 11 #获取剩余内存 12 mem_free=$(free -m | grep "Mem" | awk '{print $4+$6}') 13 14 #获取已用内存 15 mem_use=$(free -m | grep Mem| awk -F " " '{print $3}') 16 17 #获取当前平均一分钟负载 18 load_1=`top -n 1 -b | grep average | awk -F ':' '{print $5}' | sed -e 's/\,//g' | awk -F " " '{print $1}'` 19 20 #获取当前平均五分钟负载 21 load_5=`top -n 1 -b | grep average | awk -F ':' '{print $5}' | sed -e 's/\,//g' | awk -F " " '{print $2}'` 22 23 #获取当前平均十五分钟负载 24 load_15=`top -n 1 -b | grep average | awk -F ':' '{print $5}' | sed -e 's/\,//g' | awk -F " " '{print $3}'` 25 26 #过滤磁盘使用率大于50%目录,并加入描述 27 disk_1=$(df -Ph | awk '{if(+$5>50) print "分区:"$1,"总空间:"$2,"使用空间:"$3,"剩余空间:"$4,"磁盘使用率:"$5}') 28 29 #拆分 30 disk_fq=$(df -Ph | awk '{if(+$5>50) print "分区:"$1}') 31 disk_to=$(df -Ph | awk '{if(+$5>50) print "总空间:"$2}') 32 disk_us=$(df -Ph | awk '{if(+$5>50) print "使用空间:"$3}') 33 disk_fe=$(df -Ph | awk '{if(+$5>50) print "剩余空间:"$4}') 34 disk_ul=$(df -Ph | awk '{if(+$5>50) print "磁盘使用率:"$5}') 35 disk_ux=$(df -Ph | awk '{if(+$5>50) print $5}') 36 37 #文件路径 38 path=/home/monitor_"$system_ip".txt 39 40 #内存阈值 41 mem_mo='50' 42 43 44 echo -e " " > $path 45 echo -e "主机名:"$system_hostname >> $path 46 echo -e "服务器IP:"$system_ip >> $path 47 if [[ $(echo $disk_ux | sed s/%//g) -gt 50 ]] 48 then 49 echo $disk_fq >>$path 50 echo $disk_to >>$path 51 echo $disk_us >>$path 52 echo $disk_fe >>$path 53 echo $disk_ul >>$path 54 echo 磁盘巡检状态:不正常 >>$path 55 else 56 echo $disk_fq >>$path 57 echo $disk_to >>$path 58 echo $disk_us >>$path 59 echo $disk_fe >>$path 60 echo $disk_ul >>$path 61 echo 磁盘巡检状态:正常 >>$path 62 fi 63 PERCENT=$(printf "%d%%" $(($mem_use*100/$mem_total))) 64 PERCENT_1=$(echo $PERCENT|sed 's/%//g') 65 if [[ $PERCENT_1 -gt $mem_mo ]] 66 then 67 echo -e 总内存大小:$mem_total MB>> $path 68 echo -e 已用内存:$mem_use MB >> $path 69 echo -e 内存剩余大小:$mem_free MB >> $path 70 echo -e 内存使用率:$PERCENT >> $path 71 echo -e 内存巡检状态:不正常 >> $path 72 else 73 echo -e 总内存大小:$mem_total MB>> $path 74 echo - 已用内存:$mem_use MB >> $path 75 echo -e 内存剩余大小:$mem_free MB >> $path 76 echo -e 内存使用率:$PERCENT >> $path 77 echo 内存巡检状态:正常 >> $path 78 fi 79 echo -e 平均1分钟负载:$load_1"\n"平均5分钟负载:$load_5"\n"平均15分钟:$load_15 >> $path
执行效果:
主机名:i**** 服务器IP:172**** 分区:/dev/vda1 总空间:20G 使用空间:11G 剩余空间:7.9G 磁盘使用率:58% 磁盘巡检状态:不正常 总内存大小:3789 MB 已用内存:2117 MB 内存剩余大小:1672 MB 内存使用率:55% 内存巡检状态:不正常 平均1分钟负载:0.07 平均5分钟负载:0.03 平均15分钟:0.05
2、python将txt文件转换成excel,不正常巡检结果标记红色
1 #!/usr/bin/python 2 # -*- coding: UTF-8 -*- 3 import xlwt 4 import datetime 5 style = "font:colour_index red; align: wrap on, vert centre, horiz center;" 6 styleb = xlwt.XFStyle() # 创建一个样式对象,初始化样式 7 al = xlwt.Alignment() 8 al.horz = 0x02 # 设置水平居中 9 al.vert = 0x01 # 设置垂直居中 10 styleb.alignment = al 11 red_style = xlwt.easyxf(style) 12 title_style = xlwt.easyxf('font: height 200, name Arial Black, colour_index blue, bold on; align: wrap on, vert centre, horiz center;' ) 13 def getlist(): # 读取txt 14 with open('hebing.txt', 'r+',encoding='utf-8') as f: 15 s1 = f.readlines() 16 f.close() 17 s2 = [] 18 for i in s1: 19 if '\n' in i: 20 s2.append(i[:-1]) 21 else: 22 s2.append(i) 23 return s2 24 def fenge(): # 分割 25 list0 = [] # 存贮空格行 26 for num, val0 in enumerate(getlist()): 27 if val0.split(':')[0] == '主机名': 28 list0.append(num) 29 list0.append(len(getlist())) 30 list1 = [] # 存贮内容 31 for num1,val1 in enumerate(list0[1:]): 32 temp = getlist()[list0[num1]:list0[num1+1]] 33 list1.append(temp) 34 return list1 35 def wxls(): # 写入表格 36 title = ['主机名','服务器IP','分区','总空间','使用空间','剩余空间','磁盘使用率','磁盘巡检状态','总内存大小', 37 '已用内存','内存剩余大小','内存使用率','内存巡检结果','平均1分钟负载','平均5分钟负载','平均15分钟', 'ceshi'] 38 workbook = xlwt.Workbook(encoding='utf-8') 39 worksheet = workbook.add_sheet('sheet1') 40 for i1, val in enumerate(title): 41 worksheet.write(0, i1, label=val,style = title_style) 42 first_col = worksheet.col(i1) 43 first_col.width = 180 * 20 44 for i2, val2 in enumerate(title): 45 for i3, val3 in enumerate(fenge()): 46 for j in val3: 47 if j.split(':')[0] == val2: 48 #print i2,i3,j.split(':')[1].decode('utf8') 49 if j.split(':')[1] == '不正常': 50 worksheet.write(i3 + 1, i2, label=j.split(':')[1],style=red_style) 51 else: 52 worksheet.write(i3+1, i2, label=j.split(':')[1] ,style = styleb) 53 name = 'miontior.xls' 54 workbook.save(name) 55 wxls()
执行效果: