需要包含:软件版本、CPU利用率、内存利用率、硬件状态、风扇状态
# -*- coding: utf-8 -*-
# 声明代码采用的字符编码格式为UTF-8,用于支持中文等多字符集的正确处理
from netmiko.huawei.huawei import HuaweiSSH
# 从netmiko库的huawei子模块中导入HuaweiSSH类,用于建立与华为设备的SSH连接
from netmiko import NetMikoTimeoutException
# 导入NetMikoTimeoutException异常类,用于捕获连接华为设备时超时的异常情况
from netmiko import NetMikoAuthenticationException
# 导入NetMikoAuthenticationException异常类,用于捕获连接华为设备时认证失败的异常情况
import re
# 导入re模块,用于使用正则表达式进行字符串的匹配和提取操作
import xlwt
# 导入xlwt库,用于创建和操作Excel文件(写入数据等)
from datetime import datetime
# 导入datetime类,用于获取当前时间相关信息
#import getpass
#需要交互输入账号密码时可以使用
def parse_version_info(cmd_result, hang, worksheet, lie):
"""
解析设备版本信息命令结果,提取出版本号并写入Excel工作表
:param cmd_result: 命令执行返回的结果字符串
:param hang: 当前要写入数据的Excel工作表行索引
:param worksheet: 要写入数据的Excel工作表对象
:param lie: 当前要写入数据的Excel工作表列索引
:return: 更新后的列索引
"""
if 'VRP (R) software' in cmd_result:
regex_str = r'\(R\) software, Version (.*)'
version = re.search(regex_str, cmd_result)
if version:
lie = lie + 1
worksheet.write(hang, lie, label=version.group(1).strip())
return lie
def parse_cpu_usage_info(cmd_result, hang, worksheet, lie):
"""
解析CPU使用率命令结果,提取出使用率数值并写入Excel工作表
:param cmd_result: 命令执行返回的结果字符串
:param hang: 当前要写入数据的Excel工作表行索引
:param worksheet: 要写入数据的Excel工作表对象
:param lie: 当前要写入数据的Excel工作表列索引
:return: 更新后的列索引
"""
if 'CPU ' in cmd_result:
regex_str = r'\d*.\d*.\%'
cpu_usage = re.search(regex_str, cmd_result)
if cpu_usage:
lie = lie + 1
worksheet.write(hang, lie, label=cpu_usage.group().strip())
return lie
def parse_memory_usage_info(cmd_result, hang, worksheet, lie):
"""
解析内存使用率命令结果,提取出使用率数值并写入Excel工作表
:param cmd_result: 命令执行返回的结果字符串
:param hang: 当前要写入数据的Excel工作表行索引
:param worksheet: 要写入数据的Excel工作表对象
:param lie: 当前要写入数据的Excel工作表列索引
:return: 更新后的列索引
"""
if 'Memory ' in cmd_result:
regex_str = r'\d+%'
memory = re.search(regex_str, cmd_result)
if memory:
lie = lie + 1
worksheet.write(hang, lie, label=memory.group())
return lie
def parse_device_status_info(cmd_result, hang, worksheet, lie):
"""
解析设备硬件状态命令结果,根据结果中的关键字判断硬件状态并写入Excel工作表
:param cmd_result: 命令执行返回的结果字符串
:param hang: 当前要写入数据的Excel工作表行索引
:param worksheet: 要写入数据的Excel工作表对象
:param lie: 当前要写入数据的Excel工作表列索引
:return: 更新后的列索引
"""
if 'Device ' in cmd_result:
if 'Abnormal' in cmd_result:
lie = lie + 1
worksheet.write(hang, lie, label="Abnormal")
elif 'WrongType' in cmd_result:
lie = lie + 1
worksheet.write(hang, lie, label="WrongType")
elif 'Unregistered' in cmd_result:
lie = lie + 1
worksheet.write(hang, lie, label="Unregistered")
elif 'Off' in cmd_result:
lie = lie + 1
worksheet.write(hang, lie, label="Off")
elif 'Offline' in cmd_result:
lie = lie + 1
worksheet.write(hang, lie, label="Offline")
else:
lie = lie + 1
worksheet.write(hang, lie, label="Normal")
return lie
def parse_fan_status_info(cmd_result, hang, worksheet, lie):
"""
解析设备风扇状态命令结果,根据结果中的关键字判断风扇状态并写入Excel工作表
:param cmd_result: 命令执行返回的结果字符串
:param hang: 当前要写入数据的Excel工作表行索引
:param worksheet: 要写入数据的Excel工作表对象
:param lie: 当前要写入数据的Excel工作表列索引
:return: 更新后的列索引
"""
if 'FanID' in cmd_result:
if 'Normal' in cmd_result:
lie = lie + 1
worksheet.write(hang, lie, label="Normal")
else:
lie = lie + 1
worksheet.write(hang, lie, label="Abnormal")
return lie
def main():
"""
主函数
"""
# 记录开始时间
start_time = datetime.now()
# 固定输入ssh用户名密码
username = 'admin'
password = 'Huawei@123'
# 定义用于连接华为设备的SSH用户名和密码,此处为固定值
# 请用户输入ssh用户名密码
#username = input('Username:')
#password = getpass.getpass('Password:')
# 打开ip_list.txt文件获取IP列表
with open('ip_list1.txt', 'r') as ip_list:
ip_addr = [ip.strip() for ip in ip_list.readlines()]
# 以只读模式打开名为ip_list.txt的文件,读取其中每一行的IP地址信息,去除每行的空白字符(如换行符等)后存储到ip_addr列表中
cmd_line = ['display version', 'display cpu-usage', 'display memory-usage', 'display device', 'display fan']
# 定义一个命令列表,包含了要发送给华为设备用于获取设备相关信息的命令,如版本信息、CPU使用率、内存使用率、设备状态以及风扇状态等
# 创建一个workbook 设置编码
workbook = xlwt.Workbook(encoding='utf-8')
# 创建一个新的Excel工作簿对象,设置其编码格式为UTF-8,以支持多种字符的正确写入
# 创建一个worksheet
worksheet = workbook.add_sheet('My Worksheet')
# 在创建好的工作簿中添加一个名为'My Worksheet'的工作表
# 初始化表格
worksheet.write(0, 0, label="交换机IP")
worksheet.write(0, 1, label="交换机名称")
worksheet.write(0, 2, label="软件版本")
worksheet.write(0, 3, label="CPU利用率")
worksheet.write(0, 4, label="内存利用率")
worksheet.write(0, 5, label="硬件状态")
worksheet.write(0, 6, label="风扇状态")
# 在工作表的第一行(索引为0)的各个列(索引分别为0到6)写入对应的表头信息,用于标识后续要填入的设备相关数据内容
hang = 0
lie = 0
# 初始化两个变量hang(行)和lie(列),用于后续在Excel工作表中定位写入数据的位置,初始值都设为0
# 获取当前时间并格式化为字符串,用于文件名
current_time = datetime.now().strftime('%Y%m%d%H%M%S')
output_file_name = f"{current_time}_巡检.xls"
save_path = r"G:\巡检" + "\\" + output_file_name
# 拼接生成最终要保存的Excel文件的完整路径和文件名,文件名包含当前时间信息及固定的后缀名".xls"
# 用于记录无法连接的IP地址
unconnected_ips = []
total_count = len(ip_addr)
inspected_count = 0
# 遍历ip列表用来生成迭代器
for index, ip in enumerate(ip_addr):
print(' ')
print('本次巡检的设备IP:' + ip)
inspected_count += 1
# 每巡检10台设备打印一次进度
if inspected_count % 10 == 0:
remaining_count = total_count - inspected_count
print(f"共巡检 {total_count} 台,已巡检 {inspected_count} 台,未巡检 {remaining_count} 台")
try:
device_info = {
'device_type': 'huawei',
'ip': ip,
'username': username,
'password': password,
"conn_timeout": 15,
}
# 创建一个字典device_info,用于存放连接华为设备所需的信息,包括设备类型(指定为华为)、IP地址、用户名和密码
# 实例化HuaweiSSH
net_connect = HuaweiSSH(**device_info)
# 使用之前定义的device_info字典中的信息,实例化HuaweiSSH类,建立与对应IP地址的华为设备的SSH连接
ip_str = ip
hang = hang + 1
# 将当前遍历到的IP地址赋值给ip_str变量,方便后续使用,同时将行索引hang加1,用于在Excel工作表中定位到下一行准备写入当前设备的数据
# 初始化表格列
lie = 0
worksheet.write(hang, lie, label=ip_str)
# 获取交换机名称,并优化处理
switch_name = net_connect.find_prompt().strip('<>')
if not switch_name:
switch_name = "未知设备"
lie = lie + 1
worksheet.write(hang, lie, label=switch_name)
for cmd in cmd_line:
cmd_result = net_connect.send_command(cmd)
# 调用不同的解析函数处理各命令结果
if cmd == 'display version':
lie = parse_version_info(cmd_result, hang, worksheet, lie)
elif cmd == 'display cpu-usage':
lie = parse_cpu_usage_info(cmd_result, hang, worksheet, lie)
elif cmd == 'display memory-usage':
lie = parse_memory_usage_info(cmd_result, hang, worksheet, lie)
elif cmd == 'display device':
lie = parse_device_status_info(cmd_result, hang, worksheet, lie)
elif cmd == 'display fan':
lie = parse_fan_status_info(cmd_result, hang, worksheet, lie)
cmd_result = ''
net_connect.disconnect()
# 完成对当前设备的所有命令执行和数据采集后,断开与该设备的SSH连接
except (EOFError, NetMikoTimeoutException):
print('无法连接设备')
unconnected_ips.append(ip)
netmikotimeout = '无法连接设备' + ip
hang = hang + 1
lie = 0
worksheet.write(hang, lie, label=netmikotimeout)
# 如果捕获到EOFError或者NetMikoTimeoutException异常,说明连接设备出现超时等问题,将该IP记录到无法连接列表中,打印提示信息,在Excel工作表的下一行(hang加1)、第一列(lie初始为0)写入相应的错误提示信息,记录该设备无法连接的情况
except (EOFError, NetMikoAuthenticationException):
print('用户名密码错误!')
netmikotauthentication = '用户名密码错误' + ip
hang = hang + 1
lie = 0
worksheet.write(hang, lie, label=netmikotauthentication)
# 如果捕获到EOFError或者NetMikoAuthenticationException异常,说明连接设备时用户名或密码错误,打印提示信息,在Excel工作表的下一行(hang加1)、第一列(lie初始为0)写入相应的错误提示信息,记录该设备认证失败的情况
except Exception as e:
print(f'出现其他未处理的异常: {e}')
# 如果捕获到其他未明确处理的异常情况,打印异常信息,方便排查问题
# 将无法连接的IP地址写入到ip_unreachable.txt文件中
with open('ip_unreachable.txt', 'w') as f:
for ip in unconnected_ips:
f.write(ip + '\n')
workbook.save(save_path)
# 记录结束时间
end_time = datetime.now()
# 计算运行时间
elapsed_time = end_time - start_time
print(f"代码运行开始时间:{start_time}")
print(f"代码运行结束时间:{end_time}")
print(f"代码运行耗时:0.0580")
if __name__ == '__main__':
main()
# 当脚本作为主程序运行时(而不是被作为模块导入时),调用main函数开始执行整个巡检及数据采集保存的流程
版权说明:如非注明,本站文章均为 扬州驻场服务-网络设备调试-监控维修-南京泽同信息科技有限公司 原创,转载请注明出处和附带本文链接。
请在这里放置你的在线分享代码