通过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}'")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值