Python自动化运维-使用Matplotlib库可视化处理设备返回数据

也许你要早上七点起床,晚上十二点睡觉,日复一日,踽踽独行。但只要笃定而动情地活着,即使生不逢时,你人生最坏的结果,也只是大器晚成。

俗话说,一图胜过千言万语。从网络设备中可以获取到大量信息,如接口状态、接口计数器、路由更新、丢包、数据流量等。这些数据经过可视化处理后放入图标中有助于查看整个网络的全貌。Matplotlib库是Python中一个非常强大的库,可以生成图形并支持自定义。

Matplotlib库支持大多数常见的图标类型,如折线图、散点图、条形图、饼图、栈图、3D图和地图。

一、安装Matplotlib库

首先,使用pip从Pypi安装库。注意,在安装过程中需要安装一些其他软件包,如numpy和six.

pip install matplotlib -i  https://pypi.tuna.tsinghua.edu.cn/simple   //清华大学pip镜像站
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting matplotlib
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/9c/64/e4a8012e0e38513b978b15bf883540c4cc3e998ada03787de9dbbf0828de/matplotlib-3.3.4-cp39-cp39-win_amd64.whl (8.5 MB)
     |████████████████████████████████| 8.5 MB 3.2 MB/s
Collecting cycler>=0.10
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/f7/d2/e07d3ebb2bd7af696440ce7e754c59dd546ffe1bbe732c8ab68b9c834e61/cycler-0.10.0-py2.py3-none-any.whl (6.5 kB)
Collecting kiwisolver>=1.0.1
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/f0/36/c73afc541a7b88e7f91b1c409fba64b244b4b42f0fd9cdb80e8cdf88664f/kiwisolver-1.3.1-cp39-cp39-win_amd64.whl (51 kB)
     |████████████████████████████████| 51 kB 212 kB/s
Collecting numpy>=1.15
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/ab/bb/695066483b2329d0cfa3658cad0b1c007539d5247c054033a171b03cefa0/numpy-1.20.1-cp39-cp39-win_amd64.whl (13.7 MB)
     |████████████████████████████████| 13.7 MB ...
Collecting pillow>=6.2.0
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/12/82/70c778dd2b40d8d4c35291b51ab4184885f58d5a710643b89e6b961b4803/Pillow-8.1.2-cp39-cp39-win_amd64.whl (2.2 MB)
     |████████████████████████████████| 2.2 MB 6.4 MB/s
Collecting pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.3
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/8a/bb/488841f56197b13700afd5658fc279a2025a39e22449b7cf29864669b15d/pyparsing-2.4.7-py2.py3-none-any.whl (67 kB)
     |████████████████████████████████| 67 kB ...
Collecting python-dateutil>=2.1
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/d4/70/d60450c3dd48ef87586924207ae8907090de0b306af2bce5d134d78615cb/python_dateutil-2.8.1-py2.py3-none-any.whl (227 kB)
     |████████████████████████████████| 227 kB 6.4 MB/s
Collecting six
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/ee/ff/48bde5c0f013094d729fe4b0316ba2a24774b3ff1c52d924a8a4cb04078a/six-1.15.0-py2.py3-none-any.whl (10 kB)
Installing collected packages: six, python-dateutil, pyparsing, pillow, numpy, kiwisolver, cycler, matplotlib
Successfully installed cycler-0.10.0 kiwisolver-1.3.1 matplotlib-3.3.4 numpy-1.20.1 pillow-8.1.2 pyparsing-2.4.7 python-dateutil-2.8.1 six-1.15.0

然后试着导入Matplotlib,如果没有错误输出,就说明模块已经安装成功。

import sys; print('Python %s on %s' % (sys.version, sys.platform))
import django; print('Django %s' % django.get_version())
sys.path.extend(['D:\\python_demo', 'D:\\windows10\\PyCharm 2020.3.2\\plugins\\python\\helpers\\pycharm', 'D:\\windows10\\PyCharm 2020.3.2\\plugins\\python\\helpers\\pydev'])
if 'setup' in dir(django): django.setup()
import django_manage_shell; django_manage_shell.run("D:/python_demo")
PyDev console: starting.
Python 3.9.1 (tags/v3.9.1:1e5d33e, Dec  7 2020, 17:08:21) [MSC v.1927 64 bit (AMD64)] on win32
Django 3.1.4
import matplotlib

二、使用Matplotlib库

我们将从简单的例子开始探索matplotlib库的功能。首先,在python脚本中导入Matplotlib库。

import matplotlib.pyplot as plt

注意,为了方便在后面的脚本中使用,导入pyplot是使用了短名称plt。然后开始使用plot()方法描绘一个由两个列表组成的数据。第一个列表表示X轴的值,第一个列表表示Y轴的值。

plt.plot([0, 1, 2, 3, 4], [0, 10, 20, 30, 40])

上面的这行脚本会将数值放入图中,最后,使用show()方法在窗口中画图。

plt.show()

在图形中可以看到一条由输入手机构成的的线。在输出窗口中,支持下列操作:

  • 使用十字图标移动图形
  • 调整图形的大小
  • 使用缩放图标缩放某个区域
  • 使用主页图标返回原始视图
  • 使用保存图标来保存图形

另外,还可以自定义图形,如给如给图形添加标题,给坐标轴添加标签。如果同一张图上有多条曲线,还可以添加图例以解释每条曲线的含义。

import matplotlib.pyplot as plt

plt.plot([0, 1, 2, 3, 4], [0, 10, 20, 30, 40])
plt.xlabel("The x axis")
plt.ylabel("The y axis")
plt.title("Basic use of Matplotlib")
plt.show()

