🥑Python网络设备连接和配置工具网络安全之一

Python | 网络设备 | SSH | Paramiko | Jinja2 | Netmiko | NETCONF | ncclient | pyATS | 配置模板 | 模型驱动可编程 | Ansible 模块

🏈page指点迷津 | Brief

要点

  1. 使用SSH 的纯Python包Paramiko 访问单台设备和多台设备

  2. 使用Jinja2 IP地址管理

  3. 使用多供应商 SSH Python 库netmiko提升管理权限和公私密钥

  4. 使用网络配置协议工具Netconf和ncclient 网络设备链接管理,提取,修改配置以及响应事件

  5. NAPALM自动化复杂多供应商网络管理:不同设备连接,向设备发出命令,测试,网络备份,设备配置,收集设备信息,使用 Jinja2 和 NAPALM 创建并应用配置模板,回滚配置,验证部署

  6. pyATS自动化网络测试:重新审视测试的概念,创建测试床文件,连接和发出命令,检索设备的当前状态

  7. Genie库框架:创建便携式配置脚本,比较设备的当前状态

  8. requests:重新审视 HTTP 请求响应模型,发出 HTTP 请求,检索所有接口,创建虚拟局域网 (VLAN) 更新/删除 VLAN

当您的Python程序需要运行外部依赖密码的程序,或访问远程服务器时,请使用Paramiko。 Paramiko 是一个实现 SSHv2 协议的 Python 模块。 Paramiko 不是 Python 标准库的一部分,尽管它被广泛使用。 本指南向您展示如何在 Python 脚本中使用 Paramiko 通过密码和 SSH 密钥对服务器进行身份验证。

SSH密码连接服务器

他的部分向您展示了如何使用用户名和密码向远程服务器进行身份验证。 首先,创建一个名为first_experiment.py 的新文件并添加示例文件的内容。

password_login.py

import paramiko

command = "df"

host = "YOUR_IP_ADDRESS"
username = "YOUR_LIMITED_USER_ACCOUNT"
password = "YOUR_PASSWORD"

client = paramiko.client.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(host, username=username, password=password)
_stdin, _stdout,_stderr = client.exec_command("df")
print(_stdout.read().decode())
client.close()

该文件使用您提供的 IP 地址和凭据通过 SSH 连接到远程服务器。然后,它使用 df 命令生成服务器可用磁盘空间的报告。

使用以下命令执行该文件:

python password_login.py

您会看到类似的输出:

Filesystem       1K-blocks  Used Available Use% Mounted on
devtmpfs           1921544     0   1921544   0% /dev
tmpfs              1936296     0   1936296   0% /dev/shm
tmpfs              1936296   211308   1724988  11% /run
tmpfs              1936296     0   1936296   0% /sys/fs/cgroup
/dev/mapper/cl-root  46110724 20501872  25608852  45% /
/dev/sda1           999320   187324 743184  21% /boot

上面的文件提供了一个高级示例,您可以使用该示例将 Paramiko 合并到您的 Python 代码中。 虽然 Paramiko 所做的一切也可以使用 shell 命令完成,但 Paramiko 为您提供了 Python 的所有功能。 Python 使您能够访问结构化数据、循环、解析和其他超出 shell 脚本可用的强大功能。 例如,如果您正在编写一个程序来计算系统使用百分比,Python 更擅长从系统输出中提取和计算值。

SSH密钥连接服务器

Paramiko 的具体优势之一是正确处理 SSH 添加密钥。 上面的介绍性示例取决于您的受限用户帐户密码的使用。 然而,使用 SSH 密钥进行服务器身份验证更安全。 下面的示例文件提供了一个报告,该报告会提醒您未包含在预期用户列表中的用户进行的任何登录。 Python 脚本依赖 Paramiko(请注意 key_based_connect() 函数)使用 SSHv2 身份验证连接到代码的 server_list 列表中提供的任何服务器。

key_based_login.py

import paramiko

def examine_last(server, connection):
     command = "sudo last"
     expected = ["user1", "reboot", "root", "sys-admin"]
 _stdin, stdout, _stderr = connection.exec_command("sudo last")
 lines = stdout.read().decode()
 connection.close()
 for line in lines.split("\n"):
           # Ignore the last line of the last report.
         if line.startswith("wtmp begins"):
             break
         parts = line.split()
         if parts:
             account = parts[0]
             if not account in EXPECTED:
                 print(f"Entry '{line}' is a surprise on {server}.")

def key_based_connect(server):
     host = "192.0.2.0"
     special_account = "user1"
 pkey = paramiko.RSAKey.from_private_key_file("./id_rsa")
 client = paramiko.SSHClient()
     policy = paramiko.AutoAddPolicy()
          client.set_missing_host_key_policy(policy)
 client.connect(host, username=special_account, pkey=pkey)
 return client

def main():
     server_list = ["worker1", "worker2", "worker3"]
 for server in server_list:
         connection = key_based_connect(server)
         examine_last(server, connection)

main()

使用以下命令执行该文件:

如果 Python 脚本预期列表之外的用户访问您的其中一台服务器,Python 脚本将返回以下内容:

Entry user4   pts/0     192.0.2.0  Wed Sep 23 15:13 - 17:28  (02:14)' is a surprise on 192.0.2.0.

Paramiko SSH 连接到网络设备

使用 Python 和 paramiko 包建立到网络设备的 SSH 连接。 然后,我们将使用这个已建立的连接来发出简单的命令并从设备读回基本输出。

Jinja2 构建配置模板

使用 Python 和 jinja2(一种广泛使用的模板语言)填充 Python 脚本提供的数据。 使用 jinja2 模板中的循环、控制结构和继承,我们将构建高度可定制的配置模板

Netmiko 配置网络设备

构建在 paramiko 之上的 netmiko。 netmiko 包提供了与多个供应商的网络设备的 SSH 交互的抽象。 使用 netmiko,我们将与网络设备交互以检索状态信息并应用配置更改。

NETCONF 和 ncclient 的模型驱动可编程

使用模块指定网络基础设施的所需状态,然后将其应用于设备。 我们将使用 ncclient 包根据 YANG 模型更改网络设备。

NAPALM 自动化复杂的多供应商网络

着眼于 NAPALM,它允许开发人员使用统一的接口自动化复杂的多供应商网络

pyATS 和 Genie 自动化网络测试和部署

使用 pyATS 和 Genie 对各种设备进行从简单的连接测试到高级状态测试。

使用 RESTCONF 和请求配置设备

探索请求包以将不同的 RESTCONF JSON 负载发送到网络设备。

通过请求使用控制器和高级网络 API

使用 requests 包查询 REST API,以从多个网络设备检索信息并对多个网络设备应用更改。

自定义 Ansible 模块将 Python 脚本合并到现有工作流

自己编写这样的模块。 这将允许您从 Ansible 调用之前编写的 Python 脚本。

Last updated