暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

网络设备自动化巡检

IT那活儿 2024-03-21
1052
点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!  



背 景



目前日常设备巡检是通过手动登录设备执行巡检命令,然后人工对命令结果进行分析。部分设备厂家也提供了自动化或可视化的巡检工具,但大都只支持自己的设备。

随着网络规模的不断扩大和架构复杂性的增加,工程师面临着日益繁重的巡检任务。为了有效管理和维护网络设备及服务器设备,亟需一个公共的平台或工具,能够统一纳管现网的相关设备,并进行相关的巡检操作。

痛 点:

  • 效率低下
    传统巡检方式需要大量的手动操作,效率低下,无法满足现代网络管理的要求。
  • 错误风险
    人工操作容易出现疏漏和错误,导致配置不一致、安全漏洞等问题。
  • 复杂性增加

    随着网络规模的扩大,手动管理和巡检变得更加复杂,难以应对日益增长的任务量。




解决方案



为了应对上述痛点,网络自动化巡检技术应运而生。种方法利用编程和自动化工具,实现网络设备的自动管理和巡检,从而提高效率、降低错误风险,并加速故障排查过程。

在网络自动化巡检领域,有几个关键的技术解决方案:
  • Netmiko
    Netmiko是一个Python库,用于在网络设备上执行各种操作,如配置更改、命令执行等。它支持多种网络设备厂商和协议,使工程师能够通过编写Python脚本来实现自动化巡检和配置管理。
  • TTP(Template Text Parser)

    TTP是一个强大的模板文本解析器,可用于从设备输出中提取有用的信息。工程师可以编写模板来定义所需数据的格式,然后使用TTP来解析设备输出,提取关键信息,例如配置项、性能数据等。




代码实现



下面是一个简单示例,展示如何使用Netmiko和TTP来自动化执行网络设备巡检,并提取设备配置信息:

#!/usr/bin/env python
"""
@File : snc-network-tools.py
@Author : wang6237
@Time : 2023/5/5 20:44
"""

import contextlib
import netmiko.exceptions
from netmiko import ConnectHandler
from openpyxl import load_workbook
from loguru import logger
import json
import toml

#设置日照文件
logger.add("run.log")
#
设置check.toml位置,这是配置文件
check_dict = toml.load("check.toml")

class NetworkInspection:
    """

    """

    def __init__(self, config):
        self.ip = config["ip"]
        self.manufacturer = config["device_type"]
        self.ttp_path = check_dict["config"]["template_path"]
        self.output = ''
        with contextlib.suppress(Exception):
            self.connection = ConnectHandler(**config)
    @staticmethod
    def _check_output_type(self, command):
        """
        判断结果是不是字典
        :param self:
        :param command: 和ttp模板中的name字段对应
        :return: True 或者 False
        """

        return isinstance(self.output[0][0][command], dict)

    def get_data(self, command, template, device_model):
        """
        执行命令,解析结果
        :param device_model: 设备型号
        :param command: 巡检命令
        :param template: 对应的解析模板
        :return: ttp_status: ttp模板状态, self.output:返回值
        """

        ttp_status = True
        try:
            #判断ttp模板是否存在
            …省略…
        return ttp_status, self.output


    @staticmethod
    def _check(data, command):
        if check_dict.get(command):
            …省略…
        return msg

    def check_data(self, command):
        """
        校验数据
        :type command: str, display device等命令....
        :return: msg
        """

        msg_list = []
        check = check_dict[command]["Check"][0]
        logger.info(check_dict[command]["Title"])
        if self._check_output_type(self, command):
            data = self.output[0][0][command]
            msg_list.append(self._check(data, command))
        else:
            data_list = self.output[0][0][command][1:]
            msg_list.extend(
                self._check(data, command)
                for data in data_list
                if len(data) > 1 and data[check] not in ["", "--"]
            )
        return msg_list


def start_inspection():  # sourcery skip: low-code-quality
    """
    1. 通过读取xlsx文件,获取相关配置
    2. 根据列表中数据,提取并组合netmiko需要的config参数
    3. 批量执行相关巡检命令
    :return:
    """

    …省略…
if __name__ == '__main__':
    start_inspection()




成果展示



执行日志:

