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

四个库的定位不同,理解分工才能选对工具:

库层次典型用途
ParamikoSSH 底层自己实现连接、执行命令、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 端口是否开放;若抛出认证失败,检查账号权限与是否需要在设备上放行该源地址。这一步通过后,后续章节的批量脚本才有可靠地基。

网络自动化环境分层与验证链路 控制端(本机) Python 3.10+ 虚拟环境 Paramiko / Netmiko Nornir / NAPALM 设备清单 inventory hostname / platform username / password YAML 结构化维护 目标设备 / 模拟器 交换机 / 路由器 / 防火墙 GNS3 / EVE-NG / eNSP SSH 22 端口可达 最小连通性验证链路 导入四个库 import 检查 读取清单 host / platform SSH 登录 认证 + 提示符 执行 show version 拿到回显 判定:能打印设备版本信息 → 环境就绪;超时 → 查 IP/22 端口;认证失败 → 查账号与源地址放行

五、常见环境问题与处理

环境搭建阶段的高频故障集中在三处,提前知道判断依据可以省下大量时间:

  • 库装错环境:脚本报 ModuleNotFoundError,但 pip list 里明明有。原因是 pip 与运行脚本的解释器不是同一个,用 python -m pip install 而非裸 pip install 可规避。
  • SSH 握手失败:报 Unable to negotiate 或算法不匹配。老设备只支持旧 KEX/加密算法,需要在连接参数中显式放宽,或升级设备固件。
  • 命令回显被分页截断:Netmiko 通常会自动处理 --More--,但自定义 Paramiko 脚本必须自己发送空格或关闭分页,否则只能拿到第一屏。
建议在项目根目录放一个 check_env.py,把四个库的导入、版本打印、单设备连通性测试串起来。每次换机器或升级依赖后先跑它,把环境问题挡在业务脚本之前。

完成本章后,你应当拥有:一个隔离的 Python 虚拟环境、四个已验证可导入的核心库、一份可编辑的设备清单、以及一次成功的单设备命令回显。这四样东西是后续批量下发、并发编排、结构化采集与合规核查的共同起点。接下来所有章节的脚本,都将在这一环境上直接运行。