网络简单监控邮件告警

Shell脚本监控

之前自己搭建了一套Grafana+Zabbix的监控,但是还没研究透彻,只采用了server端进行监控,找时间再学习一下部署agent做分布式监控。Grafana展示user/passwd:guest/guest


这次是根据公司线上业务,部署在了IDC服务器中,来测试节点间的网络质量,如果出现丢包率大的情况即发送邮件报警。

主要目的是为了记录、交流学习,请不要随意粘贴使用,可能会出现不匹配的情况。

  • 主脚本如下:

            探测脚本,大概逻辑是先循环赋值写好的ip列表,然后进行ping探测(两次),如果出现丢包则执行MTR,然后输出到文件,然后利用htm和发邮件脚本执行发送。

#!/bin/bash

for i in `cat /home/yangyang14/upcm` #循环读取探测ip
    do
        #loss=$( ping -c 30 -i 0.2  $i | grep loss | awk '{print $6}') 
        los=$(ping -c 30 -i 0.2  $i | grep loss | awk '{print $6}' | awk -F '%' '{print $1}') #ping向列表中的ip并取loss参数
        RTT=$(ping -c 1 -i 0.2  $i | grep avg) #取RTT参数
        t=$(date "+-%Y-%m-%d %H:%M:%S") #记录详细系统时间
        t2=$(date "+-%Y-%m-%d") #记录系统日期
        name=$(grep $i /home/yangyang14/name |awk -F '-' '{print $1 }') #上层节点名,自己做的:名称-IP对应表
        host=$(hostname |awk -F '.' '{print $1}') #边缘节点名,取本机hostname
        myip=$(cat /etc/sysconfig/network-scripts/ifcfg-eth0 | grep IPADDR | awk -F '=' '{print $2}') #取本机ifcfg-eth0里的ip信息
        if [[ $los -lt 3 ]] #判断丢包不大于3个
            then
                echo "---------------- $t ----------------" >> /home/yangyang14/monitor/$name-ping 
                echo "$t-$name-$i "loss:$loss"" >> /home/yangyang14/monitor/$name-ping #记录ping丢包数值
                echo "$t-$name-$i $RTT" >> /home/yangyang14/monitor/$name-ping
                echo --------------------------------------- >> /home/yangyang14/monitor/$name-ping
                echo " " >> /home/yangyang14/monitor/$name-ping
            else
                echo "---------------- $t ------------------" >> /home/yangyang14/monitor/$t2-$name-mtr
                echo "$t-$name-$i "loss:$loss"" >> /home/yangyang14/monitor/$t2-$name-mtr
                sudo mtr -n -r $i >> /home/yangyang14/monitor/$t2-$name-mtr #记录第一次丢包时的mtr信息到monitor文件夹下,但是不做报警
                pingloss=$(ping -c 50 -i 0.5  $i | grep loss | awk '{print $6}' | awk -F '%' '{print $1}') #为了防止误报需要再次ping测试
                    if [[ $pingloss -lt 3 ]] #为了防止误报需要再次判断丢包
                        then
                            echo " "
                        else
                            echo "---------------- $t ------------------" >> /home/yangyang14/$t2-mtr
                            echo "$host:[$myip]-->$name:[$i] "loss:$pingloss"" >> /home/yangyang14/$t2-mtr #打印相关变量信息
                            echo "pingloss:$host-->$name-$i-loss:$pingloss%" >> //home/yangyang14/host #打印信息用于邮件主题,调用到py脚本使用。
                            sudo mtr -n -r -c 100 -i 0.1 $i >> /home/yangyang14/$t2-mtr #把MTR信息存入到文件中
                            sudo sed 's/ /`/g' /home/yangyang14/$t2-mtr > htmmtr #修改文件中的信息给htm.sh使用
                            echo "边缘节点:[$myip][sudo mtr -n -i 0.1 $i]" >> /home/yangyang14/htmmtr #记录文本,在邮件中直接测试使用
                            echo "上层节点:[$i][sudo mtr -n -i 0.1 -a $i $myip]" >> /home/yangyang14/htmmtr #记录文本,在邮件中直接测试使用
                            /bin/sh /home/yangyang14/htm.sh #执行htm.sh脚本,生成邮件发送文本
                            /usr/bin/python video_mail.py #执行发送邮件脚本,完成发送邮件动作。
                            rm -f /home/yangyang14/host
                            rm -f /home/yangyang14/$t2-mtr
                            rm -f /home/yangyang14/htmmtr
                            rm -f /home/yangyang14/mailmtr #删除无用文本,不删除monitor中的文本,做定时任务8天清空
                     fi
        fi
    done

  • 辅助脚本如下:

  1. 脚本下发、ip列表下发、添加定时任务
  2. 输出文件转换HTM格式
  3. 利用python脚本发送文件至邮箱


脚本下发、ip列表下发、添加定时任务:

#!/bin/bash

