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 与网络开销。

pyeapi 连接、节点与批量执行关系图 Python 运维脚本 设备清单 / 并发控制 异常捕获 / 结果聚合 ThreadPoolExecutor pyeapi Node 对象 connect() / connect_to() enable() / config() 会话复用 / 超时控制 EOS eAPI HTTPS / JSON-RPC show / config 命令 VLAN / 接口 / 路由 典型执行路径与关键控制点 1. 建立连接 connect_to(device) timeout / transport 2. 执行命令 enable(show...) config() 配置模式 3. 结果解析 result[0]['result'] 结构化字典 4. 异常处理 ConnectionError CommandError 5. 聚合 按设备 汇总输出 性能优化要点 • 批量 show 命令一次请求返回,减少 HTTP 往返 • 配置下发合并为一次 config() 会话,避免频繁进出配置模式 • 并发上限建议 8~16,配合 timeout 与重试,避免设备过载
实践建议:把设备清单、连接参数、并发度、超时时间统一放在配置文件中,脚本只负责逻辑。这样在实验环境与生产环境之间切换时,只需替换配置,不必修改代码。
注意:pyeapi 的 config() 默认是合并配置,不会自动删除已有配置。执行删除操作时,应使用 no 前缀或对应的删除方法,并在变更前保存 running-config 备份,避免误删关键配置。