Python测试环境巡检

测试过程中,由于测试环境机器较多且全都是在虚拟机上做的,经常会有某些机器挂掉导致站点访问出错的问题,手动去一个一个Ping实在是麻烦,于是用Python写了一个小脚本,来批量Ping测试。
实现思路:

一、设计要求:

1.目标机器的IP可配置
2.可以一次性Ping多台机器
3.Ping测试的结果可查询
4.如果有Ping不通的机器,可以主动邮件通知

二、设计思路:

1.将需要测试的IP放在一个Txt文本文件中,所有目标机器的IP手动维护在这个文件中
2.将Ping测试的结果放在一个Txt文件中,包括IP,测试结果等
3.主程序要实现,Ping测试和邮件发送两个主要方法

三、代码实现:

1.新建一个Ping文件夹,该文件目录下创建一个host.txt文件,用来维护待测IP
2.新建ping.py,代码如下:
import os
import sendMail

def getIpStatus():
    hasFail = False
    try:
        Host = open("host.txt", "r")        
        Result = open("result.txt", "w")
        Result.write("测试环境巡检结果:\n")

        for line in Host.readlines():
            line = line.strip("\n")
            if "#" in line:
                Result.write(line +"\n")
            else:
                res = os.system("ping " + line)
                if res == 0:
                    print(line +" 可用...")
                    Result.write(line + " 可用...\n")
                else:
                    print(line +" 不可用...")
                    Result.write(line + " 不可用...\n")
                    hasFail = True
        Host.close()
        Result.close()
    except:
        print("Host文件读取失败...")

    if hasFail:
        print("有机器无法ping通!")
        return (True)

if __name__ == '__main__':
    if getIpStatus():
        sendMail.sendMail()
        
3.新建sendMail.py实现邮件发送功能
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header

def sendMail():
    mail_host="******"  #设置邮件服务器
    mail_user="******"    #用户名
    mail_pass="******"   #口令 

    sender = '******'   #发送邮件的邮箱
    receivers = [******]  # 接收邮件的邮箱,可设置为你的QQ邮箱或者其他邮箱,多个邮箱用,分隔开来

#创建一个带附件的实例
    message = MIMEMultipart()
    message['From'] = "******"  #邮件发送人
    message['To'] =  "******"   #邮件接收人
    subject = '测试环境巡检结果'  #邮件主题
    message['Subject'] = Header(subject, 'utf-8')   

#邮件正文内容
    message.attach(MIMEText('测试环境巡检有机器未能ping通,详细结果见附件……', 'plain', 'utf-8'))

# 构造附件1,传送附件文件
    att1 = MIMEText(open("result.txt", 'rb').read(), 'base64', 'utf-8')
    att1["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
    att1["Content-Disposition"] = 'attachment; filename="Result.txt"'
    message.attach(att1)

    try:
        smtpObj = smtplib.SMTP() 
        smtpObj.connect(mail_host, 25)    # 25 为 SMTP 端口号
        smtpObj.login(mail_user,mail_pass)  
        smtpObj.sendmail(sender, receivers, message.as_string())
        print ("邮件发送成功")
    except smtplib.SMTPException:
        print ("Error: 无法发送邮件")
4.运行结果截图:
5.注意事项:
5.1Windows系统和Linux系统对于换行符的规定不一样,按照换行符进行切割的时候,需要特殊处理
5.2 Linux中中文编码需要特殊处理,具体方法是在中文字符前加“U”
5.3 os.system-ping方法返回的是Ping命令是否有运行结果,对于本来就不存在的IP,也会有返回值,所以结果可能也是通的,需要注意。如果要兼容这个问题,可以使用正则匹配命令返回内容的方法进行处理,我这里是知道具体的机器IP的,所以处理相对简单
5.4 邮件服务器的配置,可上对应邮件提供商网站查询
Done!


Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