用于网络工程的最佳 Python 库

2024 年 08 月 29 日 | 阅读 9 分钟

网络工程已变得越来越流行,并且网络工程师可以使用各种工具来自动化网络设置,从而改变了游戏规则。假设我们在这个领域仍然是初学者,那么以下教程将通过向我们展示您应该了解的正确 Python 库来简化我们的工作。

Netmiko 库

这个 Python 库在设计时考虑了网络设备。它提供了 SSHv2 协议的 Paramiko Python 实现之上的抽象层,并将较低级别的功能隐藏在自动化工程师之外。

Netmiko 库的目的

这个库的目的是:

  • 有效地建立与网络设备的 SSH 连接。
  • 简化显示命令的执行、检索和组织。
  • 改进配置命令的执行。
  • 它具有连接网络设备的独特方式。
  • 为与网络设备交互提供统一的 API。
  • 在广泛的网络供应商和平台之间完成上述操作。

支持的平台

  • Netmiko 目前支持大约八十种不同的平台。
  • 有关受支持平台的完整列表,请参阅 PLATFORMS.md 文档。
  • 除了 SSH 支持,Netmiko 还支持安全复制、Telnet 连接和串行连接。
  • 平台支持比 SSH 更受限制。
  • 此外,请参阅 PLATFORMS.md 文档,了解这些用例的平台附加功能。

Netmiko 库的实现

示例:我们正在使用 Netmiko 库建立与远程服务器的连接。

输出

>>> net_connects

>>> net_connect.find_prompt()
'cisco5#'

说明

从 Netmiko 库中导入模块 "ConnectHandler"。您可以将此模块 ConnectHandler 视为 Netmiko 库的第一个入口点。它会为您选择正确的类,根据该类创建一个 Netmiko 对象,并建立与系统的 SSH 连接。

使用 ConnectHandler 选择类并启动 SSH 连接。

这需要我们发送诸如以下参数:

  • 密码
  • 主机(主机名或 IP)
  • 设备类型
  • 用户名

变量 'net_connects' 是与任何类型的远程设备可用的 SSH 连接。

执行显示命令

从我们的设备中检索显示命令输出。这通过使用 'send_command()' 函数完成。

源代码

输出

Protocol  Addresses    Age (minimum)  H/w Addr   Type   Interface
Internet  10.0.2.2         57   5255.0a000.0202  ARPA   GigabitEthernet
Internet  10.0.2.3        116   5255.0a000.0203  ARPA   GigabitEthernet
Internet  10.0.2.15         -   5254.00012.3456  ARPA   GigabitEthernet

说明

Netmiko 库会自动获取输出,剥离回显命令,并剥离路由器尾随提示。它试图只留下显示命令输出。输出显示协议地址,如 Internet 10.0.2.2、Internet 10.0.2.3、Internet 10.0.2.1

我们的完整脚本如下

源代码

输出:上述脚本的执行结果如下

$ Python show_command.py 
Protocol  Address    Age (min)  Hardware Addr   Type   Interface
Internet  10.0.2.2         57   5255.0a000.0202  ARPA   GigabitEthernet
Internet  10.0.2.3        116   5255.0a000.0203  ARPA   GigabitEthernet
Internet  10.0.2.15         -   5254.00012.3456  ARPAGigabitEthernet

进行配置更改

使用 Netmiko 库进行一些配置更改。您可以使用 Netmiko 的 send_config_set() 函数来完成此操作。

说明

首先,我们设置建立 net_connects 对象连接所需的所有参数。然后我们创建配置列表命令,然后将该列表传递给方法 'send_config_set()'。

“cfg_outputs”变量将显示在该 SSH 会话期间发生了什么。Netmiko 将自动执行一些操作,例如进入和退出配置模式。

通过执行 'save_config()' 方法将您的运行配置保存到启动配置。

NAPALM

NAPALM,即支持多供应商的网络自动化和可编程性抽象层,是一个 Python 库,它利用统一的 API 来改进与网络设备的自动化交互。

什么是 NAPALM?