for i in `cat /home/yangyang14/monitor/ctip`    #下发所有边缘节点
        do
          echo ----------------sending-$i--------------------
          scp /home/yangyang14/monitor/htm.sh yangyang14@$i:/home/yangyang14/
          scp /home/yangyang14/monitor/video_mail.py yangyang14@$i:/home/yangyang14/
          #scp /home/yangyang14/monitor/name yangyang14@$i:/home/yangyang14/     #下发name列表
          scp /home/yangyang14/monitor/upct yangyang14@$i:/home/yangyang14/    #下发上层探测列表
          scp /home/yangyang14/monitor/ctping.sh yangyang14@$i:/home/yangyang14 #下发执行ping执行脚本
          #ssh $i 'mkdir /home/yangyang14/monitor'       #创建ping结果保留目录
          #ssh $i '(echo "*/3 * * * * /bin/sh /home/yangyang14/ctping.sh" ; echo  "0 0 */8 * * rm -f /home/yangyang14/monitor/*" ) | crontab'    #添加计划任务3分钟执行一次探测 #保留7天数据8天删除一次monitor下的文件
          ssh $i 'crontab -l'
          echo ----------------------------------------------
          echo " "
        done


输出文件转换HTM格式

# !/bin/sh
 
file_input='/home/yangyang14/htmmtr' #带转换的文件
file_output='mailmtr' #转换后输出的文件,提交给mail脚本使用
 
td_str='' #此处为邮件正文开头,因为不太需要所以就注释掉了
#function create_html_head(){
 # echo -e "
 #   
  #    

各位好!

#

节点丢包信息如下:

" #} function create_table_head(){ echo -e "" } function create_td(){ # if [ -e ./"$1" ]; then echo $1 td_str=`echo $1 | awk 'BEGIN{FS="|"}''{i=1; while(i<=NF) {print "";i++}}'` echo $td_str # fi } function create_tr(){ create_td "$1" echo -e " $td_str " >> $file_output } function create_table_end(){ echo -e "
"$i"
" } function create_html_end(){ echo -e "" } function create_html(){ rm -rf $file_output touch $file_output create_html_head >> $file_output create_table_head >> $file_output while read line do echo $line create_tr "$line" done < $file_input create_table_end >> $file_output create_html_end >> $file_output } create_html


利用python脚本发送文件至邮箱

#!/usr/bin/env python
# coding:utf-8
import datetime
import time
import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
#import  socket
f = open('/home/yangyang14/host')
host = f.read().strip()
f.close()


def send_mail():
    date = (datetime.datetime.today()-datetime.timedelta(days=1)).strftime('%Y-%m-%d')
    html_file = "mailmtr" #发送的文件名称
    username = "yangyang14"
    password = "*******"
    from_addr = "[email protected]" #发送人
    to_addr = ["[email protected]"] #被发送人 #to_addr = [""]
    messages = ''
    fd = open(html_file,"r")
    lines = fd.readlines()
    fd.close()
    for line in lines:
        messages += line
    #video_cdn_IP-2016-11-01.xlsfd.close()
    msg = MIMEMultipart()
    msg['From'] = from_addr
    msg['To'] = ','.join(to_addr)
    #msg['Cc'] = cc_addr
    msg['Subject'] = host + date
    msg.attach(MIMEText(messages, 'html', 'utf-8'))

    # 带上二进制附件
    attachname = "mailmtr"
    att = MIMEText(open(attachname, 'rb').read(), 'base64', 'gb2312')  
    att["Content-Type"] = 'application/octet-stream'  
    att['content-disposition'] = 'attachment; filename="%s"' % attachname
    msg.attach(att) smtp = smtplib.SMTP()
    #smtp.set_debuglevel(1)
    smtp.connect('bjmail.kingsoft.com', 587)
    smtp.starttls()
    smtp.login(username, password)
    smtp.sendmail(from_addr, to_addr, msg.as_string())
    smtp.quit()

if __name__ == "__main__":
    #hostname = socket.gethostname()
    #host=hostname.split('.')[0]
    send_mail()


从编写的排版上应该能看出来,htm脚本和邮件脚本不是我写的,前面两个脚本是根据公司线上业务环境编写的,因为服务器之间有key钥免密码登陆所以才可以自由的跳转。如果没有得需要考虑其他办法,比如自动填写密码的脚本。

部署完成后大概使用了一个星期,效果还可以,下面我截一些图。

利用scp脚本下发至所有服务器

本地保存的文件(用于查后账,7天自动清空)

生成的邮件告警

下图右侧为mtr详细输出的报告模式,最下面文本的目的是可以快速登录服务器进行故障复现,提供双向MTR并向运营商报障使用。

这样做基本上可以做到丢包告警的功能,但是会有很多误报出现,比如说在业务关系上并没有业务来往的两个节点也同样会出现报警,比如西北部地区的节点到东部地区的节点。这种长传出现的丢包情况比较多。

通过邮件自带的筛选功能也可以筛选出需要查看的源机房以及目的机房的所有丢包情况,便于判断问题,同样利于向运营商保障,右侧详情可以查看到丢包的mtr报告。

你可能感兴趣的:(网络运维,Shell,Python)