ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

90DaysOfDevOps 实战:用 Python + Netmiko/Paramiko 自动化 EVE-NG 网络设备(Day 27)

90DaysOfDevOps 实战:用 Python + Netmiko/Paramiko 自动化 EVE-NG 网络设备(Day 27) 文档/教程【免费下载链接】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 第 27 天笔记为核心在 Day 26 用 EVE-NG 搭好的「1 台路由器 4 台交换机」模拟拓扑上演示如何用 SSH 隧道连接网络设备并通过 Python 的 Netmiko、Paramiko 完成批量信息采集、批量配置下发与配置备份。读完本文你将能复现一套从「手动 SSH」升级为「脚本化网络运维」的完整流程并把仓库 2022/Days/Networking 下的脚本直接改造用于自己的实验环境。环境回顾Day 26 搭建的 EVE-NG 模拟网络本实验建立在前一天的 EVE-NG 模拟环境之上。Day 26 已经在 EVE-NG 中部署了 1 台 Cisco vIOS 路由器R1与 4 台 Cisco vIOS 交换机SW1SW4并为其配置了管理地址NodeIP AddressHome Network IPDHCP 分配Router10.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对应设备的参考配置保留在仓库 Networking 目录 中例如路由器的 R1 与交换机的 SW1 配置文件。从这些配置可以看到每台设备都开启了 SSH 服务ip ssh version 2、crypto key generate rsa、本地账号认证username admin password access123、并设置了 enable 密码这正是后续 Python 脚本能够通过 SSH 自动登录的基础。Day 27 的目标很明确不再一台台打开控制台手动敲命令而是从工作站通过加密的 SSH 隧道连接设备用 Python 脚本完成三类常见运维任务——采集信息、下发配置、备份配置。第一步让 EVE-NG 拓扑接入你的家庭网络Cloud0Python 脚本要从工作站直接访问模拟设备需要先把 EVE-NG 的网络桥接到宿主机所在的物理网络。操作方式在 EVE-NG 画布上右键 → 选择 Network → 选择 Management(Cloud0)即可把该云节点桥接bridge到家庭网络。随后需要为新网络到每一台设备之间添加连接线文档作者也指出更简洁的做法可能是在顶层路由器上加一条线让其余设备通过这条链路获得连通性。网络建好后登录每一台设备在与云相连的接口上执行以下命令让设备从家庭网络的路由器获取 DHCP 地址enable config t int gi0/0 ip add dhcp no sh exit exit sh ip int br最后一条sh ip int br用于确认接口拿到了 DHCP 地址。执行完成后各设备便同时拥有了两个身份拓扑内部管理地址10.10.88.x与家庭网络地址192.168.169.x即上表第三列。第二步SSH 登录网络设备桥接完成后工作站即可直接 SSH 到设备。文档作者使用 Putty也可以使用 git bash 等其他终端。SSH 相比 telnet 的关键优势在于客户端与设备之间建立的 SSH 隧道是加密的。SSH 的概念在 Day 18 的 Linux 章节已有介绍。登录后即可进入设备的 CLI 交互界面为后续用脚本替代手工操作打下基础。实战一用 Netmiko 批量采集设备信息手工场景下查看 5 台设备的接口状态需要登录 5 次而脚本只需一次执行。第一个示例脚本是 netmiko_con_multi.py其核心逻辑如下#!/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 / SW3 / SW4 结构相同仅 host 不同 ... 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()关键点拆解设备字典每台设备以device_type、host、username、password四个键描述。device_type告诉 Netmiko 使用哪种厂商的驱动与交互方式这里统一为cisco_ios。连接与关闭ConnectHandler(**device)建立 SSH 连接find_prompt()返回设备当前提示符如R1#用于确认连接成功disconnect()关闭会话避免连接泄漏。批量循环for device in (R1, SW1, SW2, SW3, SW4)依次连接 5 台设备执行show ip int brief并打印结果。运行后即可一次性看到所有设备的每个端口的接口状态与配置。如果你的环境里有大量不同设备这样一个集中式脚本能让你在一个窗口内快速理解全部配置实现一处管理、全局可见。仓库中还提供了第二个批量示例 netmiko_con_multi_vlan.py它只遍历 SW1SW4执行的是show int trunk用于验证中继端口trunk配置是否正确——这正是采集之后顺手验证的典型用法。实战二用 Netmiko 批量下发配置配置 SW1/SW2 之间的 Trunk采集只是第一步自动化真正的价值在于批量改配置。场景SW1 与 SW2 之间存在 trunk 中继端口如果同样的事情要在很多台交换机上重复执行手工逐台登录配置显然不可取。脚本 netmiko_sendchange.py 演示了这一过程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()切换到特权模式。core_sw_config是一个配置命令列表int range gig0/1 - 2进入接口范围switchport trunk encapsulation dot1q指定 trunk 封装为 802.1Qswitchport mode trunk设为 trunk 模式switchport trunk allowed vlan 1,2限定允许的 VLAN。send_config_set()会把这些命令逐条推送到设备并自动进入配置模式相当于手工的config t这正是 Netmiko 相比裸 Paramiko 的便利之处。文档作者特别指出一个值得注意的细节脚本只打印了sending configuration to device并没有确认配置真的生效。要弥补这一点要么在脚本末尾追加验证代码比如重新show running-config或show int trunk要么直接使用前面提到的 netmiko_con_multi_vlan.py 来检查 trunk 状态——这正是网络自动化里先下发、再校验的闭环思路。实战三用 Paramiko 批量备份设备配置最后一个高频场景是配置备份。要确保所有网络配置被定期留存又不能手动连接每一台设备可以自动化完成。文档作者使用基于 Paramiko 的 backup.py同时需要维护一个 IP 清单 backup.txt192.168.169.115 192.168.169.178 192.168.169.193 192.168.169.125 192.168.169.197backup.py 的工作流程源码解读import time import paramiko 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 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)脚本要点读取 IP 清单open(backup.txt)逐行读取要备份的设备地址用strip()去除换行。交互式 shell 模拟invoke_shell()开启一个类似终端的交互通道然后依次发送enable、enable 密码、term len 0关闭分页防止输出被截断、sh run导出完整运行配置。抓取输出chan.recv(999999)读取设备返回的全部文本按IP_年月日_时分秒命名写入备份文件例如192.168.169.115_20220127_145846——仓库 Networking 目录 中保留了这类备份产物。时间戳与计时datetime记录备份开始/完成时间time.perf_counter()统计整个备份耗时。注意filename_prefix硬编码了作者的 macOS 路径/Users/shambhu/Documents复用时请改成你自己的目录文档同时提醒脚本打印的成功信息只是简单的 print 输出实际应以生成的备份文件为准来确认备份成功。另一个低层示例是 paramiko_show.py它用paramiko.SSHClient()invoke_shell()直接向 R1192.168.169.115发送show ip int b、show arp等命令展示了一条命令如何对应一次send/recv交互是理解 Paramiko 工作原理的最小样例。工具链梳理Paramiko 与 Netmiko 的定位与安装两个模块在本实验中分工不同Paramiko一个广泛使用的 Python SSH 底层模块负责建立加密的 SSH 连接、执行命令、传输文件等通用能力。Netmiko在 Paramiko 之上封装专门面向网络设备内置了大量厂商的交互处理提示符匹配、特权模式、分页处理等所以像进入配置模式下发一组命令这样的操作只需一行send_config_set()。安装都很简单pip install paramiko pip install netmiko安装后可以进入 Python 交互式 shell执行import paramiko以及import netmiko来确认模块可用。Netmiko 官方支持众多网络厂商与设备型号可在其项目 README 的 Supports 章节查看支持列表本文不再赘述外部链接。延伸模块netaddr 与 xlrd还有两个对网络自动化很有用的模块值得了解netaddr用于处理与操纵 IP 地址子网划分、地址范围计算等安装pip install netaddr。xlrd如果你的大量交换机配置存放在 Excel 表格中xlrd可以让脚本读取 Excel 工作簿把行与列转换为矩阵数据结构供程序处理安装pip install xlrd。这两个模块在 Day 27 的示例中未展开使用但它们是构建IP 规划自动化配置清单驱动自动化等更复杂场景的常用积木。小结从手动 SSH 到脚本化网络运维Day 27 用一条清晰的路径完成了网络自动化的入门闭环打通通路通过 EVE-NG 的 Cloud0 把模拟拓扑桥接到家庭网络让工作站能 SSH 直达设备批量采集Netmiko 一次连接 5 台设备抓取接口状态批量下发Netmiko 的send_config_set()自动推送 trunk 配置再配合show int trunk脚本做结果校验自动备份Paramiko 交互通道批量抓取sh run并按时间戳落盘。所有脚本与配置均可直接在仓库 2022/Days/Networking 中查看批量采集见 netmiko_con_multi.py 与 netmiko_con_multi_vlan.py配置下发见 netmiko_sendchange.py备份见 backup.py 与 backup.txt设备基线配置见 R1 / SW1 等文件。动手复现时记得把脚本中的 IP、用户名密码示例为 admin/access123替换为你自己的实验环境参数并把备份输出目录改为本地实际路径。下一篇 Day 28 将进入云计算主题建立对该领域的基础认知。赞分享文档/教程【免费下载链接】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 本文对应 9文档/教程90DaysOfDevOps 第27天用 Python 与 Netmiko 实战网络设备自动化90DaysOfDevOps 第27天用 Python 与 Netmiko 实战网络设备自动化 本指南围绕 90DaysOfDevOps 网络基础章节的收尾篇文档/教程90DaysOfDevOps 网络自动化实战Day 26用 EVE-NG 构建网络自动化实验环境90DaysOfDevOps 网络自动化实战Day 26用 EVE NG 构建网络自动化实验环境 导读 本篇文章承接 Day 25 的 EVE NG 安文档/教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表