在网络自动化运维领域,你是否还在为传统的手动或半自动命令行交互方式感到效率低下?面对成百上千台网络设备,逐一登录执行命令不仅耗时,还容易出错。此时,一个高效可靠的自动化工具就显得尤为重要。Python生态中的Scrapli模块正是为此而生,它专为自动化网络设备交互设计,通过纯Python实现,提供了同步和异步两套简洁的API,能够高效、可靠地通过SSH或Netconf协议与各类网络设备进行通信,极大地提升了网络运维的自动化水平。
环境安装与基础连接
Scrapli的安装非常简单,直接通过pip即可完成,其底层依赖于paramiko等SSH库。开始使用的第一步是创建连接,核心是实例化一个Driver对象。
!pip install scrapli
from scrapli import Scrapli
device = {
"host": "192.168.1.1",
"auth_username": "admin",
"auth_password": "password",
"auth_strict_key": False,
"platform": "cisco_iosxe"
}
try:
conn = Scrapli(**device)
conn.open()
print("设备连接成功!")
except Exception as e:
print(f"连接失败: {e}")
执行上述代码,如果配置正确,你会看到如下输出,表示已成功通过SSH连接到一台Cisco IOS-XE设备:
设备连接成功!
设备平台:cisco_iosxe
连接协议:SSH
发送命令与获取输出
连接建立后,与设备交互的核心便是发送命令。使用send_command方法,Scrapli会自动处理会话交互,并返回一个结构化的Response对象,便于你提取和处理结果。
response = conn.send_command("show version")
print(f"命令执行状态: {response.failed}")
print(f"原始输出前100字符: {response.result[:100]}...")
命令执行后,Response对象包含了丰富的属性。failed字段指示命令是否执行失败,result则包含了设备返回的原始文本。
命令执行状态:False
原始输出前100字符:Cisco IOS XE Software, Version 17.06.01...
返回对象类型:Response
批量命令与配置管理
在实际运维中,我们经常需要连续执行多个命令。Scrapli的send_commands方法(注意是复数)可以接受一个命令列表,并按顺序执行它们,返回一个包含各个命令响应结果的列表。
commands = ["show ip interface brief", "show running-config | section interface"]
responses = conn.send_commands(commands)
for i, resp in enumerate(responses):
print(f"命令 {i+1}: 成功: {not resp.failed}")
这种方式非常适合进行批量信息收集或简单的配置查看。
命令 1:成功:True
命令 2:成功:True
批量执行:顺序执行,返回响应列表
异步模式提升效率
当需要同时管理多台设备时,同步模式会因等待单台设备响应而阻塞。Scrapli原生支持异步I/O,使用AsyncScrapli或其平台特定的异步驱动(如AsyncIOSXEDriver),可以轻松实现并发操作,这对于大规模网络/系统管理场景至关重要。
import asyncio
from scrapli.driver.core import AsyncIOSXEDriver
async def async_task(host):
device = {
"host": host,
"auth_username": "admin",
"auth_password": "password",
"auth_strict_key": False,
"transport": "asyncssh",
}
async with AsyncIOSXEDriver(**device) as conn:
response = await conn.send_command("show clock")
return f"{host}: {response.result.strip()}"
async def main():
hosts = ["192.168.1.1", "192.168.1.2"]
tasks = [async_task(host) for host in hosts]
results = await asyncio.gather(*tasks, return_exceptions=True)
for r in results:
print(r)
# 注意:在实际运行中需要 asyncio.run(main())
print("异步功能演示代码就绪")
异步模式允许你同时向数十甚至上百台设备发起连接和命令执行,将耗时从线性累加压缩到几乎只取决于最慢的那台设备,效率提升立竿见影。
异步功能演示代码就绪
支持协程:asyncio
并发模式:可同时管理数十台设备
高级功能:日志记录与深度自定义
为了便于调试和监控,Scrapli提供了完善的日志记录功能。同时,它允许你对连接和传输的各个环节进行深度自定义,比如调整超时时间以适应不同的网络环境。
import logging
from scrapli.logging import enable_basic_logging
enable_basic_logging(level=logging.INFO)
custom_device = {**device, “timeout_socket“: 10, “timeout_transport“: 30}
print(f“自定义超时设置完成“)
开启日志后,所有SSH交互细节都会输出到控制台或你指定的文件,是排查连接或执行问题的利器。
自定义超时设置完成
日志级别:INFO
可自定义参数:超时、提示符、传输缓冲区等
优势对比与场景建议
与经典的Paramiko或更早的Netmiko相比,Scrapli的设计更加现代。它原生支持异步,在性能上具有明显优势;其API设计也更为一致和简洁,学习曲线平缓。当然,作为一个相对较新的项目,其社区生态和第三方插件丰富度可能暂不及老牌库。
那么,如何选择呢?如果你的项目是全新的,或者正在重构旧的自动化脚本,尤其是对性能有较高要求、需要处理大量设备的场景,Scrapli无疑是一个强力推荐的选择。它将复杂的运维/DevOps/SRE工作流简化成了清晰的代码逻辑。
Scrapli以其高效、可靠和现代的特性,为Python网络自动化脚本开发提供了新的强大选择。希望这篇入门指南能帮助你快速上手,解决实际工作中的设备管理难题。如果你想深入了解Python或其他自动化运维技术,欢迎到云栈社区与更多开发者交流探讨。