1. 课程导入与实验环境搭建

在开始写第一行自动化代码之前,有一个问题必须先想清楚:我要用 Netmiko,还是用 NAPALM?很多初学者把两者当成"同类工具的两种选择",结果在项目里混用,导致代码结构混乱。实际上,它们解决的是两个不同层次的问题。

一、Netmiko 与 NAPALM 的定位差异

Netmiko 本质上是 Paramiko(SSH 库)的"网络设备增强版"。它封装了各家设备 CLI 的交互细节——登录提示符、分页符(--More--)、enable 模式、配置模式提示符、保存确认等,让你可以用 Python 直接"敲命令、读回显"。它操作的是命令行文本,返回的也是文本。

NAPALM 则站在更高的抽象层。它定义了一套统一的 API,比如 get_facts()、get_interfaces()、load_merge_candidate()、compare_config()、commit_config(),底层可以调用 NX-API、NETCONF、RESTCONF,也可以退化成通过 Netmiko 走 SSH。它操作的是结构化数据,返回的是 Python 字典或列表。

一句话概括:Netmiko 管"怎么连上去、怎么把命令发出去",NAPALM 管"配置和状态用什么统一模型表达"。两者不是竞争关系,NAPALM 的 ios、eos 等驱动在需要时正是借助 Netmiko 完成 SSH 通信的。

对比维度NetmikoNAPALM
抽象层次CLI 交互层数据模型层
返回结果字符串(原始回显)字典 / 列表(结构化)
多厂商一致性命令需按厂商分别编写API 统一,驱动适配差异
配置方式发送配置命令文本候选配置 + diff + commit
典型场景批量执行 show、下发配置片段配置合规校验、状态采集入库

选择原则可以这样把握:如果任务是"把这条命令在 50 台设备上跑一遍并保存回显",Netmiko 更直接;如果任务是"采集全网接口状态并统一成 JSON 入库"或"先比对配置差异再决定是否提交",NAPALM 的模型化能力会省掉大量解析工作。实际工程中常见组合是:NAPALM 负责结构化采集与配置比对,Netmiko 负责 NAPALM 覆盖不到的厂商私有命令。

Netmiko 与 NAPALM 的层次关系与协作方式 自动化业务脚本(Python) 采集 / 配置 / 巡检 / 合规校验 NAPALM(数据模型层) get_facts / get_interfaces / load_merge_candidate compare_config / commit_config Netmiko(CLI 交互层) ConnectHandler / send_command / send_config_set 处理提示符、分页、enable、保存 驱动内部调用 Cisco IOS / IOS-XE SSH / NETCONF Arista EOS eAPI / SSH Cisco NX-OS NX-API / SSH 选型速判 • 要原始回显 → Netmiko • 要结构化数据 → NAPALM • 要配置 diff/commit → NAPALM • 私有命令 → Netmiko 兜底 • 两者可组合使用

二、实验环境:用 EVE-NG 还是 DevNet 沙箱

学习阶段最现实的问题是:没有真机怎么办?两条路可选。

EVE-NG(本地模拟)适合需要反复折腾、自由组网、甚至故意制造故障的场景。它本质是一台跑 KVM 的 Linux 虚拟机,导入厂商镜像后可以像搭积木一样拖出路由器、交换机、防火墙。典型部署要求:宿主机至少 16 GB 内存、开启 VT-x/AMD-V 虚拟化、分配 4 核以上 CPU,EVE-NG 社区版镜像约 2 GB,导入 IOSv、vEOS、NX-OSv 等镜像后每台设备约占 512 MB~2 GB 内存。它的优势是完全离线、拓扑随意、可快照回滚;代价是镜像获取和资源占用需要自己解决。

Cisco DevNet 沙箱(云端)适合快速验证、不想折腾虚拟化的场景。登录 developer.cisco.com 后可以预约 Always-On 或 Reservation 类型的沙箱,常见的有 IOS-XE、NX-OS、IOS-XR 等。沙箱会给出跳板机地址、用户名、密码和端口,通常通过 VPN 或直接 SSH 接入。它的优势是开箱即用、多厂商镜像齐全;限制是有预约时长、拓扑不可改、网络可能不稳定。

建议策略:本地用 EVE-NG 搭一套 3~4 台设备的小拓扑作为主力练习环境,遇到镜像缺失或临时验证时用 DevNet 沙箱补充。两者并不冲突。

三、搭建一个多厂商实验拓扑

下面给出一个适合本课程的最小拓扑,覆盖三种主流平台,便于后续对比 Netmiko 与 NAPALM 的行为差异:

  • R1:Cisco IOSv,管理地址 192.168.100.11,SSH 端口 22
  • R2:Cisco IOS-XE(CSR1000v),管理地址 192.168.100.12,SSH 端口 22
  • SW1:Arista vEOS,管理地址 192.168.100.21,eAPI 端口 443,SSH 端口 22
  • SW2:Cisco NX-OSv,管理地址 192.168.100.31,NX-API 端口 443,SSH 端口 22

在 EVE-NG 中,把四台设备的 Management 接口接到同一个 pnet0(桥接到宿主机网卡),并给每台设备配置管理 IP 与默认网关。以 IOSv 为例,基础配置如下:

enable
configure terminal
hostname R1
interface GigabitEthernet0/0
 ip address 192.168.100.11 255.255.255.0
 no shutdown
exit
ip default-gateway 192.168.100.1
username admin privilege 15 secret Cisco123
line vty 0 4
 transport input ssh
 login local
exit
crypto key generate rsa modulus 1024
ip domain-name lab.local
end
write memory

vEOS 与 NX-OSv 的配置思路相同,只是命令语法不同。vEOS 需要额外开启 eAPI:

management api http-commands
   protocol https
   no shutdown
   vrf MGMT
      no shutdown

NX-OSv 则开启 NX-API:

feature nxapi
nxapi http port 80
nxapi https port 443

四、验证环境是否可用

配置完成后,先在宿主机上做连通性检查:

ping 192.168.100.11
ping 192.168.100.21
ssh admin@192.168.100.11
curl -k https://192.168.100.21/command-api

如果 ping 通、SSH 能登录、eAPI 返回 JSON 或 401(说明服务在监听),说明环境基本就绪。接下来安装 Python 依赖:

pip install netmiko napalm
python -c "import netmiko, napalm; print(netmiko.__version__, napalm.__version__)"

最后用一段最小脚本验证 Netmiko 能连上 R1:

from netmiko import ConnectHandler

dev = {
    "device_type": "cisco_ios",
    "host": "192.168.100.11",
    "username": "admin",
    "password": "Cisco123",
}
with ConnectHandler(**dev) as conn:
    print(conn.send_command("show ip interface brief"))

如果能看到接口列表回显,说明 Netmiko 链路打通。再用 NAPALM 验证结构化采集:

import napalm

driver = napalm.get_network_driver("ios")
dev = driver(
    hostname="192.168.100.11",
    username="admin",
    password="Cisco123",
)
dev.open()
print(dev.get_facts())
dev.close()

返回的字典里应包含 hostname、vendor、model、os_version、serial_number、uptime 等字段。到这里,你已经拥有了一个可用的多厂商实验环境,后续章节的所有示例都可以在这套拓扑上复现。

注意:EVE-NG 中设备重启后管理 IP 可能丢失,建议把管理配置写入启动配置(write memory 或 copy running-config startup-config),并在 EVE-NG 中为每台设备保存快照,避免每次重搭。