背景及思路:

五一小长假之前,公司要求我做一次服务器巡检。

1、写了一个简单的脚本获取服务器的各种基础信息:cpu,内存,swap分区使用情况,磁盘,网卡信息种种,具体见脚本,将这些信息追加到一个文件中,然后在监控机上做一次汇总,汇总方式就不详谈,我用的是for循环ssh追加

2、然后利用python的xlsxwriter模块生成excel

3、最后利用python发带附件为excel的邮件到指定邮箱


获取服务器信息部分脚本:

#取所需要的内网IP
Int_ip=`ifconfig|awk '/inet addr/ {gsub(/:/," ");print $3}'|egrep "^192.168.18"|head -1`
#取除该内网ip以及127.0.0.1之外的所有ip
Out_ip_list=`ifconfig|awk '/inet addr/ {gsub(/:/," ");print $3}'|grep -v $Int_ip|grep -v 127.0.0.1`
#取内存总值,单位为G,四舍五入
Memory=`free -m|awk '/Mem/ {printf ("%.f\n",$2/1024)}'`
#取内存fr
ee值,从系统角度看,取的是第一行的free
Memory_free=`free -m|awk '/Mem/ {printf "%.f\n",$4/1024}'`
#取CPU核数
Cpu_num=`grep processor /proc/cpuinfo|wc -l`
#取服务器运行时间
Uptime=`uptime|awk '{print $3}'`
#取最近15分的负载
Load=`uptime|awk '{print $12}'`
#取磁盘大于80%的磁盘目录
Disk=`df -h|awk '{a=+$(NF-1);if(a>=80)print $NF}'`
#swap分区总值,单位为G,四舍五入
Swap=`free -m|awk '/Swap/ {printf ("%.f\n",$2/1024)}'`
#swap分区
Swap_free=`free -m|awk '/Swap/ {printf "%.f\n",$4/1024}'`

生成excel
excel.py:
#!/usr/bin/python
# -*- coding: utf-8 -*-
from xlsxwriter import workbook
import ConfigParser
import time
import sendmail
def write_excel(file):
    '''
    1、设置 Excel 样式
    2、将数据写入到 Excel 中
    '''
    # 生成 Excel 文件
    work = workbook.Workbook(file)
    # 建立工作表,表名默认
    worksheet = work.add_worksheet()
    # 设置字体加粗、字体大小
    format_title = work.add_format({'bold': True, 'font_size': 16})
    # 设置水平对齐、垂直对齐
    format_title.set_align('center')
    format_title.set_align('vcenter')
    format_body = work.add_format({'font_size': 14})
    # 设置样式,行高、列宽
    worksheet.set_row(0, 25)
    worksheet.set_column(0, 7, 30)
    worksheet.set_column(8,9,50)
    worksheet.set_column(9,10,100)
    # 定义表头
    title = (
        '服务器IP',
        '内存大小 GB',
        '内存剩余 GB',
        'Swap大小 GB',
        'Swap剩余 GB',
        '运行时间 天',
        '系统负载 ',
        'CPU 核数',
        '磁盘超过80%',
        '其余IP',
    )
    row = 0
    col = 0
    #写入表头
    for item in title:
        item = unicode(item,"utf-8")
        worksheet.write(row, col, item, format_title)
        col+=1
    #写入数据
    cf = ConfigParser.ConfigParser()
    cf.read('/data/scripts/excel/config_total.txt')
    for ip in cf.sections():
        row+=1
        col = 0
        for opt in cf.options(ip):
            key=cf.get(ip,opt)
            worksheet.write(row,col,key,format_body)
            col+=1
    work.close()
if __name__ == '__main__':
    Excel_name = "Server_%s.xls" %(time.strftime("%Y-%m-%d", time.localtime()))
    write_excel(Excel_name)
    sendmail.send_mail('********@139.com','服务器巡检表格','fuliao server message',Excel_name)

sendmail.py:

#!/usr/bin/python
import smtplib
from email.header import Header
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
import sys
mail_host = 'smtp.163.com'
mail_user = '163邮箱账号'
mail_pass = '163邮箱密码'
mail_postfix = '163.com'
def send_mail(to_list,subject,content,name):
    me = mail_user+"<"+mail_user+"@"+mail_postfix+">"
    msg = MIMEMultipart()
    msg['Subject'] = subject
    msg['From'] = me
    msg['to'] = to_list
    msg.attach(MIMEText(content))
    part = MIMEApplication(open(name,'rb').read())
    part.add_header('Content-Disposition','attachment', filename=name)
    msg.attach(part)
    try:
        s = smtplib.SMTP()
        s.connect(mail_host)
        s.login(mail_user,mail_pass)
        s.sendmail(me,to_list,msg.as_string())
        s.close()
        return True
    except Exception,e:
        print str(e)
        return False

最后生成的excel图:

wKioL1cr8PPRcfyVAAFa5EtDTUg559.png

效果在上面


ps:上传文件非法,需要脚本的留个邮箱吧,不好意思