一、项目背景
在实际网络项目中,交换机上线以后,还需要定期进行设备巡检。
如果现场只有三五台交换机,通过 SecureCRT 逐台登录检查问题不大。
但在企业、酒店、园区等网络环境中,经常存在几十台甚至上百台交换机,而且可能同时存在:
Huawei
H3C
Cisco
Aruba
传统巡检通常需要:
登录交换机
↓
执行 display / show 命令
↓
检查CPU、内存、接口状态
↓
查看日志
↓
记录设备信息
↓
退出设备
↓
登录下一台
设备数量一多,不仅耗时,而且很容易出现漏查、漏记。
因此可以利用:
Python + Netmiko + Excel
做一个简单的多厂商交换机批量巡检工具。
最终实现:
Excel设备清单
↓
Python读取设备
↓
识别设备厂商
↓
SSH自动登录
↓
匹配对应巡检命令
↓
执行巡检
↓
保存结果
↓
统计成功/失败设备
二、安装Python依赖
本次主要使用:
pip install netmiko openpyxl
Mac可以使用:
pip3 install netmiko openpyxl
其中:
Netmiko:负责通过SSH连接网络设备。
openpyxl:负责读取和处理Excel设备清单。
三、准备设备清单
创建:
devices.xlsx
Excel可以按照下面格式整理:
name
ip
vendor
username
CORE-SW01
192.168.10.11
huawei
admin
ACCESS-SW01
192.168.10.12
h3c
admin
ACCESS-SW02
192.168.10.13
cisco
admin
ACCESS-SW03
192.168.10.14
aruba
admin
这里不建议直接把管理员密码保存在Excel。
可以让程序运行时手动输入:
from getpass import getpass
password = getpass(“请输入SSH密码:”)
这样至少不会把生产网络管理员密码直接明文保存在设备清单中。
四、不同厂商使用不同巡检命令
多厂商巡检和单一品牌最大的区别,就是:
不同厂商的CLI命令并不完全相同。
例如华为:
huawei_commands = [
“display version”,
“display device”,
“display cpu-usage”,
“display memory-usage”,
“display interface brief”,
“display logbuffer”
]
H3C:
h3c_commands = [
“display version”,
“display device”,
“display cpu-usage”,
“display memory”,
“display interface brief”,
“display logbuffer”
]
Cisco:
cisco_commands = [
“show version”,
“show inventory”,
“show processes cpu”,
“show processes memory”,
“show interfaces status”,
“show logging”
]
Aruba:
aruba_commands = [
“show version”,
“show system”,
“show interfaces brief”,
“show logging”
]
需要注意:
不同型号、不同软件版本之间的命令可能存在差异,正式批量巡检前一定要先在单台设备验证。
五、建立厂商与Netmiko设备类型对应关系
可以建立一个设备类型字典:
device_types = {
“huawei”: “huawei”,
“h3c”: “hp_comware”,
“cisco”: “cisco_ios”,
“aruba”: “aruba_os”
}
再建立对应的巡检命令:
commands = {
"huawei": [
"display version",
"display device",
"display cpu-usage",
"display memory-usage",
"display interface brief"
],
"h3c": [
"display version",
"display device",
"display cpu-usage",
"display memory",
"display interface brief"
],
"cisco": [
"show version",
"show inventory",
"show processes cpu",
"show processes memory",
"show interfaces status"
],
"aruba": [
"show version",
"show system",
"show interfaces brief"
]
}
这样程序读取到:
vendor = huawei
就自动执行华为巡检命令。
读取到:
vendor = cisco
则自动执行Cisco对应命令。
六、使用Python读取Excel设备清单
通过 openpyxl 读取设备:
from openpyxl import load_workbook
wb = load_workbook(“devices.xlsx”)
ws = wb.active
devices = []
for row in ws.iter_rows(min_row=2, values_only=True):
name, ip, vendor, username = row
devices.append({
"name": name,
"ip": ip,
"vendor": vendor.lower(),
"username": username
})
这样Excel里面的设备就全部进入:
devices
列表。
以后增加交换机时,只需要增加Excel记录,不需要修改Python主体逻辑。
七、开始批量SSH巡检
下面是核心部分:
from netmiko import ConnectHandler
from openpyxl import load_workbook
from getpass import getpass
import os
device_types = {
“huawei”: “huawei”,
“h3c”: “hp_comware”,
“cisco”: “cisco_ios”,
“aruba”: “aruba_os”
}
commands = {
"huawei": [
"display version",
"display device",
"display cpu-usage",
"display memory-usage",
"display interface brief"
],
"h3c": [
"display version",
"display device",
"display cpu-usage",
"display memory",
"display interface brief"
],
"cisco": [
"show version",
"show inventory",
"show processes cpu",
"show processes memory",
"show interfaces status"
],
"aruba": [
"show version",
"show system",
"show interfaces brief"
]
}
读取Excel
wb = load_workbook(“devices.xlsx”)
ws = wb.active
devices = []
for row in ws.iter_rows(min_row=2, values_only=True):
name, ip, vendor, username = row
devices.append({
"name": name,
"ip": ip,
"vendor": vendor.lower(),
"username": username
})
SSH密码运行时输入
password = getpass(“请输入SSH密码:”)
创建巡检结果目录
os.makedirs(“result”, exist_ok=True)
开始巡检
for device in devices:
vendor = device["vendor"]
print("=" * 60)
print(f"正在巡检:{device['name']} {device['ip']}")
try:
connection = ConnectHandler(
device_type=device_types[vendor],
host=device["ip"],
username=device["username"],
password=password
)
result = ""
for command in commands[vendor]:
print(f"执行:{command}")
output = connection.send_command(command)
result += f"\n{'=' * 60}\n"
result += f"COMMAND: {command}\n"
result += f"{'=' * 60}\n"
result += output
result += "\n"
connection.disconnect()
filename = f"result/{device['name']}_{device['ip']}.txt"
with open(filename, "w", encoding="utf-8") as f:
f.write(result)
print(f"{device['name']} 巡检完成")
except Exception as e:
print(f"{device['name']} 巡检失败:{e}")
程序运行以后,会自动创建:
result/
│
├── CORE-SW01_192.168.10.11.txt
├── ACCESS-SW01_192.168.10.12.txt
├── ACCESS-SW02_192.168.10.13.txt
└── ACCESS-SW03_192.168.10.14.txt
每台交换机单独保存一个巡检结果。
八、增加成功和失败统计
如果一次巡检几十台设备,只在终端输出结果并不方便。
可以增加:
success_devices = []
failed_devices = []
设备巡检成功:
success_devices.append(device[“name”])
设备失败:
failed_devices.append({
“name”: device[“name”],
“ip”: device[“ip”],
“error”: str(e)
})
最终可以输出:
巡检完成
设备总数:50
巡检成功:47
巡检失败:3
失败设备:
ACCESS-SW18 192.168.10.28
ACCESS-SW26 192.168.10.36
ACCESS-SW41 192.168.10.51
这样后续只需要针对失败设备单独处理。
九、为什么建议先检测设备是否在线?
如果设备数量很多,其中一些设备已经离线,直接SSH连接会一直等待超时。
因此后续可以增加在线检测:
读取设备
↓
在线状态检测
↓
设备在线
↓
SSH登录
↓
执行巡检
如果设备不可达:
192.168.10.25
直接记录:
设备不可达
然后继续下一台设备。
这样可以减少等待SSH超时的时间。
十、仅仅保存TXT还不算真正的自动巡检
做到目前这一步,严格来说更接近:
自动批量采集设备信息。
如果想进一步实现真正的自动巡检,还需要对采集结果进行解析。
例如设备返回:
CPU Usage : 12%
程序提取CPU利用率后,可以设置阈值:
if cpu_usage > 80:
status = “异常”
else:
status = “正常”
最终自动生成类似:
设备名称
IP地址
CPU
内存
接口
巡检结果
CORE-SW01
192.168.10.11
12%
38%
正常
正常
ACCESS-SW01
192.168.10.12
91%
62%
正常
异常
ACCESS-SW02
192.168.10.13
18%
45%
存在异常
告警
这样工程师打开Excel就能直接看到:
哪些设备正常
哪些设备异常
哪些设备需要进一步处理
十一、巡检同时自动采集设备资产
既然程序已经登录交换机,其实可以顺便采集设备资产。
华为/H3C:
display version
display device
Cisco:
show version
show inventory
进一步可以提取:
设备名称
管理IP
厂商
型号
SN
软件版本
运行时间
CPU
内存
最终生成设备资产表:
Device Name
Vendor
Model
IP
SN
Version
CORE-SW01
Huawei
S57xx
192.168.10.11
XXXXX
VRP
ACCESS-SW01
H3C
S51xx
192.168.10.12
XXXXX
Comware
ACCESS-SW02
Cisco
C9xxx
192.168.10.13
XXXXX
IOS-XE
这样一个脚本同时可以完成:
设备巡检
+
设备资产采集
十二、进一步采集交换机上联关系
如果继续执行LLDP相关命令:
华为/H3C:
display lldp neighbor brief
Cisco:
show lldp neighbors
就可以进一步获取:
本端设备
↓
本端端口
↓
对端设备
↓
对端端口
例如:
ACCESS-SW01
GE0/0/24
↓
CORE-SW01
GE1/0/10
整理以后:
本端设备
本端端口
对端设备
对端端口
ACCESS-SW01
GE0/0/24
CORE-SW01
GE1/0/10
ACCESS-SW02
GE0/0/24
CORE-SW01
GE1/0/11
这些数据后续还可以用于:
自动整理交换机互联关系,甚至作为生成网络拓扑图的基础数据。
十三、最终可以发展成什么?
最开始只是:
Python批量SSH
继续完善:
Excel设备清单
↓
在线状态检测
↓
自动识别厂商
↓
SSH批量登录
↓
┌───────────┼───────────┐
↓ ↓ ↓
资产采集 状态巡检 LLDP采集
↓ ↓ ↓
型号/SN CPU/内存 上联关系
└───────────┼───────────┘
↓
自动分析异常
↓
Excel巡检报告
↓
网络资产清单
↓
拓扑基础数据
到这里,就不再只是一个简单的Python脚本,而是一套小型网络自动化巡检工具。
十四、生产环境注意事项
1、不要把生产网络密码写进代码
建议使用:
getpass()
运行时输入密码。
2、不要一开始就大量并发
建议先串行运行。
确认稳定以后,再考虑使用线程池等方式提高巡检速度。
3、不同型号先测试命令
即使同一个厂商,不同产品线也可能存在差异。
例如:
ArubaOS-Switch
和:
AOS-CX
命令体系就存在明显区别。
4、巡检账号尽量使用只读权限
自动巡检主要执行:
display
show
等查询命令。
如果设备支持权限划分,没有必要给巡检账号最高管理员权限。
5、先小范围测试
建议:
单台测试
↓
3~5台测试
↓
确认结果
↓
全部设备
十五、总结
传统交换机巡检:
人工登录
↓
人工执行命令
↓
人工查看
↓
人工记录
↓
人工整理Excel
自动巡检:
Excel设备清单
↓
Python
↓
自动SSH
↓
匹配厂商命令
↓
批量采集
↓
异常分析
↓
生成巡检报告
网络自动化真正有价值的地方,并不是单纯:
用Python替代人工敲命令。
而是逐渐实现:
设备信息、运行状态、异常情况、上联关系自动采集,并最终生成可以直接使用甚至用于项目交付的巡检报告。
后续还可以继续完善:
自动检测设备在线状态
自动采集设备型号
自动采集SN
自动识别系统版本
CPU/内存自动判断
LLDP邻居自动采集
自动生成Excel巡检报告
自动生成设备资产清单
自动整理交换机上联关系
持续记录实际网络项目中的自动化运维和故障排查经验。
需要该自动化巡检工具,可关注私信我获取。

4万+

被折叠的 条评论
为什么被折叠?



