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、温度等数据,适合监控和大规模数据采集,而不是一次性配置下发。

EOS 可编程接口:传输、数据模型与典型用途 自动化客户端 Python / Ansible curl / Postman gRPC 客户端 监控采集器 CI/CD 流水线 EOS 可编程接口 eAPI(JSON-RPC over HTTP/HTTPS) CLI 命令结构化封装 · 返回 JSON · 配置与查询通用 NETCONF(XML over SSH) YANG 模型 · candidate/commit 事务 · 跨厂商标准 RESTCONF(HTTP/JSON + YANG) REST 风格资源 · 读操作便捷 · 工具链通用 gNMI(gRPC) Get / Set / Subscribe · 流式遥测 · 高频采集 EOS 系统 CLI 命令树 running-config YANG 模型库 配置 + 状态 Sysdb / 状态 计数器、温度 Telemetry 引擎 推送订阅数据 选择依据:是否需要事务、是否依赖 YANG 模型、是否要求流式遥测、团队是否熟悉 CLI

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 上,按任务分工使用即可。

实验建议:先用 eAPI 完成一次“查询 + 配置 + 再查询验证”的闭环,确认返回结构后再接入 Ansible 或自研脚本,能显著减少调试时间。