python实现运维自动巡检功能,五分钟巡检一次,并将不通的地址发送邮件通知

      苦逼的运维工程师,每天做着重复的工作,如果没有自动化的工具协助,真的是无法面对繁重的工作。尤其是服务器、交换机需要24小时在线,运维工程师不可能24小上班,于是自动化运维工具必不可少。

      自从学习python已有半年时间,最近完成了一个python脚本,实现五分钟巡检一次,并将不通的地址发送邮件通知。

实现条件:1、在.py文件同目录下建立doip.txt,里面保存要巡检的IP地址。如下图:

                         360截图20191113151921740.jpg


具体代码如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os
import re
import datetime
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib
import time
def ceshi01(ip,jieguo):
    jieguo=''
    mingling = 'ping ' + ip + ' -n 1'  # 形成ping命令
    # print(mingling)
    ping = os.popen(mingling).read()  # 执行1次ping命令
    #print(ping)
    if re.compile(r'来自..+', re.M).findall(ping):  # 判断是否通
        jieguo = '通'
    else:
        jieguo = '不通'
    return jieguo
def sendmail(ip):
    def _format_addr(s):
        name, addr = parseaddr(s)
        #print(name, addr)
        return formataddr((Header(name, 'utf-8').encode(), addr))
    # Email地址和口令
    from_addr = '*******@126.com'
    password = '*******'
    # 收件人地址
    to_addr = '*******@126.com'
    # SMTP服务器地址
    smtp_server = 'smtp.126.com'
    # 参数1.邮件正文  参数2MIME的subtype,plain表示纯文本,最终的MIME就是text/plain,
    # 最后一定要用utf-8编码保证多语言的兼容性
    # 如果发送HTML邮件 把HTML字符串传进去 把plain变为html
    msg = MIMEText('IP地址为'+str(ip), 'plain', 'utf-8')
    # 注意不能简单地传入name <[email protected]>,因为如果包含中文,需要通过Header对象进行编码。
    msg['From'] = _format_addr('管理员<%s>' % from_addr)
    # msg['To']接收的是字符串而不是list,如果有多个邮件地址,用,分隔即可。
    # 你看到的收件人的名字很可能不是我们传入的管理员,因为很多邮件服务商在显示邮件时,
    # 会把收件人名字自动替换为用户注册的名字,但是其他收件人名字的显示不受影响。
    msg['To'] = _format_addr('管理员<%s>' % to_addr)
    msg['Subject'] = Header('巡检结果', 'utf-8').encode()
    # SMTP协议默认端口是25
    server = smtplib.SMTP(smtp_server, 25)
    # 打印出和SMTP服务器交互的所有信息。
    # SMTP协议就是简单的文本命令和响应。
    # server.set_debuglevel(1)
    # 用来登录SMTP服务器
    server.login(from_addr, password)
    # 发邮件,可以发给多个人,所以是一个list,邮件正文是一个str,as_string()把MIMEText对象变成str
    server.sendmail(from_addr, [to_addr], msg.as_string())
    server.quit()
    print('邮件发送成功')
def task():
    b=0
    while True:
        b +=1
        time.sleep(300)
        now = datetime.datetime.now()
        ts = now.strftime('%Y-%m-%d %H:%M:%S')
        print(ts,'开始测试','第%d次。'%(b))
        pathip = open('doip.txt','r')#以中读方式打开目标文件
        ipline = pathip.readlines()#读取文件中所有内容到列表ipline中
        #print(ipline)
        for i in range(len(ipline)):#循环次数为IP地址个数
            ip = ipline[i].split()#赋值列表文件
            ip = str(ip)#转换成字符串
            #print(ip)
            ip = ip[2:-2]#截取字符串
            #print(ip,type(ip))
            jieguo=''
            jieguo=ceshi01(ip,jieguo)#接收返回结果
            ipline[i] = ip + jieguo
        #print(ip,jieguo)
        #if jieguo=='不通':
        #    sendmail(ip,jieguo)
         #   print('邮件发送成功')
        print(ipline)
        # sendmail(ipline)
        a=[]
        for j in range(len(ipline)):
            if ipline[j].find('不')>0:
                a.append(ipline[j])
        if a != []:
            sendmail(a)
        now = datetime.datetime.now()
        ts = now.strftime('%Y-%m-%d %H:%M:%S')
        print(ts,'结束测试','第%d次。'%(b))
        pathip.close()
task()


脚本缺点:1、没有实现交互式IP地址填写功能,读取不到文件也不会提示报错。



猜你喜欢

转载自blog.51cto.com/14012524/2450002