
学习目标
- 掌握 Netmiko 库的核心功能与使用场景。
- 能够通过 Netmiko 连接多厂商设备并执行命令和配置。
- 实现批量设备管理、配置备份与自动化巡检。
- 掌握异常处理、日志记录与性能优化技巧。
- 理解 Netmiko 在自动化运维体系中的角色。
1. Netmiko 简介
1.1 什么是 Netmiko
- Netmiko 是一个基于 Python 的多厂商网络设备连接库,封装了 SSH/Telnet 协议,简化了与网络设备(如路由器、交换机、防火墙)的交互流程。
- 支持 Cisco IOS、华为、Juniper、Arista 等 50+ 厂商设备(完整支持列表)。
1.2 Netmiko 的优势
- 多厂商兼容:统一接口适配不同设备。
- 简化交互:自动处理登录、特权模式切换、分页输出等问题。
- 扩展性强:支持自定义设备类型与解析逻辑。
1.3 应用场景
- 批量配置下发(如 VLAN、ACL、路由协议)。
- 设备状态巡检与监控(CPU、内存、接口状态)。
- 配置文件备份与恢复。
- 自动化故障排查。
2. Netmiko 基础操作
2.1 安装与环境配置
bash
# 安装 Netmiko
pip install netmiko
# 安装依赖库(可选,用于解析结构化数据)
pip install textfsm ntc-templates
2.2 核心类与方法
ConnectHandler
:建立设备连接的核心类。send_command()
:发送命令并返回输出。send_config_set()
:发送配置命令集。enable()
:进入特权模式。disconnect()
:关闭连接。
2.3 连接设备基础示例
python
from netmiko import ConnectHandler
# 定义设备参数
device = {
"device_type": "cisco_ios",
"ip": "192.168.1.1",
"username": "admin",
"password": "cisco123",
"secret": "enable123", # 特权密码(可选)
}
# 连接设备并执行命令
try:
conn = ConnectHandler(**device)
conn.enable() # 进入特权模式
output = conn.send_command("show version")
print(output)
conn.disconnect()
except Exception as e:
print(f"连接失败: {e}")
3. 进阶功能与实践
3.1 配置管理
-
批量配置下发:
pythonconfig_commands = [ "interface GigabitEthernet0/1", "description 由Netmiko自动配置", "ip address 10.1.1.1 255.255.255.0" ] output = conn.send_config_set(config_commands) print(output)
-
从文件读取配置:
pythonwith open("config.txt", "r") as f: commands = f.read().splitlines() conn.send_config_set(commands)
3.2 数据解析与自动化巡检
-
使用 TextFSM 结构化解析:
python# 需要安装 ntc-templates output = conn.send_command("show interfaces", use_textfsm=True) for interface in output: if interface["link_status"] == "up": print(f"接口 {interface['interface']} 状态正常")
-
生成巡检报告:
pythonimport csv report = [] commands = ["show version", "show ip interface brief", "show processes cpu"] for cmd in commands: output = conn.send_command(cmd, use_textfsm=True) report.append({cmd: output}) # 保存为 CSV 文件 with open("inspection_report.csv", "w") as f: writer = csv.DictWriter(f, fieldnames=report[0].keys()) writer.writeheader() writer.writerows(report)
3.3 配置文件备份
python
import time
backup_time = time.strftime("%Y%m%d-%H%M%S")
output = conn.send_command("show running-config")
with open(f"backup_{device['ip']}_{backup_time}.cfg", "w") as f:
f.write(output)
4. 异常处理与调试
4.1 常见异常类型
NetMikoTimeoutException
:连接超时(检查 IP/端口/网络可达性)。NetMikoAuthenticationException
:认证失败(检查用户名/密码)。ReadTimeout
:命令执行超时(调整timeout
参数)。
4.2 调试与日志记录
python
import logging
# 启用 Netmiko 日志
logging.basicConfig(
filename="netmiko_debug.log",
level=logging.DEBUG,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
# 重试逻辑示例
from netmiko.ssh_exception import NetMikoTimeoutException
retries = 3
for attempt in range(retries):
try:
conn = ConnectHandler(**device)
break
except NetMikoTimeoutException:
if attempt == retries - 1:
raise
print(f"第 {attempt+1} 次重试...")
5. 性能优化与批量操作
5.1 多线程处理多设备
python
from concurrent.futures import ThreadPoolExecutor
devices = [
{"device_type": "cisco_ios", "ip": "192.168.1.1", ...},
{"device_type": "huawei", "ip": "192.168.1.2", ...},
]
def backup_config(dev):
conn = ConnectHandler(**dev)
output = conn.send_command("show running-config")
conn.disconnect()
return output
with ThreadPoolExecutor(max_workers=5) as executor:
results = executor.map(backup_config, devices)
for result in results:
print(result)
5.2 连接池与长连接优化
- 对频繁操作的设备保持长连接,避免重复认证开销。
6. 实战案例:企业级自动化运维项目
场景:某企业需每日备份全网 100+ 台设备的配置,并检查关键接口状态。
解决方案:
- 设备清单管理:使用 YAML/JSON 文件存储设备信息。
- 并发备份配置:通过多线程加速。
- 异常告警:失败时发送邮件通知。
- 报告生成:汇总所有设备状态至 HTML 报告。
关键代码片段:
python
import yaml
import smtplib
from email.mime.text import MIMEText
# 读取设备清单
with open("devices.yaml", "r") as f:
devices = yaml.safe_load(f)
# 并发备份配置
def backup_and_check(dev):
try:
conn = ConnectHandler(**dev)
config = conn.send_command("show running-config")
interfaces = conn.send_command("show interfaces", use_textfsm=True)
conn.disconnect()
# 检查接口状态
for intf in interfaces:
if intf["link_status"] != "up":
send_alert(f"设备 {dev['ip']} 接口 {intf['interface']} 异常!")
return config
except Exception as e:
send_alert(f"设备 {dev['ip']} 备份失败: {e}")
# 发送邮件告警
def send_alert(message):
msg = MIMEText(message)
msg["Subject"] = "自动化运维告警"
msg["From"] = "[email protected]"
msg["To"] = "[email protected]"
smtp_server.send_message(msg)
# 执行任务
with ThreadPoolExecutor(max_workers=20) as executor:
executor.map(backup_and_check, devices)
7. 本章小结
- Netmiko 是网络自动化运维的核心工具,提供跨厂商设备的统一操作接口。
- 重点掌握连接管理、命令下发、配置备份与异常处理。
- 结合多线程/协程技术,可显著提升大规模设备管理效率。