NAPALM(Network Automation and Programmability Abstraction Layer with Multivendor support)是 David Barroso 和 Elisa Jasinska 于 2015 年创建和开发的 Python 库。其目标是统一来自多个网络设备供应商的网络设备访问、数据收集和配置控制。

NAPALM 支持通过多种方法连接到各种设备,以更改配置或获取信息/数据。

库目的

NAPALM 统一的 API 允许使用相同的函数进行数据或控制配置,无论操作系统可能是什么。

维护 NAPALM 的官方团队,也称为“核心开发人员”,多年来一直在改进和开发框架。他们目前支持:

  • Arista EOS
  • 思科 IOS-XR
  • 思科 IOS
  • 瞻博 Junos
  • 思科 NX-OS

NAPALM 是如何工作的?

如果我们想通过 Python 访问具有不同操作系统的各种网络设备,我们可能需要为每个操作系统使用开发的库。在这种情况下使用网络可编程性将是一项艰巨的任务。为了方便编程,NAPALM 添加了一个抽象层。该层允许我们使用相同的功能在不同的操作系统上执行相同的操作。

它是如何做到的?

NAPALM 通过统一我们访问网络系统的方式来隐藏这个抽象层。

这得益于网络驱动概念的引入。每次我们需要与网络设备交互时,我们都需要指定我们将要与之对话的操作系统,NAPALM 将选择正确的网络驱动。选择一个包含与该操作系统相关的所有功能的库。

如果从另一个角度来看,它基本上就像在其他 API 之上拥有一个 API。

NAPALM 安装

安装 NAPALM 的要求如下

  • PVM- Python 虚拟环境
  • Linux 操作系统或 Windows 10 的 Ubuntu 控制台。
  • 必须安装 Python 3
  • Python 库包管理器 - PIP

现在使用以下命令继续安装 NAPALM

功能测试

说明

首先,我们设置建立 ios_router 对象连接所需的所有参数。调用对象“ios_router”,它调用 open() 方法以启动与路由器的连接。

为了验证连接,使用了 is_alive() 方法;正如我们在输出中看到的,它是 True。因此,已连接到路由器。

运行时输出

Connecting to IOS Router. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Checking ios router connection status:
{ 'is_alive': True }
Testing completed ! ! !

精灵

这是一个为测试自动化网络而制作的 Python 模块。它易于使用,并为工程师提供了对给定网络大量数据的快速分析。

Genie 是一个 Python 库,它包含了网络测试自动化所需的所有方法。Genie 是 pyATS 的库解决方案。Genie 的主要目标是促进快速开发、支持可重用库以及简化测试自动化编写。

库目的

Genie 以面向对象的方式利用了 Python 的所有优势

  1. 使专家能够开发库和内容,以处理不同的操作系统/平台/功能/发布和管理接口,而无需每次都开发新的内容/库;
  2. 通过允许工程师与不同团队分享他们的工作,实现团队驱动的改进并提高效率;以及
  3. 鼓励团队在其自动化中重用现有库。

Genie 战略性地利用反射令牌和查询算法来实现这些新的创新结果。

Genie 库是开源的,托管在

  • genie.libs.(conf/operations)
  • genie.libs.parser
  • genie.libs.telemetry

Genie 背后的动机

  • 深入但又如何处理这些库:
    1. 解析网络设备
    2. 配置网络设备
    3. 对网络设备进行操作
    4. 将测试用例重新组合成可共享、可重用的测试用例
  • pyATS 为您提供了编写自动化和规则的所有工具,例如编写未来验证的脚本很难
  • 无需重复造轮子。拥有一个包含所有功能的库。
  • Genie 解决了标题问题并创建了包、库,并展示了如何编写和共享它们!

设计限制是从事自动化开发的工程师反复出现的问题。例如,带有嵌入式静态配置或特定 TGN 接口的脚本很难开发,并且几乎不可能在它们最初预期的操作系统、平台、版本或分支以外的任何其他系统上使用。

这些结构限制也阻碍了团队之间的协作,因为它们阻止了他们相互分享库。

工程师通常会投入大量资金重新开发现有库以克服这些构建限制。这种传统方法通常依赖于过时的命名空间、功能和争用驱动的编码技术。

