使用多线程操作 paramiko 执行命令
背景
最近公司内网设备版本有些问题,会出现队列丢包现象,由于设备较多,写个脚本定期收集会方便一点,不过内网只有 paramiko,所以简单造了一个轮子,实现多线程并发登录设备执行命令并对结果进行解析。
用这个脚本可以在网络设备上执行任何命令,实现各种功能,而且多线程并发很 Nice!
本次用到的命令及输出示例如下:
# [H3C]dis qos queue-statistics interface outbound | in "^ Drop"
# Dropped: 0 packets, 0 bytes
这个命令用来收集当前设备上所有接口的所有队列的转发信息累计值(bytes 和 packages)。
一张图了解 Nornir 基础概念及用法
分析源码,认识 Nornir
格式化输出NETCONF回显内容
在 《Python 使用 NETCONF 管理配置 H3C 网络设备》中,简单介绍了 Python 使用 NETCONF 操作网络设备。
对于配置类的操作,即 edit-config
,NETCONF 的回显内容一般情况下为 ok
或者具体的报错信息;对于查询类的操作,即 get
get-config
等,回显内容为 XML 格式,可读性较差,此时需要对查询到的内容进行格式化。
思路
对于 XML 格式的数据,可以直接使用 XML 模块来进行解析,由于查询信息时,已经传入了一个 XML,那么进行解析时,可以根据这个 XML 来进行操作,使用 lxml 模块来进行实际操作。
针对网络设备的回显信息,先解析为 lxml 支持的格式如 Element
,再使用 lxml 中 find 相关的方法,并添加上命名空间和具体的查询元素,查找到最终想要的信息。
Python 使用 NETCONF 管理配置 H3C 网络设备
之前简单介绍了 Python 针对 XML 文件的操作方式,XML 的诸多特性使得它非常适合程序之间的数据传输,NETCONF 就是采用 XML 来进行工作。
NETCONF 简单介绍
NETCONF(Network Configuration Protocol,网络配置协议)是一种基于 XML 的网络管理协议,它提供了一种可编程的、对网络设备进行配置和管理的方法。
NETCONF 报文使用 XML 格式,具有强大的过滤能力,而且每一个数据项都有一个固定的元素名称和位置,所以具有很强的兼容性,不同厂家不同设备可以通过 XML 得到相同的结果,便于混合不同厂商不同设备的为冷热软件开发。
NETCONF 协议结构
NETCONF 采用分层结构,分别为:
- Content 内容层
- Operations 操作层
- RPC(Remote Procedure Call)远程调用层
- Transport Protocol 通信协议层