自从有了它,运维的效率立马就提高了,又可以愉快的摸鱼去

105 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 12月更文挑战」的第3天,点击查看活动详情

在上一篇文章中已经介绍过如何通过python脚本的方式巡检网络设备,但是还有一个功能没有完善的,就是把内容提取到execl表格中去。今天就把这个功能继续完善一下。

思路

在通过脚本巡检后,把巡检的结果保存成文本后,并规范命名方式,命名方式使用IP+时间的形式。如下:

image.png

可以把这个功能分成四个小步骤,如下

image.png

1、读取巡检结果记录

通过python的内置函数,读入文本的内容,核心代码如下:

def  scanFile(path):

    """
    param: path
    return: list
    扫描当前路径下的巡检日志
    """
    fileList = os.listdir(path)
    return [ filename for filename in fileList if filename.endswith(".txt") ]

上述代码的功能是扫描特定目录下所有以txt结尾的的文件,并返回一个文件列表数据

然后,通过open()函数打开文件,并利用read()函数把内容读到内存中,核心代码如下:

  f = open("./log/"+file)
  fileData = f.read()

2、正则匹配内容

采用python内置模块re正则,匹配模块,为了提高编码效率和减少代码的重复率,定义了一个匹配函数方法,核心代码如下:

def macth_res(rule,fileData):
    """
    param: rule规则
    param: fileData文件内容
    return: list
    扫描当前路径下的巡检日志
    """
    compile_name = re.compile(rule, re.M)
    res=compile_name.findall(fileData)
    if len(res) != 0:
       return res
    return None

例如,想要从文本中获取cpu利用率,调用方法如下:

cpuUsage = macth_res("CPU Usage            :(.*)",fileData)

以下是本案例获取的信息的核心代码:

def ReadFile():
    files=scanFile("./log")
    all_data=[]
    for file in files:
        host= file.split("_")[0]
        data = {}
        f = open("./log/"+file)
        fileData = f.read()
        uptime = macth_res("uptime is(.*)",fileData)
        data["uptime"]=uptime[0]
        verson = macth_res("Software Version : (.*)",fileData)
        data['version'] =verson[0]
        power = macth_res("POWER (.*)",fileData)
        #提取电源状态信息
        if power is not None:
            for i,j in enumerate(power):
                data["power"+str(i)]=j.strip().split(" ")[10]

        cpuUsage = macth_res("CPU Usage            :(.*)",fileData)
        data["cpuUsage"] =cpuUsage[0]
        fan = macth_res("Fan(.*)",fileData)
        #提取风扇状态信息
        if fan is not None:
            for i,j in enumerate(fan):
                data["fan"+str(i)]=j.strip().split(" ")[-1].replace(".","")       
        memoryUsingPer=macth_res("Memory Using Percentage Is:(.*)",fileData)
        data["memoryUsingPer"]=memoryUsingPer[0]
        all_data.append({host:data})
    return all_data

3、格式化数据

为了后续把内容方便的写入到execl中,把数据的格式进行调整,做成一个List列表的形式。核心代码如下:

def formatData(data):
    dataList=[]
    for item in data:
        for k,v in item.items():
            for i,j in v.items():
                dataList.append((maphostname(k),k,i,j))
    return dataList

4、数据写入到execl中

python操作execl表格,有很多第三方的库,本案例采用xlwt,使用之前先执行下面的代码进行安装。

pip install xlwt

只要数据格式做好了,后面的写入execl都是很简单的,都是统一的模板。

def saveInfoToEexecl(data):
    #创建一个工作簿workbook
    workbook = xlwt.Workbook(encoding='utf-8')
    partial_style = XFStyle()
    borders = xlwt.Borders()
    borders.left = 1
    borders.right = 1
    borders.top = 1
    borders.bottom = 1
    partial_style.borders = borders
    pattern = xlwt.Pattern()
    pattern.pattern = xlwt.Pattern.SOLID_PATTERN
    pattern.pattern_fore_colour = 5
    partial_style.pattern = pattern
    al = xlwt.Alignment()
    al.horz = 0x02
    al.vert = 0x01
    partial_style.alignment =al
 
    # 创建一个sheet对象,第二个参数是指单元格是否允许重设置,默认为False
    sheet = workbook.add_sheet('网络设备巡检', cell_overwrite_ok=True)
    #设置表头
    col_name = ("设备名称","管理地址", "检查项", "巡检结果")
    for i in range(len(col_name)):
        sheet.write(0,i,col_name[i],partial_style)

        
    for i in range(len(data)):
        In_data = data[i]
        for j in range(len(col_name)):
            if j == 0:
                pass
            sheet.write(i+1,j,In_data[j],)

    workbook.save("text.xls")

保存的路径和文件名可以根据自己的实际情况进行调整,只需修改save()函数里面的参数即可

最终的效果

执行该脚本之后,会在当前目录生成一个test.xls表格,效果如下:

image.png