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 之上加一层设备列表循环。
结果判读与常见问题
执行 enable() 后,先看返回列表长度是否与命令数一致,再看 result 中是否包含预期字段。例如 show version 的 modelName、version、serialNumber 都是稳定字段,适合做资产采集。若返回为空或字段缺失,通常是命令拼写错误、权限不足或 eAPI 未启用。
连接失败时按以下顺序排查:设备侧 show management api http-commands 是否显示 running;管理 VRF 是否可达;用户名密码与角色是否正确;HTTPS 证书是否被客户端信任(实验环境可临时关闭校验,生产环境应导入 CA)。pyeapi 的异常信息通常包含 HTTP 状态码或 JSON-RPC 错误码,先读异常再改代码,比反复重试更有效。
掌握单台连接、enable/config 调用和配置文件批量连接之后,pyeapi 就可以作为后续自动化任务的稳定入口:采集资产、下发基线、批量校验,都建立在这条“配置来源 → Node → 调用 → 返回”的链路上。