1. 课程导入与环境准备
网络自动化与批量运维,解决的是同一个根本矛盾:设备数量增长的速度,远远快于人工登录、逐台敲命令的速度。当网络规模从十几台扩展到几百上千台时,运维人员面对的不再是"会不会配这条命令",而是"如何在可接受的时间内、以可重复且可审计的方式,把同一意图施加到所有目标设备上,并确认结果一致"。Python 之所以成为这一领域的主流工具,是因为它既有成熟的 SSH/API 客户端库,又有良好的文本处理、并发与结构化数据能力,能把"登录—执行—解析—判断—记录"这条链路固化成脚本。
本章的目标不是立刻写出复杂脚本,而是把后续 29 章都要依赖的运行环境一次性搭稳:Python 解释器、核心库、实验设备(或模拟器)三者齐备,并且能用一段最小可运行代码证明"脚本确实连上了设备并拿到了回显"。环境不稳,后面所有排障都会变成猜谜。
一、先明确自动化要替代的三类重复劳动
在动手装库之前,先建立价值判断,避免把自动化用在错误的地方。典型可自动化场景有三类:
- 批量配置下发:如为 200 台接入交换机统一配置 NTP 服务器、SNMP 团体字、管理 VLAN。
- 批量信息采集:如定期抓取所有设备的
show version、接口状态、ARP 表,汇总成表格用于巡检。 - 配置合规核查:如检查是否存在默认口令、是否关闭了未使用端口、ACL 是否被误删。
与之相对,一次性、探索性、需要现场判断的排障操作,往往不适合直接自动化。判断标准很简单:操作是否可重复、输入是否可枚举、结果是否可判定。三者都满足,才值得写成脚本。
二、Python 环境与核心库的安装
推荐使用 Python 3.10 及以上版本,并用虚拟环境隔离依赖,避免污染系统解释器。以下命令在 Windows、macOS、Linux 上通用(Windows 用 python 替代 python3):
python3 -m venv netauto
source netauto/bin/activate # Windows: netauto\Scripts\activate
python -m pip install --upgrade pip
pip install paramiko netmiko nornir napalm
四个库的定位不同,理解分工才能选对工具:
| 库 | 层次 | 典型用途 |
|---|---|---|
| Paramiko | SSH 底层 | 自己实现连接、执行命令、SFTP 传文件 |
| Netmiko | 多厂商 SSH 封装 | 自动处理分页、提示符、enable 模式,快速下发配置 |
| Nornir | 并发编排框架 | 管理设备清单、并发执行任务、汇总结果 |
| NAPALM | 多厂商抽象层 | 用统一接口获取结构化状态、做配置比对与回滚 |
安装完成后必须验证,而不是假设成功。逐条执行以下导入检查:
python -c "import paramiko, netmiko, nornir, napalm; print('ok')"
python -c "import paramiko; print(paramiko.__version__)"
python -c "import netmiko; print(netmiko.__version__)"
若某条报 ModuleNotFoundError,说明该库未装进当前虚拟环境,先确认 which python 指向虚拟环境目录再重装。若报编译类错误(常见于 Paramiko 依赖的 cryptography),优先升级 pip 并使用预编译 wheel,而不是手工编译。
三、准备实验设备:真机与模拟器
没有设备就无法验证脚本。两种可行路径:
- 真机/实验机:任意支持 SSH 的交换机、路由器、防火墙。需提前开启 SSH、创建专用账号、确认管理地址可达。
- 模拟器:GNS3、EVE-NG、Cisco Packet Tracer、华为 eNSP,或容器化的网络操作系统镜像。模拟器可随时重置,适合反复试错。
无论哪种,都要准备一份设备清单,作为后续 Nornir 的 inventory 基础。建议先用 YAML 维护,字段保持最小必要:
# inventory/hosts.yaml
sw01:
hostname: 192.168.10.11
platform: cisco_ios
username: netops
password: "示例口令"
sw02:
hostname: 192.168.10.12
platform: cisco_ios
username: netops
password: "示例口令"
注意:示例中的 IP、账号、口令均为教学占位值,实际使用时替换为你自己的实验环境参数,且不要把真实口令提交到版本库。
四、最小连通性验证
环境是否可用,用一段最短的 Netmiko 脚本即可判定。它连接单台设备、执行一条只读命令、打印回显:
from netmiko import ConnectHandler
dev = {
"device_type": "cisco_ios",
"host": "192.168.10.11",
"username": "netops",
"password": "示例口令",
}
with ConnectHandler(**dev) as conn:
out = conn.send_command("show version")
print(out[:300])
结果判读分三种情况:能打印出设备版本信息,说明 SSH 可达、认证通过、库工作正常,环境就绪;若卡住或超时,先 ping 管理地址、再确认 22 端口是否开放;若抛出认证失败,检查账号权限与是否需要在设备上放行该源地址。这一步通过后,后续章节的批量脚本才有可靠地基。
五、常见环境问题与处理
环境搭建阶段的高频故障集中在三处,提前知道判断依据可以省下大量时间:
- 库装错环境:脚本报
ModuleNotFoundError,但pip list里明明有。原因是 pip 与运行脚本的解释器不是同一个,用python -m pip install而非裸pip install可规避。 - SSH 握手失败:报
Unable to negotiate或算法不匹配。老设备只支持旧 KEX/加密算法,需要在连接参数中显式放宽,或升级设备固件。 - 命令回显被分页截断:Netmiko 通常会自动处理
--More--,但自定义 Paramiko 脚本必须自己发送空格或关闭分页,否则只能拿到第一屏。
check_env.py,把四个库的导入、版本打印、单设备连通性测试串起来。每次换机器或升级依赖后先跑它,把环境问题挡在业务脚本之前。完成本章后,你应当拥有:一个隔离的 Python 虚拟环境、四个已验证可导入的核心库、一份可编辑的设备清单、以及一次成功的单设备命令回显。这四样东西是后续批量下发、并发编排、结构化采集与合规核查的共同起点。接下来所有章节的脚本,都将在这一环境上直接运行。