注意,不支持输入中文,上述代码的运行结果如下图所示:

在同一个图上可以绘制多个数据集,只需要将另一个数据列表添加到上一张图中,Matplotlib就可以将他显示出来。此外还可以对图上的数据集添加标签以示区别,这些标签的图例可以试用函数legend()输出到图上。

import matplotlib.pyplot as plt

plt.plot([0, 1, 2, 3, 4], [0, 10, 20, 30, 40], label="First Line")
plt.plot([5, 6, 7, 8, 9], [50, 60, 70, 80, 90], label="Second Line")
plt.xlabel("The x axis")
plt.ylabel("The y axis")
plt.title("Basic use of Matplotlib")
plt.legend()
plt.show()

上述代码运行结果如下图所示:

三、使用Matplotlib库可视化SNMP

在这个例子中我们将利用pysnmp模块向路由器发送SNMP GET请求,以获取某个接口输入和输出的流量速率,然后用Matplotlib库将数据可视化,使用对象标识符(Object Identifier, OID).1.3.6.1.4.1.9.2.2.1.1.6.3和.1.3.6.1.4.1.9.2.2.1.1.8.3分别代表输入与输出的流量速率。

使用pysnmp库前,请先安装pysnmp。

D:\pythonProject2>pip install pysnmp -i  https://pypi.tuna.tsinghua.edu.cn/simple
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting pysnmp
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/25/7e/1e17facea54dd21c6a72db6ae57a5bfdd56edd54b8c4850668b554bdddba/pysnmp-4.4.12-py2.py3-none-any.whl (296 kB)
     |████████████████████████████████| 296 kB 167 kB/s
Collecting pysmi
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/1f/fc/02361d1c2b247de73070c457c4da98c448693154894c14f2d7b48dfabf7e/pysmi-0.3.4-py2.py3-none-any.whl (80 kB)
     |████████████████████████████████| 80 kB 56 kB/s
Collecting pyasn1>=0.2.3
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/62/1e/a94a8d635fa3ce4cfc7f506003548d0a2447ae76fd5ca53932970fe3053f/pyasn1-0.4.8-py2.py3-none-any.whl (77 kB)
     |████████████████████████████████| 77 kB 102 kB/s
Collecting pycryptodomex
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/1c/63/185b403c095031aca67d753998d9a734201a5b7272a1dcbe758f13de7cec/pycryptodomex-3.10.1-cp35-abi3-win_amd64.whl (1.6 MB)
     |████████████████████████████████| 1.6 MB 544 kB/s
Collecting ply
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/a3/58/35da89ee790598a0700ea49b2a66594140f44dec458c07e8e3d4979137fc/ply-3.11-py2.py3-none-any.whl (49 kB)
     |████████████████████████████████| 49 kB 322 kB/s
Installing collected packages: ply, pysmi, pyasn1, pycryptodomex, pysnmp
Successfully installed ply-3.11 pyasn1-0.4.8 pycryptodomex-3.10.1 pysmi-0.3.4 pysnmp-4.4.12

引入pysnmp

from pysnmp.entity.rfc3413.oneliner import cmdgen

完整示例代码:

import matplotlib.pyplot as plt
from pysnmp.entity.rfc3413.oneliner import cmdgen
import time


cmdGen = cmdgen.CommandGenerator()
snmp_community = cmdgen.CommunityData("public")
snmp_ip = cmdgen.UdpTransportTarget(('192.168.100.2', 161))
snmp_oids = [".1.3.6.1.4.1.9.2.2.1.1.6.3", [".1.3.6.1.4.1.9.2.2.1.1.8.3"]]
slots = 0
input_rates = []
output_rates = []
while slots <= 50:
    errorIndication, errorStatus, errorIndex, varBinds = cmdGen.getCmd(snmp_community, snmp_ip, *snmp_oids)
    input_rate = str(varBinds[0]).split("=")[1].strip()
    output_rate = str(varBinds[1]).split("=")[1].strip()
    input_rates.append(input_rate)
    output_rates.append(output_rate)
    time.sleep(6)
    slots = slots + 1
    print(slots)

time_range = range(0, slots)
print(input_rates)
print(output_rates)
plt.plot(time_range, input_rates, label="input rate")
plt.plot(time_range, output_rates, label="output rate")
plt.xlabel("time slot")
plt.ylabel("Traffic Measured in bps")
plt.title("Interface gig0/0/2 Traffic")
plt.legend()
plt.show()

在这个例子中赢注意一下几点:

首先,从pysnmp模块中导入cmdgen,用来对路由器创建SNMP GET命令。 同时还导入了Matplotlib模块。然后使用cmdgen定义了Python与路由器之间的传输通道属性和SNMP团体字。

接下老,pysnmp使用前面定义的OID发送SNMP GET请求,并将输出和错误(如果有的话)返回errorIndcation、errorStatus、errorIndex和varBinds。varBinds中保存了输入和输出的流量速率。

接下来,varBinds使用的是<oid> = <value>形式,因此我们只提取到其中的值,将其分别添加到前面创建的列表中,接下来以6s的间隔重复操作100次,手机所有数据。

最后,将手机到的数据传递给Matplotlib导入的plt,同时使用xlabel、ylabel、title和legend自动以图表。

代码输出结果如下图所示:

以上就是Python自动化运维-使用Matplotlib库可视化处理设备返回数据。要想走出平凡,就要先走入孤独。更多关于Python自动化运维-使用Matplotlib库可视化处理设备返回数据请关注haodaima.com其它相关文章!

标签: Python Matplotlib