4. pyeapi库开发入门

pyeapi 是 Arista 官方维护的 Python 客户端库,它把 EOS 的 eAPI(基于 HTTP/HTTPS 的 JSON-RPC 接口)封装成 Python 对象,让开发者不必手工拼接 JSON-RPC 报文,也不必依赖 SSH 屏幕抓取。理解 pyeapi 的关键,是先理解它下面的 eAPI:EOS 设备上必须启用 management api http-commands,并配置好传输方式(HTTP 或 HTTPS)、监听端口、认证方式与访问控制。pyeapi 只是这层之上的“语法糖”和连接管理器。

安装与依赖

pyeapi 通过 pip 安装,通常放在虚拟环境中,避免与系统 Python 包冲突:

python3 -m venv venv
source venv/bin/activate
pip install pyeapi
pip show pyeapi

安装完成后,import pyeapi 能成功即表示库可用。pyeapi 本身不包含 EOS 设备,它需要设备侧 eAPI 已开启。以一台实验设备为例,在 EOS 上执行:

management api http-commands
   protocol https
   no shutdown
   vrf MGMT
!
username admin privilege 15 role network-admin secret 0 Admin@123
!
management api http-commands
   vrf MGMT
   no shutdown

这里把 eAPI 绑定到管理 VRF MGMT,使用 HTTPS,认证用户为 admin。实际环境中应使用强密码、限制源地址(可用 ACL 或 ip access-group),并优先使用 HTTPS 而非 HTTP。

连接单台设备

pyeapi 提供两种连接方式:pyeapi.connect() 返回一个 Node 对象,以及 pyeapi.connect_to() 按名称读取配置文件。最直接的方式是显式传参:

import pyeapi

node = pyeapi.connect(
    transport='https',
    host='192.0.2.11',
    username='admin',
    password='Admin@123',
    port=443,
)

result = node.enable('show version')
print(result[0]['result']['modelName'])
print(result[0]['result']['version'])

enable() 用于执行 show 类命令,返回一个列表,每个元素对应一条命令的结果,结构为 {'command': ..., 'result': ...}。注意 result 内部才是真正的 JSON 数据,字段名与 EOS 的 JSON 输出一致。若命令不存在或权限不足,pyeapi 会抛出异常,因此生产代码应使用 try/except 包裹。

执行配置使用 config(),它接受一个配置行列表,按顺序下发:

node.config([
    'interface Ethernet1',
    'description uplink-to-core',
    'no shutdown',
])

配置类命令默认不返回详细结果,只表示下发成功;若某行语法错误,EOS 会返回错误,pyeapi 抛出异常。因此批量配置时建议按“接口/协议”分组,每组单独调用,便于定位失败点。

连接多台设备与批量操作

当设备数量增多时,逐台写连接参数不可维护。pyeapi 支持从配置文件读取节点信息,默认路径为 ~/.eapi.conf,也可通过环境变量 PYEAPI_CONF 指定。配置格式为 INI:

[connection:leaf1]
host: 192.0.2.11
username: admin
password: Admin@123
transport: https
port: 443

[connection:leaf2]
host: 192.0.2.12
username: admin
password: Admin@123
transport: https
port: 443

随后可用 connect_to() 按名称连接,并用循环实现批量操作:

import pyeapi

devices = ['leaf1', 'leaf2']
for name in devices:
    node = pyeapi.connect_to(name)
    ver = node.enable('show version')[0]['result']
    print(name, ver['modelName'], ver['version'])

批量配置时,建议先收集每台设备的当前状态,再统一下发,最后回读校验。例如批量修改 SNMP 位置信息:

for name in devices:
    node = pyeapi.connect_to(name)
    node.config(['snmp-server location DC1-Rack-A'])
    loc = node.enable('show snmp location')[0]['result']
    print(name, loc)

这里的关键不是“循环”本身,而是每台设备独立建立会话、独立返回结果。若某台设备不可达,循环会中断,因此更稳健的写法是逐台 try/except,记录成功与失败清单,而不是让一台失败拖垮整批。

连接、执行与批量操作的关系

下图把 pyeapi 的工作链路画成一条从“配置来源”到“设备返回”的信号链:左侧是连接参数的两种来源(显式传参与 eapi.conf),中间是 Node 对象,右侧是 enable/config 两类调用及其返回结构。批量操作则是在 Node 之上加一层设备列表循环。

pyeapi 连接与批量操作链路 连接参数来源 显式传参 connect() host / username password / transport 配置文件来源 ~/.eapi.conf [connection:leaf1] connect_to('leaf1') Node 对象 eAPI 会话 HTTPS / JSON-RPC 认证与 VRF 绑定 enable() / config() enable('show version') 返回 list[dict] result[0]['result']['version'] 只读,不改变设备状态 config([...]) 按行下发配置 语法错误抛异常 需回读校验 批量操作:在 Node 之上加设备列表循环 for name in ['leaf1','leaf2']: node = pyeapi.connect_to(name) 逐台 try/except,记录成功/失败清单,避免单点失败中断整批

结果判读与常见问题

执行 enable() 后,先看返回列表长度是否与命令数一致,再看 result 中是否包含预期字段。例如 show version 的 modelName、version、serialNumber 都是稳定字段,适合做资产采集。若返回为空或字段缺失,通常是命令拼写错误、权限不足或 eAPI 未启用。

连接失败时按以下顺序排查:设备侧 show management api http-commands 是否显示 running;管理 VRF 是否可达;用户名密码与角色是否正确;HTTPS 证书是否被客户端信任(实验环境可临时关闭校验,生产环境应导入 CA)。pyeapi 的异常信息通常包含 HTTP 状态码或 JSON-RPC 错误码,先读异常再改代码,比反复重试更有效。

建议把设备清单、连接参数和批量任务拆成三层:配置文件只放连接信息,脚本只放任务逻辑,日志记录每台设备的命令、返回摘要与耗时。这样在设备数量从 2 台扩展到 20 台时,代码结构不需要重写。

掌握单台连接、enable/config 调用和配置文件批量连接之后,pyeapi 就可以作为后续自动化任务的稳定入口:采集资产、下发基线、批量校验,都建立在这条“配置来源 → Node → 调用 → 返回”的链路上。