4. pyeapi库深度使用
pyeapi 是 Arista 官方维护的 Python 客户端库,它把 EOS 的 eAPI(基于 HTTP/HTTPS 的 JSON-RPC 接口)封装成接近 CLI 语法的 Python 对象模型。相比直接拼接 JSON-RPC 请求,pyeapi 让运维脚本更接近“用 Python 敲 EOS 命令”的体验。本节围绕连接管理、节点对象、配置模式、命令执行、批量节点操作、异常处理与性能优化展开,重点讲清楚实际脚本中如何组织这些能力。
连接管理与节点对象
pyeapi 的核心是 Node 对象。创建节点有两种典型方式:一是通过 connect() 直接传入主机、用户名、密码、传输方式;二是通过 connect_to 读取本地配置文件。生产脚本更推荐后者,把连接信息与代码分离。
import pyeapi
# 方式一:显式连接
node = pyeapi.connect(
transport='https',
host='leaf-01.lab',
username='admin',
password='secret',
port=443,
timeout=30
)
# 方式二:读取 ~/.eapi.conf 中的连接配置
node = pyeapi.connect_to('leaf-01')
对应的 ~/.eapi.conf 示例:
[connection:leaf-01]
host: 10.0.1.11
username: admin
password: secret
transport: https
port: 443
[connection:leaf-02]
host: 10.0.1.12
username: admin
password: secret
transport: https
port: 443
连接建立后,node 对象持有会话、认证信息和目标设备标识。需要注意:pyeapi 默认使用 HTTPS,若实验环境使用 HTTP,应显式指定 transport='http',并确认 EOS 已开启 management api http-commands。连接超时、证书校验、端口占用是连接阶段最常见的三类问题,建议在脚本入口统一设置 timeout,并对自签名证书环境明确处理验证策略。
命令执行:enable 模式与配置模式
pyeapi 把命令执行分为两类:show 类命令和配置类命令。show 命令通过 node.enable() 执行,返回结构化字典;配置命令通过 node.config() 进入配置模式后下发。
# 执行 show 命令,返回结构化结果
result = node.enable('show version')
print(result[0]['result']['modelName'])
print(result[0]['result']['version'])
# 批量 show 命令,一次请求返回多个结果
results = node.enable(
'show hostname',
'show ip interface brief',
'show vlan'
)
for r in results:
print(r['command'], r['result'])
配置模式使用上下文管理器,确保进入和退出配置会话:
with node.config() as config:
config.vlan(100)
config.vlan(100).name('APP')
config.interface('Ethernet1')
config.interface('Ethernet1').switchport_mode('access')
config.interface('Ethernet1').switchport_access_vlan(100)
这里的关键点是:config.vlan(100) 返回的是配置节点对象,可以链式调用 .name()、.switchport_mode() 等方法。pyeapi 会把这些方法翻译成 EOS 配置命令。若需要下发原生命令,可用 config.node('...') 或直接传入命令字符串。配置模式默认是“合并”语义,不会自动删除已有配置;需要删除时应使用 no 前缀或对应的删除方法。
批量节点操作
大规模运维中,单节点循环效率低,pyeapi 提供了 Node 集合与多节点连接能力。常见做法是维护一个节点清单,逐个建立连接并执行命令,同时控制并发度。
import pyeapi
from concurrent.futures import ThreadPoolExecutor
devices = ['leaf-01', 'leaf-02', 'leaf-03', 'spine-01']
def run_show(device):
node = pyeapi.connect_to(device)
return device, node.enable('show hostname')
with ThreadPoolExecutor(max_workers=8) as pool:
for device, result in pool.map(run_show, devices):
print(device, result[0]['result']['hostname'])
批量操作要关注三点:一是连接复用,同一节点多次执行命令应复用 Node 对象,避免反复认证;二是并发上限,EOS eAPI 对并发会话有限制,建议从 8~16 开始压测;三是结果聚合,把每个节点的返回统一成 {device: result} 结构,便于后续比对和告警。
异常处理与性能优化
pyeapi 的异常主要分为连接异常、认证异常、命令执行异常和超时异常。建议在脚本中统一捕获并区分处理:
import pyeapi
from pyeapi.eapilib import ConnectionError, CommandError
try:
node = pyeapi.connect_to('leaf-01')
node.enable('show version')
except ConnectionError as e:
print('连接失败:', e)
except CommandError as e:
print('命令执行失败:', e)
except Exception as e:
print('其他异常:', e)
性能优化方面,优先使用 node.enable() 一次传入多条 show 命令,减少 HTTP 往返;配置下发尽量合并为一次 config() 会话,避免频繁进出配置模式;对大批量设备,使用线程池或异步框架控制并发,并设置合理的 timeout 与重试次数。对于只读采集场景,可开启 eAPI 的 show 命令缓存或使用 node.enable 的批量模式,显著降低设备 CPU 与网络开销。
config() 默认是合并配置,不会自动删除已有配置。执行删除操作时,应使用 no 前缀或对应的删除方法,并在变更前保存 running-config 备份,避免误删关键配置。