跳转至

核心概念

OLAV NetOps 如何采集、存储和分析你的网络。

功能声明

ID 声明 状态
C-NE-05 每次快照生成唯一 snapshot_id,所有表行共享 ⬜ 待验证
C-NE-06 自定义 TextFSM 模板优先于 NTC 内置模板 🔶 需设备环境
C-NE-07 CommandRegistry.reload() 不重启即加载新模板 ⬜ 待验证

数据流

graph LR
    A[网络设备] -->|SSH + show 命令| B[原始 CLI 输出]
    B -->|TextFSM 解析| C[netops.parsed_outputs]
    C -->|自动视图| D[v_bgp_neighbors_auto<br/>v_ospf_neighbors_auto<br/>v_interfaces_auto<br/>...]
    C -->|拓扑 ETL| E[netops.topology_links]
    D --> F[Agent 查询]
    E --> F

每次采集生成一个快照 — 所有设备状态的时间点捕获。数据库中的每一行都携带 snapshot_id,关联到具体的采集时刻。


快照模型

快照是网络状态的基本单位。运行 /netops_init 或手动采集时,OLAV 执行:

  1. 采集 — SSH 连接 nornir/hosts.yaml 中的每台设备,运行所有白名单 show 命令
  2. 解析 — 使用 TextFSM 模板从原始 CLI 输出提取结构化字段
  3. 存储 — 解析后的 JSON 写入 netops.parsed_outputs,原始文本写入 netops.raw_output_store
  4. 衍生 — 自动生成视图(v_*_auto)和拓扑链接

同一次采集的所有行共享相同的 snapshot_id。这使时间序列比较变得简单:选择两个 snapshot ID 即可 diff 任意表。


TextFSM 模板优先级

解析 CLI 输出时,OLAV 按以下顺序查找匹配模板:

优先级 位置 来源
1(最高) workspace/ops/config/textfsm/ 用户自定义覆盖
2 workspace/ops/config/templates/custom/ /learn_cmd 生成
3 workspace/ops/config/templates/ 内置默认模板
4(最低) ntc-templates Python 包 社区模板

第一个匹配生效。要覆盖内置模板,将同名文件(<platform>_<command>.textfsm)放入优先级 1 或 2。


Agent 层级

graph TD
    User -->|"olav '...'"| Quick[Quick Agent<br/>快速查询,单次迭代]
    User -->|"olav --agent ops '...'"| Ops[Ops Orchestrator]
    User -->|"olav --agent audit '...'"| Audit[Audit Orchestrator]
    Ops --> Analysis[Analysis<br/>路由 + 模拟]
    Ops --> Probe[Probe<br/>实时设备检测]
    Ops --> Diff[Diff<br/>漂移检测]
    Ops --> Lab[Lab<br/>数字孪生]
    Audit --> Designer[Designer<br/>创建 Profile]
    Audit --> Auditor[Auditor<br/>执行 + 报告]
Agent 使用场景 访问设备?
Quick 简单问题、日常查询 是(单设备 CLI)
Ops → Analysis What-if 模拟、路径分析 否(纯计算)
Ops → Probe 批量活性检测、并行 CLI 是(并行)
Ops → Diff 比较两次快照差异 否(DB 查询)
Ops → Lab 部署前在 ContainerLab 验证 仅 CLAB API
Audit 合规检查、健康报告 否(DB 查询)

命令安全

在网络设备上执行的每条 CLI 命令都经过两道门禁:

  1. 白名单 — 仅 commands 表中注册的命令(在 /netops_init 期间填充)被允许
  2. 黑名单blacklisted_commands.yaml 中的正则 pattern 即使在白名单中也会被拒绝

这确保 agent 不能在生产设备上运行任意命令。详见 配置