通过DJANGO实现从WEB端对服务器的批量或单机巡检,打印到EXCEL表格并下载
后台的实现和前面写的LINUX服务器批量巡检的PYTHON脚本,是一样的,只不过增加了单机检查和EXCEL下载的功能,并且可以从WEB端巡检,不用登陆服务器就能实现
urls.py
url(r'^infos/', views.infos,name='infos'),
views.py 注意在views.py加入from django.http import FileResponse
@login_required
def infos(request):
listall=[]
if request.method=="POST":
if request.POST.has_key("loadall"):
listall=std.readinfo("ips.txt")
#listall=many.relists("ips.txt")
return render(request,"setinfos.html",{"tmplists":listall})
if request.POST.has_key("exports"):
listall=std.readinfo("ips.txt")
filenames=std.trywexrestr(listall)
files=open('./files/'+ str(filenames),'rb')
response =FileResponse(files)
response['Content-Type']='application/octet-stream'
response['Content-Disposition']='attachment;filename='+ filenames
return response
else:
ips=request.POST.get("ip")
listone=many.sshexeccmd(ips)
return render(request,"setinfo.html",{"tmplist":listone})
else:
return render(request,"setinfos.html")
然后在std.py加入前面写过的LINUX服务器批量巡检用到的几个方法,
std.py
def sshexeccmd(ip):
tmplist = {}
tmplist["ip"]=ip
tmplist["diskall"]=None
tmplist["diskuse"]=None
tmplist["cpuuse"]=None
tmplist["momeryall"]=None
tmplist["momeryuse"]=None
tmplist["appall"]=None
tmplist["appuse"]=None
try:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# pkey = paramiko.RSAKey.from_private_key_file('/home/super/.ssh/id_rsa', password='yourpassword')
pkey = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa')
ssh.connect(hostname=ip,port=22,username='root',pkey=pkey)
stdindiskall, stdoutdiskall, stderrdiskall = ssh.exec_command("df -hP | awk '/\/$/ {print $2}'")
stdindisk, stdoutdisk, stderrdisk = ssh.exec_command("df -hP | awk '/\/$/ {print $5}' | sed s'/%//'")
stdindcpu, stdoutcpu, stderrcpu = ssh.exec_command("top -bn1 | awk '/Cpu/{print $2,$3,$4}' | sed 's/[a-z]//g' | sed 's/ //g' | awk -F',' '{print $1+$2+$3}'")
stdinmomeryall, stdoutmomeryall, stderrmomeryall = ssh.exec_command("free -m | awk '{print $2}' | awk 'NR==2{print}'")
stdinmomery, stdoutmomery, stderrmomery = ssh.exec_command("free | sed -n '2p' |awk '{printf ($2-$7)/$2*100}'")
stdinappsall, stdoutappsall, stderrappsall = ssh.exec_command("df -hP /apps | awk '{print $2}' | awk 'NR==2{print}'")
stdinapps, stdoutapps, stderrapps = ssh.exec_command("df -hP /apps | awk '{print $5}' | sed s'/%//' | awk 'NR==2{print}'")
#print ip+ " "+(stdoutdiskall).read().replace("\n", "")+" " +(stdoutdisk.read()).replace("\n", "")+" "+(stdoutcpu.read()).replace("\n", "")+" "+(stdoutmomeryall.read()).replace("\n", "")+" "+(stdoutmomery.read())+\
# " " + (stdoutappsall).read().replace("\n", "") + " " + (stdoutapps).read().replace("\n", "")
# print(stderr.read())
tmplist["ip"]=ip
tmplist["diskall"]=(stdoutdiskall).read().replace("\n", "")
tmplist["diskuse"]=(stdoutdisk.read()).replace("\n", "")
tmplist["cpuuse"]=(stdoutcpu.read()).replace("\n", "")
tmplist["momeryall"]=(stdoutmomeryall.read()).replace("\n", "")
tmplist["momeryuse"]=(stdoutmomery.read())
tmplist["appall"]=(stdoutappsall).read().replace("\n", "")
tmplist["appuse"]=(stdoutapps).read().replace("\n", "")
print tmplist
ssh.close()
return tmplist
except Exception,e:
print e
return tmplist
def trywexrestr(lists):
nowtime=time.strftime('%Y-%m-%d-%H-%M-%S',time.localtime(time.time()))+""
bookurl="./files/"+nowtime+'info.xlsx'
filenames=nowtime+'info.xlsx'
workbook1 = xlsxwriter.Workbook(bookurl)
worksheet = workbook1.add_worksheet()
title=[u'IP地址',u'根目录大小',u'根目录使用百分比',u'CPU使用率',u'内存总量',u'内存使用率',u'apps大小'\
,u'apps使用率']
format=workbook1.add_format()
worksheet.set_column(0,15,20)
format.set_bold()
worksheet.write_row('A1',title,format)
row=1
#col=1
for a in lists:
worksheet.write(row,0,a["ip"])
worksheet.write(row,1,a["diskall"])
worksheet.write(row,2,a["diskuse"])
worksheet.write(row,3,a["cpuuse"])
worksheet.write(row,4,a["momeryall"])
worksheet.write(row,5,a["momeryuse"])
worksheet.write(row,6,a["appall"])
worksheet.write(row,7,a["appuse"])
row=row+1
workbook1.close()
filenames=str(filenames)
return filenames
def readinfo(ips):
myfile=open(ips,'r')
listall=[]
for line in myfile:
ip=line.strip()
lists=sshexeccmd(ip)
listall.append(lists)
return listall
简单写前端的HTML,因为加入了单机的巡检,这样views.py引用了两个HTML,setinfo.html,setinfos.html,内容差别只有一点
cat setinfos.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form id="loginForm" action="{% url 'infos' %}" method="POST"> {% csrf_token %}
服务器IP<input type="text" class="form-control" name="ip" placeholder="服务器IP"></br>
<button class="btn btn-success btn-block" name="loadone" type="submit">
<b>加载信息</b>
</button>
</br>
</br>
<button class="btn btn-success btn-block" name="loadall" type="submit">
<b>加载全部主机信息</b>
</button>
</br>
</br>
<button class="btn btn-success btn-block" name="exports" type="submit">
<b>导出全部主机信息</b>
</button>
{% for tmplist in tmplists %}
<h4 style="color: black"><b>主机IP:{{ tmplist.ip }}</b></h4>
<h4 style="color: black"><b>根目录大小:{{ tmplist.diskall }}</b></h4>
<h4 style="color: black"><b>根目录使用百分比:{{ tmplist.diskuse }}</b></h4>
<h4 style="color: black"><b>CPU使用率:{{ tmplist.cpuuse }}</b></h4>
<h4 style="color: black"><b>内存总量:{{ tmplist.momeryall }}</b></h4>
<h4 style="color: black"><b>内存使用率:{{ tmplist.momeryuse }}</b></h4>
<h4 style="color: black"><b>APP分区大小:{{ tmplist.appall }}</b></h4>
<h4 style="color: black"><b>APP使用率:{{ tmplist.appuse }}</b></h4>
</br>
<hr style="height:3px;border:none;border-top:3px double red;" />
{% endfor %}
<h4 style="color: red"><b>{{ login_err }}</b></h4>
</form>
</body>
用不同的颜色突出显示内存的使用情况,超过90%用红色显示,可用如下方法渲染模板:
<h4 style="color:{% if tmplist.momeryuse|floatformat:"0"|add:"0" >= 90 %}red{% else %}black{% endif %}"><b>内存使用率:{{ tmplist.momeryuse|floatformat:"0" }}</b></h4>
可以先用uwsgi启动看看,sudo uwsgi --http :8001 --chdir /路径/路径/dj27test --wsgi-file dj27test/wsgi.py --http-timeout 100 &
页面比较简陋,是这样的
可以实现加载单机或批量主机的信息,或者导出全部主机的信息到EXCEL表格并下载
注意:在CENTOS6中内存百分比的计算命令可能不准确,这个命令可以通用CENTOS6和CENTOS7
stdinmomery, stdoutmomery, stderrmomery = ssh.exec_command("free -l | sed -n '2p'| awk '{printf $3/$2*100}'")