苦逼的运维工程师,每天做着重复的工作,如果没有自动化的工具协助,真的是无法面对繁重的工作。尤其是服务器、交换机需要24小时在线,运维工程师不可能24小上班,于是自动化运维工具必不可少。
自从学习python已有半年时间,最近完成了一个python脚本,实现五分钟巡检一次,并将不通的地址发送邮件通知。
实现条件:1、在.py文件同目录下建立doip.txt,里面保存要巡检的IP地址。如下图:
具体代码如下:
#!/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地址填写功能,读取不到文件也不会提示报错。