90DaysOfDevOps 网络自动化实战(Day 27):用 Python + Netmiko/Paramiko 批量采集、配置与备份网络设备

发布时间:2026/10/7 9:29:24
90DaysOfDevOps 网络自动化实战(Day 27):用 Python + Netmiko/Paramiko 批量采集、配置与备份网络设备 文档/教程【免费下载链接】90DaysOfDevOpsThis repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Principles, Processes, Tooling and Use Cases surrounding this vast topic.项目地址https://gitcode.com/gh_mirrors/90/90DaysOfDevOps点击查看免费下载导读本文是 #90DaysOfDevOps 计算机网络系列的最后一天实战篇承接 Day 26 在 EVE-NG 中搭建的「1 台 Cisco vIOS 路由器 4 台 Cisco vIOS 交换机」仿真 lab聚焦用 Python 对网络设备做自动化。读完本文你将掌握通过 SSH 批量采集多台设备接口信息、自动下发配置如 trunk 配置、自动备份设备配置并理解 Paramiko 与 Netmiko 这两大 Python SSH 库的定位差异与典型用法。文中所有脚本都来自仓库 2022/Days/Networking 目录可直接对照学习。一、环境回顾与前置准备1.1 上一讲的 Lab 拓扑与地址表Day 26 在 EVE-NG 中创建了 5 台设备1 台 Cisco vIOS 路由器R1充当网关4 台 Cisco vIOS 二层交换机SW1~SW4互联。每台设备在仿真内网10.10.88.0/24中的管理地址如下Node仿真内网 IPRouter10.10.88.110Switch110.10.88.111Switch210.10.88.112Switch310.10.88.113Switch410.10.88.114各设备的初始配置脚本保存在仓库 2022/Days/Networking 下R1、SW1、SW2、SW3、SW4内容均开启 SSHip ssh version 2、启用本地认证username admin password access123、设置 enable 密码enable password access123并开启 LLDP 与 SNMP为后续自动化通信做好了准备。1.2 让设备接入宿主机的管理网络Management Cloud自动化脚本要从宿主机直接访问这些设备因此需要让仿真拓扑与宿主机网络打通。操作如下在 EVE-NG 拓扑画布上右键 → Network → 选择 Management(Cloud0)这会在拓扑中创建一个连接到宿主机的新网络对应本讲 Day27_Networking3.png 右侧云图标所表示的 Home Network。依次进入每台设备在其连接该 Management 网络的接口gi0/0上执行以下命令让该接口通过 DHCP 从宿主机网络自动获取 IPenable config t int gi0/0 IP add DHCP no sh exit exit sh ip int br执行完成后每台设备除了仿真内网地址外还会获得一个 Home Network 段的地址用于宿主机 SSH 访问Node仿真内网 IPHome Network IPRouter10.10.88.110192.168.169.115Switch110.10.88.111192.168.169.178Switch210.10.88.112192.168.169.193Switch310.10.88.113192.168.169.125Switch410.10.88.114192.168.169.197提示如果网络经验有限也可以先把 Router 与各 Switch 连好再由 Router 作为网关连通外部网络本讲按「每台设备直接接入 Management(Cloud0)」的方式演示逻辑最直观。1.3 从宿主机 SSH 验证连通性拿到地址后即可用任意 SSH 客户端如 Windows 上的 Putty从宿主机连接设备。本讲以 Putty 为例通过 192.168.169.115 连接 R1登录后即可进入 Cisco IOS 命令行。二、方案一Paramiko —— 通用 SSH 库2.1 什么是 ParamikoParamiko 是 Python 生态中最广泛使用的原生 SSH 实现之一它实现了 SSHv2 协议提供客户端连接、通道channel、密钥交换、SFTP 等能力不依赖任何外部 SSH 程序适合对任意支持 SSH 的主机做底层交互。安装只需一行命令pip install paramiko安装后可以在 Python 交互环境中验证导入是否成功import paramiko2.2 用 Paramiko 采集设备信息仓库中的 paramiko_show.py 演示了 Paramiko 的典型用法建立 SSH 客户端、自动接受主机密钥、登录后打开交互式 shell 通道逐条发送命令并接收输出#!/usr/bin/python import paramiko import time Channel paramiko.SSHClient() Channel.set_missing_host_key_policy(paramiko.AutoAddPolicy()) Channel.connect(hostname192.168.169.115, usernameadmin, passwordaccess123, look_for_keysFalse, allow_agentFalse) shell Channel.invoke_shell() # This will set interactive shell shell.send(enable\n) shell.send(access123\n) shell.send(terminal length 0\n) shell.send(show ip int b\n) shell.send(show arp \n) time.sleep(2) print(shell.recv(5000)) # 需要精确获取某条命令输出时应先发送命令并立即读取再发下一条两条命令之间建议加一点 sleep Channel.close()关键点解读set_missing_host_key_policy(paramiko.AutoAddPolicy())自动接受未在 known_hosts 中出现过的主机公钥实验环境用很方便invoke_shell()创建交互式伪终端通道可以像人坐在 console 前一样连续发送命令、处理enable密码等状态变化look_for_keysFalse, allow_agentFalse明确不使用本机密钥与 ssh-agent而是用脚本内给定的用户名密码登录由于通道是交互式的命令输出是异步返回的因此发送命令后要time.sleep()等待再recv()读取缓冲区。三、方案二Netmiko —— 面向网络设备的封装库3.1 Netmiko 与 Paramiko 的分工Paramiko 是通用 SSH 库而Netmiko 专门面向网络设备在 Paramiko 之上封装了对 Cisco、Juniper、Arista、华为、H3C 等众多厂商设备的适配层自动处理各厂商特有的登录提示、分页符--More--、enable/特权模式、命令回显等差异让脚本只需写设备类型与命令本身。安装命令pip install netmikoNetmiko 对厂商设备的支持列表可在其官方仓库的 Supports 章节查阅。3.2 用 Netmiko 批量采集多台设备接口信息仓库 netmiko_con_multi.py 是「一次运行、连接全部设备」的示例把每台设备抽象成一个 Python 字典device_type、host、username、password循环建立连接、发送命令、打印输出#!/usr/bin/env python from netmiko import ConnectHandler from getpass import getpass # password getpass() R1 { device_type: cisco_ios, host: 192.168.169.115, username: admin, password: access123, } SW1 { device_type: cisco_ios, host: 192.168.169.178, username: admin, password: access123, } SW2 { device_type: cisco_ios, host: 192.168.169.193, username: admin, password: access123, } SW3 { device_type: cisco_ios, host: 192.168.169.125, username: admin, password: access123, } SW4 { device_type: cisco_ios, host: 192.168.169.197, username: admin, password: access123, } command show ip int brief for device in (R1, SW1, SW2, SW3, SW4): net_connect ConnectHandler(**device) print(net_connect.find_prompt()) print(net_connect.send_command(command)) net_connect.disconnect()运行后会依次打印 R1、SW1~SW4 的设备提示符如R1#以及show ip int brief的接口汇总接口名、IP、OK 状态、获取方式、接口状态、协议状态。脚本开头保留了getpass()的注释写法生产环境更推荐用交互式输入密码避免把口令硬编码进脚本。find_prompt()返回当前设备提示符用于确认已登录并处于正确模式send_command(command)发送一条 show 命令并等待完整输出返回Netmiko 会自动处理分页disconnect()断开连接释放资源。如果设备数量很多这种「设备字典 循环」模式可以让你集中管理、一次运行查看所有配置非常利于快速巡检。四、用 Python 下发配置trunk 自动化4.1 场景批量把端口配置为 trunk上一讲提到 SW1 与 SW2 之间有一条 trunk 链路。若手动逐台 SSH 配置既慢又易错自动化则可以一条脚本同时改多台交换机。仓库 netmiko_sendchange.py 演示了向 SW2 下发一组 trunk 配置from netmiko import ConnectHandler SW2 { device_type: cisco_ios, host: 192.168.169.193, username: admin, password: access123, secret: access123, } core_sw_config [int range gig0/1 - 2, switchport trunk encapsulation dot1q, switchport mode trunk, switchport trunk allowed vlan 1,2] print(########## Connecting to Device {0} ############.format(SW2)) net_connect ConnectHandler(**SW2) net_connect.enable() print(***** Sending Configuration to Device *****) net_connect.send_config_set(core_sw_config)要点连接字典中多了secret字段这是 enable/特权模式的密码配合net_connect.enable()进入特权模式真实设备上请使用与enable password一致的密码send_config_set([...])接收一个配置命令列表Netmiko 会依次进入配置模式、逐条下发、再退出一条脚本即可完成成组配置配置命令int range gig0/1 - 2进入一组接口→switchport trunk encapsulation dot1qtrunk 封装→switchport mode trunktrunk 模式→switchport trunk allowed vlan 1,2允许 VLAN 1 与 2 通过。注意脚本打印了sending configuration to device字样但这只是「正在发送」的提示并不代表配置已生效。生产使用时应补充验证环节。4.2 验证配置结果批量查询 trunk 状态为确认配置真实生效可复用「设备字典 循环」模式把命令换成show int trunk。仓库 netmiko_con_multi_vlan.py 正是这样做的——遍历 SW1~SW4 执行show int trunk输出每台交换机 Trunk 口的模式、封装、状态、本征 VLAN、允许通过的 VLAN 以及生成树中处于转发状态未阻塞的 VLAN用于核验配置是否成功下发#!/usr/bin/env python from netmiko import ConnectHandler from getpass import getpass # password getpass() SW1 { device_type: cisco_ios, host: 192.168.169.178, username: admin, password: access123, } SW2 { device_type: cisco_ios, host: 192.168.169.193, username: admin, password: access123, } SW3 { device_type: cisco_ios, host: 192.168.169.125, username: admin, password: access123, } SW4 { device_type: cisco_ios, host: 192.168.169.197, username: admin, password: access123, } command show int trunk for device in (SW1, SW2, SW3, SW4): net_connect ConnectHandler(**device) print(net_connect.find_prompt()) print(net_connect.send_command(command)) net_connect.disconnect()这样「下发配置 → 批量验证」两段式流程构成了网络自动化最基础的闭环先改、再查、确保生效。五、用 Python 备份设备配置除了采集与配置配置备份也是网络运维的高频需求。仓库 backup.py 用 Paramiko 实现了一个可运行的备份脚本从文本文件读取目标 IP 列表逐台 SSH 登录、进入 enable、执行show run把回显落盘为带时间戳的文件并打印耗时统计import sys import time import paramiko import os import cmd import datetime now datetime.datetime.now() dt_string now.strftime(%d/%m/%Y %H:%M:%S) print(Your backup has started at, dt_string) tic time.perf_counter() # user input(Enter username:) # password input(Enter Paswd:) # enable_password input(Enter enable pswd:) user admin password access123 enable_password access123 port 22 f0 open(backup.txt) for ip in f0.readlines(): ip ip.strip() filename_prefix /Users/shambhu/Documents ip ssh paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(ip, port, user, password, look_for_keysFalse) chan ssh.invoke_shell() time.sleep(2) chan.send(enable\n) chan.send(enable_password \n) time.sleep(1) chan.send(term len 0\n) time.sleep(1) chan.send(sh run\n) time.sleep(20) output chan.recv(999999) filename %s_%.2i%.2i%i_%.2i%.2i%.2i % (ip, now.year, now.month, now.day, now.hour, now.minute, now.second) f1 open(filename, a) f1.write(output.decode(utf-8)) f1.close() ssh.close() f0.close() toc time.perf_counter() print(Congratulations You Have Backed Up Your 90DaysOfDevOps Lab) print(fYour backup duration was {toc - tic:0.4f} seconds) dt_string now.strftime(%d/%m/%Y %H:%M:%S) print(Your backup completed at, dt_string)配套的 backup.txt 中按行列出要备份的设备 IP192.168.169.115 192.168.169.178 192.168.169.193 192.168.169.125 192.168.169.197运行后终端会依次显示备份开始时间、每台设备的执行过程、总耗时与完成时间随后在脚本目录下生成以IP_年月日_时分秒命名的备份文件。仓库中已包含一次真实备份产物例如 192.168.169.115_20220127_145846内容为该设备的完整show running-config回显可打开对照查看备份格式与内容。两点改进建议示例中备份文件前缀filename_prefix变量在仓库脚本中未实际使用文件直接写在脚本所在目录真实环境中建议用完整路径把备份集中存放并考虑用getpass输入凭据而不是硬编码。六、扩展其他值得了解的自动化库除了 Paramiko 与 Netmiko网络自动化生态中还有两个仓库脚本未展开、但很常用的库netaddr专门处理 IP 地址与子网计算的库如地址解析、CIDR 运算、网段规划安装命令pip install netaddrxlrd用于读取 Excel 文件的库可以把多台交换机配置等表格数据读成矩阵便于批量驱动脚本安装命令pip install xlrd。此外Netmiko 作者维护的 pynet 仓库中还提供了更多网络自动化示例如演示文稿配套代码可作为后续深入学习的素材。七、总结一条脚本搞定「采配置、改配置、备配置」回顾本讲围绕 Day 26 的 EVE-NG 仿真网络我们用 Python 完成了三类核心运维动作并且都在仓库 2022/Days/Networking 中留有一一对应的可运行脚本运维动作核心脚本关键 API/手段批量采集接口信息netmiko_con_multi.pyConnectHandlersend_command批量下发 trunk 配置netmiko_sendchange.pyenable()send_config_set验证配置结果netmiko_con_multi_vlan.pysend_command(show int trunk)批量备份配置backup.py backup.txtParamikoinvoke_shellshow run选型建议追求厂商适配与开箱即用选 Netmiko它本身构建在 Paramiko 之上需要对 SSH 做底层精细控制SFTP、端口转发、自定义通道选 Paramiko。两者的组合例如 Netmiko 负责日常运维、Paramiko 处理备份等定制任务正是本讲仓库脚本呈现的典型分工。计算机网络系列到此告一段落。Day 27 也标志着从「网络原理」正式走向「网络即代码」的落地当设备规模从 5 台扩展到成百上千台时「集中控制 一次运行」的自动化脚本就是你最趁手的运维工具。下一站 Day 28 将进入云计算主题。参考资源Day 26 建 Lab 详情2022/vi/Days/day26.md网络自动化脚本与设备配置目录2022/Days/Networking本讲配图Day27_Networking3.png、Day27_Networking6.png、Day27_Networking8.png赞分享文档/教程【免费下载链接】90DaysOfDevOpsThis repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Principles, Processes, Tooling and Use Cases surrounding this vast topic.项目地址https://gitcode.com/gh_mirrors/90/90DaysOfDevOps点击查看免费下载相关推荐90DaysOfDevOps 实战用 Python Netmiko/Paramiko 自动化 EVE-NG 网络设备Day 2790DaysOfDevOps 实战用 Python Netmiko/Paramiko 自动化 EVE NG 网络设备Day 27 本篇以 90Days文档/教程90DaysOfDevOps 网络自动化实战用 Python Netmiko/Paramiko 管理 EVE-NG 仿真设备Day 2790DaysOfDevOps 网络自动化实战用 Python Netmiko/Paramiko 管理 EVE NG 仿真设备Day 27 本文对应 9文档/教程90DaysOfDevOps 第27天用 Python 与 Netmiko 实战网络设备自动化90DaysOfDevOps 第27天用 Python 与 Netmiko 实战网络设备自动化 本指南围绕 90DaysOfDevOps 网络基础章节的收尾篇文档/教程上一篇初识智能体从概念原理到 5 分钟构建你的第一个 LLM Agenthello-agents 第一章实战指南下一篇Universal Android Debloater深度评测为什么它能提升你的设备性能创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询