Genie 具有四个基本功能

  • 以 OS 执行不可知的方式配置网络设备
  • 以 OS 执行不可知的方式恢复网络设备活动状态
  • 可重用的库池,其中包括测试用例。
  • 测试工具,将所有功能集成在一起。

库 - ncclient

Python 库 "ncclient" 旨在轻松开发 NETCONF 脚本和自动化。

要求

  • Python 3.4+ 或 Python 2.7
  • lxml 3.3.0+
  • Paramiko 1.7
  • libxml2
  • setuptools 0.6
  • libxslt

如果您使用的是 Debian/Ubuntu,请安装以下库(通过 aptitude 或 apt-get)

  • libxslt1-dev
  • libxml2-dev

Python 库 "ncclient" 的安装

或通过 pip 命令

Python 库 "ncclient" 的示例

Python 库 "ncclient" 支持的设备处理程序

实例化与已知类型 NETCONF 服务器的连接时

  • Juniper:device_params_ = {'name_':'junos'}
  • 惠普 Comware:device_params_ = {'name_':'hpcomware'}
  • 思科 (Cisco)
    • CSR:device_params_ = {'name_':'csr'}
    • Nexus:device_params_ = {'name_':'nexus'}
    • IOS XR:device_params_ = {'name_':'iosxr'}
    • IOS XE:device_params_ = {'name_':'iosxe'}
  • 诺基亚 SR OS:device_params_ = {'name_':'sros'}
  • 华为
    • device_params_ = {'name_':'huawei'}
    • device_params_ = {'name_':'huaweiyang'}
  • H3C:device_params_ = {'name_':'h3c'}
  • 服务器或以上未提及的任何内容:device_params_ = {'name_':'default'}

ncclient 库的关键功能

  • 支持 RFC 4741 中定义的所有任务和功能。
  • 请求管道。
  • 非并发 RPC 请求简化了显示命令的执行、检索和组织
  • 除非确实需要,否则将 XML 保持在视线之外。
  • 可扩展。可以轻松添加新的传输映射和功能/操作。

请求库

Requests 库是 Python 中向指定 URL 发出 HTTP 请求的关键部分之一。当向 URI 发出请求时,它会返回响应。Python Requests 提供了管理响应和请求的内置功能。无论是网络抓取还是 REST API,都必须学习 Requests 才能继续进行这些操作。

为什么要学习 Python Requests 模块?

  • Requests 是一个 Apache2 许可的 HTTP 库,它允许使用 Python 发送 HTTP/1.1 响应。
  • 要与互联网进行交互,Python Requests 是必不可少的。无论是下载整个 Facebook 页面、调用 API,还是更多互联网相关的事情,都必须向 URL 发出请求。
  • Requests 在处理 REST API 和网络抓取方面扮演着重要角色。
  • 查看一个使用 Requests 和 Web 抓取的 Python 脚本示例 - 使用 BeautifulSoup 在 Python 中实现 Web 抓取

通过利用 GET 参数实现 Requests 库

我们使用 GET 方法通过 URL 以键值对配置将数据传递到 Web 服务器。

源代码

输出:运行上面的代码。

Response Content:
 {
  "arg" : {
    "course" : [
      "Python",
      "SQL"
    ],
    "websites": "dataquest.io"
  },
  "header": {
    "Accept" : " */* ",
    "Accept--Encoding": "gzip, deflate",
    "Hosts": "httpbin.org",
    "User-Agents": "python-requests/2.27.1",
    "X-Amzn-Trace-Ids": "Root=1-61e7e066-5d0cacfb49c3c1c3465bbfb2"
  },
  "origin": "121.122.65.155",
  "url": "http://httpbin.org/get?website=dataquest.io&courses=Python&course=SQL"
}

说明

GET 方法允许我们使用 params 参数传递键值对的字典。我们来试试看。响应内容采用 JSON 格式,我们通过 param 参数传递的键值对出现在响应的 arguments 部分。

响应内容的头部包含主机名、用户代理、编码类型等。

同样,url 部分 http://httpbin.org/get?website=dataquest.io&courses=Python&course=SQL 包含编码后的 URL 以及传递给服务器的参数。