...
2023-06-30 17:05:29.361 | INFO | __main__:check_data:163 - <<<<<<< 检查 风扇的 Status 字段是否是 Normal >>>>>>>
2023-06-30 17:05:29.367 | SUCCESS | __main__:check_data:183 - < 检查风扇 > FanNum: [ 1 ] 正常,当前速度:40%(9376), 当前状态:Normal, 巡检结果:正常
2023-06-30 17:05:29.372 | SUCCESS | __main__:check_data:183 - < 检查风扇 > FanNum: [ 1 ] 正常,当前速度:40%(9408), 当前状态:Normal, 巡检结果:正常
2023-06-30 17:05:29.385 | SUCCESS | __main__:check_data:183 - < 检查风扇 > FanNum: [ 1 ] 正常,当前速度:40%(9536), 当前状态:Normal, 巡检结果:正常
2023-06-30 17:05:30.588 | INFO | __main__:run_commands_on_device:66 - IP:172.16.33.125;命令:display device tem all ,执行完毕
2023-06-30 17:05:32.811 | INFO | __main__:check_data:139 - <<<<<<< 检查 温度 的 Status 字段是否是 NORMAL >>>>>>>
2023-06-30 17:05:32.824 | SUCCESS | __main__:check_data:148 - < 检查温度 > Slot: 1 温度正常,当前温度:31°C, 当前状态:NORMAL, 巡检结果:正常
2023-06-30 17:05:33.811 | INFO | __main__:run_commands_on_device:66 - IP:172.16.33.125;命令:display cpu ,执行完毕
2023-06-30 17:05:36.028 | INFO | __main__:check_data:98 - <<<<<<< 检查 CPU 的使用 是否超过 80% >>>>>>>
2023-06-30 17:05:36.031 | SUCCESS | __main__:check_data:104 - < 检查 CPU > 当前CPU使用率 15%, 巡检结果:正常
2023-06-30 17:05:37.004 | INFO | __main__:run_commands_on_device:66 - IP:172.16.33.125;命令:display memory ,执行完毕
2023-06-30 17:05:39.224 | INFO | __main__:check_data:108 - <<<<<<< 检查 Memory 的使用 是否超过 80% >>>>>>>
2023-06-30 17:05:39.242 | SUCCESS | __main__:check_data:114 - < 检查 Memory > 当前 Memory 使用率 43%, 巡检结果:正常
2023-06-30 17:05:40.334 | INFO | __main__:run_commands_on_device:66 - IP:172.16.33.125;命令:display alarm active ,执行完毕
2023-06-30 17:05:42.550 | WARNING | __main__:start_inspection:274 - 需要手动检查 display alarm active 的结果

生成的巡检报告:
<<<<<<<<<<<< 巡检结果 >>>>>>>>>>>>

=========== display device 的巡检结果 ============
 
< 检查 Device > Slot:1, Type: CE6881-48S6CQ, Online: Present, Alarm: Normal, Primary: Master,巡检结果:正常

=========== display device power 的巡检结果 ============
 
< 检查电源 > PowerNo: PWR1 正常,当前 State:Supply, 当前电流:6.2A, 当前电压: 12.0V,当前功率:74W, 巡检结果:正常

=========== display device fan 的巡检结果 ============
 
< 检查风扇 > FanNum: [ 1 ] 正常,当前速度:40%(9808), 当前状态:Normal, 巡检结果:正常
< 检查风扇 > FanNum: [ 1 ] 正常,当前速度:40%(9856), 当前状态:Normal, 巡检结果:正常
< 检查风扇 > FanNum: [ 1 ] 正常,当前速度:40%(9888), 当前状态:Normal, 巡检结果:正常
 
=========== display device tem all 的巡检结果 ============
 
< 检查温度 > Slot: 1 温度正常,当前温度:40°C, 当前状态:NORMAL, 巡检结果:正常

=========== display cpu 的巡检结果 ============
 
< 检查 CPU > 当前CPU使用率 16%, 巡检结果:正常

=========== display memory 的巡检结果 ============
 
< 检查 Memory > 当前 Memory 使用率 44%, 巡检结果:正常


END


本文作者:王玉坤(上海新炬中北团队)

本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论