2. EOS可编程接口概览
在开始写自动化脚本之前,先要弄清楚 EOS 到底提供了哪些可编程入口,以及每个入口适合解决什么问题。EOS 上最常用的四类接口是 eAPI、NETCONF、RESTCONF 和 gNMI。它们并不是互相替代的关系,而是面向不同场景的互补工具:有的偏重“执行命令并拿回结构化结果”,有的偏重“按数据模型读写配置”,有的偏重“高频采集遥测数据”。选错接口,往往会让脚本变得又长又脆。
四类接口的定位差异
eAPI 是 Arista 特有的 JSON-RPC 接口,本质上是把 CLI 命令通过 HTTP/HTTPS 封装成结构化调用。它最大的优势是“CLI 能做的它都能做”,并且返回 JSON,便于程序解析。适合做配置下发、状态查询、批量命令执行,尤其是团队已经熟悉 EOS CLI 的场景。
NETCONF 是基于 XML 的标准协议,通过 SSH 传输,使用 YANG 模型描述配置和状态。它适合需要严格模型约束、配置事务(candidate/commit)和跨厂商一致性的场景。EOS 对 NETCONF 的支持覆盖了主要配置域,但并非所有 CLI 都有对应 YANG 模型。
RESTCONF 可以理解为 NETCONF 的 HTTP/JSON 版本,同样基于 YANG 模型,但用 REST 风格暴露资源。它适合希望用 HTTP 工具链(curl、Postman、Python requests)操作 YANG 数据的场景,读操作尤其方便。
gNMI 是 gRPC 上的网络管理接口,核心能力是 Get、Set 和 Subscribe。它最大的价值在于 Subscribe:可以基于流式遥测持续推送接口计数、CPU、温度等数据,适合监控和大规模数据采集,而不是一次性配置下发。
eAPI 的启用与基本调用实验
eAPI 默认关闭,需要先启用管理接口。以下操作在实验环境中完成,参数为示例值,实际使用时请替换为你的管理地址和凭据。
switch(config)# management api http-commands
switch(config-mgmt-api-http-cmds)# protocol https
switch(config-mgmt-api-http-cmds)# no shutdown
switch(config-mgmt-api-http-cmds)# end
switch# show management api http-commands
执行 show management api http-commands 后,重点看三处:Enabled 是否为 Yes、HTTPS server 是否 running、以及 VRF 和监听端口(默认 443)。如果 Enabled 为 No,说明 no shutdown 没有生效或配置未提交。确认无误后,用 curl 做一次最小调用:
curl -k -u admin:admin123 \
https://10.0.0.11/command-api \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","method":"runCmds","params":{"version":1,"cmds":["show version"],"format":"json"},"id":1}'
返回体中 result 数组的第一个元素就是 show version 的 JSON 结果,其中 modelName、version、systemMacAddress 等字段可直接被程序读取。如果返回 error 对象,常见原因是凭据错误、HTTPS 未启用或管理 VRF 不可达。判断调用成功的依据是:HTTP 状态码 200,且响应中 result 存在、error 不存在。
用 Python 封装一次 eAPI 调用
实际脚本中更常用 requests 库。下面示例先查询接口状态,再下发一条描述配置,体现“读—写”两类操作:
import requests, json
URL = "https://10.0.0.11/command-api"
AUTH = ("admin", "admin123")
HEADERS = {"Content-Type": "application/json"}
def eapi(cmds, fmt="json"):
payload = {
"jsonrpc": "2.0",
"method": "runCmds",
"params": {"version": 1, "cmds": cmds, "format": fmt},
"id": 1
}
r = requests.post(URL, data=json.dumps(payload),
headers=HEADERS, auth=AUTH, verify=False, timeout=10)
r.raise_for_status()
body = r.json()
if "error" in body:
raise RuntimeError(body["error"])
return body["result"]
# 读:查看 Ethernet1 的接口状态
res = eapi(["show interfaces Ethernet1"])
print(res[0]["interfaces"]["Ethernet1"]["lineProtocolStatus"])
# 写:配置接口描述
eapi(["configure", "interface Ethernet1",
"description uplink-to-core", "end"])
注意 configure 模式下多条命令按顺序放在同一个 cmds 数组中,EOS 会依次执行;若中间某条失败,后续命令不会继续,返回的 error 中会带 data 字段指出失败命令。这是 eAPI 做配置下发时非常重要的判断依据。
接口选型的实用判断
如果任务是“把现有 CLI 运维动作自动化”,优先 eAPI;如果要求配置事务、回滚和模型校验,选 NETCONF;如果只想用 HTTP 读 YANG 数据,RESTCONF 更轻;如果要持续采集接口计数或传感器数据,gNMI Subscribe 是唯一合适的选择。四者可以共存于同一台 EOS 上,按任务分工使用即可。