python自動化巡檢 使用xlsxwriter模板完成nginx趨勢圖

前言:

  來到新公司,領導下發了個需求:每週需要對服務器進行一個巡檢,以及分析ngxin趨勢,由於公司實際生產環境服務器不是特別多,考慮暫時先用腳本完成該需求。

大致思路:收集數據 -> 寫入excel製成圖表  -> 發郵件 


一、收集nginx數據

  主要是對nginx log進行一個分析,統計數據。公司使用系統自帶的logrotate切割nginx日誌,只保存10天日誌,並且壓縮起來,使用shell分析出來會出現兩個日期,遂:將日誌文件拷貝到其他路徑,解壓,並逐個分析,腳本如下:

#!/bin/bash
LogName=nginx.access.log*              #日誌文件名
LogPath=/var/log/nginx/nginx.access.log*    #日誌路徑
NginxPath=/data/scripts/NginxLog/         #解壓日誌路徑
Filename=/data/scripts/NginxLog/nginx.log    #數據收集文件
Temporary=/data/scripts/NginxLog/temporary   #一個臨時文件
#拷貝文件並解壓
`cp $LogPath $NginxPath`            
`gunzip  $NginxPath$LogName`
#由於日誌有兩個日期,比較蛋疼,下面輸出結果爲:13/May/2016 xxxx
function Nglog()
{
        for i in `awk 'gsub(/\[/," ",$0)' $1|awk -F ":| " '{++S[$5]}END {for (i in S) print i}'`
        do
        num=`grep "$i" $1|awk '{print $1}'|sort|uniq -c |wc -l`
        echo $i $num
        done
}
#目錄下所有日誌進行分析
for i in `ls $NginxPath|grep nginx.access.log`
do
    Nglog $NginxPath$i >> $Temporary
done
#去掉2016,輸入到日誌
ACC=`awk '{a[$1]+=$2}END{for(i in a)print i,a[i]}' $Temporary|sort|sed 's/\/[0-9]\{4\}//g'`
echo  "$ACC" > $Filename
#刪除臨時文件以及日誌文件
rm -rf $Temporary
rm -rf $NginxPath$LogName


這樣就把日誌收集起來,那麼如何保存舊數據與新數據呢?

在根目錄寫另外一個腳本,每次執行前都把名字改成舊數據文件名

`mv $DataFile $LastData`



二、製成圖表

使用xlsxwriter生成,部分代碼如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import xlsxwriter
import time
import linecache
DataFile='/data/scripts/ServerData'
LastFile='/data/scripts/LastData'
###處理nginx日誌
new_data = ngdata(DataFile)
last_data = ngdata(LastFile)
new_item=[]
new_value=[]
last_item=[]
last_value=[]
for i in new_data:
    new_item.append(i.split()[0])
    new_value.append(int(i.split()[1]))
for l in last_data:
    last_item.append(l.split()[0])
    last_value.append(int(l.split()[1]))
###創建excel表格
Excel_name = "Server_%s.xlsx" % (time.strftime("%Y-%m-%d",time.localtime()))
workbook = xlsxwriter.Workbook(Excel_name)
worksheet = workbook.add_worksheet()
###項目的樣式
ItemStyle = workbook.add_format({
        'font_size':10,
        'bold':True,
        'bg_color':'#101010',
        'font_color':'#FEFEFE',
        'align':'center',
        'align':'vcenter',
        'top':2,
        'left':2,
        'right':2,
        'bottom':2
})
###目標值的樣式
ValueStyle = workbook.add_format({
        'font_size':9,
        'font_color':'#151515',
        'align':'center',
        'align':'vcenter',
        'top':2,
        'left':2,
        'right':2,
        'bottom':2
})
###寫入nginx 數據
row2 = 69
col2 = 0
col3 = 0
row3 = 74
col4 = 0
col5 = 0
worksheet.insert_textbox('D68','Nginx_New_Data',{'fill':{'none':True},'width':150,'height':35})
worksheet.insert_textbox('D73','Nginx_Last_Data',{'fill':{'none':True},'width':150,'height':35})
for nt in new_item:
    worksheet.write(row2,col2,nt,ItemStyle)
    col2 += 1
for nv in new_value:
    worksheet.write(row2+1,col3,nv,ValueStyle)
    col3 += 1
for lt in last_item:
    worksheet.write(row3,col4,lt,ItemStyle)
    col4 +=1
for lv in last_value:
    worksheet.write(row3+1,col5,lv,ValueStyle)
    col5 +=1
###Nginx圖表
NginxChart = workbook.add_chart({'type':'line'})
#定義最新數據的線條顏色等
NginxChart.add_series({
    'categories':'=Sheet1!$A$70:$I$70',    
    'values':'=Sheet1!$A$71:$I$71',        
    'data_labels':{'value':True},
        'name':'New Data',
        'line':{
            'color' : '#4A4AFF',
            'width':2,
    },
})
#定義舊數據線條顏色等
NginxChart.add_series({
    'values':'=Sheet1!$A$76:$I$76',
        'name':'Last Data',
        'line':{
            'color' : '#BEBEBE',
            'dash_type':'dash_dot',
            'width':1,
    },
})
NginxChart.set_y_axis({'name':'Nginx'})
worksheet.insert_chart('A78',NginxChart)
workbook.close()

效果圖:

wKiom1c1im7hGi5UAAJ4euCgycE420.jpg



三、發送郵件

生成excel後,發送郵件,部分代碼如下:

import smtplib
from email.mime.text import MIMEText
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
sender = '郵箱地址'
receiver = ['發送人列表']
subject = 'Server Inspection(%s)' %(time.strftime("%Y.%m.%d",time.localtime()))
smtpserver = 'smtp.163.com'
username = '用戶名'
password = '密碼'
msg = MIMEMultipart('alternative')
msg['Subject'] = subject
html = """\
郵件正文
"""
part = MIMEText(html,'html','utf-8')   #!這個地方要指定編碼,不然發郵會出現亂碼
msg.attach(part)
att = MIMEText(open(Excel_name,'rb').read(),'base64','utf-8')
att["Content-Type"] = 'application/octet-stream'
att["Content-Disposition"] = 'attachment;filename=Server.xlsx'
msg.attach(att)
smtp = smtplib.SMTP()
smtp.connect('smtp.163.com')
smtp.login(username,password)
smtp.sendmail(sender,receiver,msg.as_string())
smtp.quit()


最後

  將腳本加入任務計劃,定製時間執行。


附上最後包裝效果:

wKioL1c1jO2jPaUjAAI1y6z0F3Y058.jpgwKiom1c1jI_xFGCGAALX98H2yH0847.jpg

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章