机队状态监控:语义与陷阱
后台的"设备在线状态"看着简单,实际有两类坑会让人误判: 身份错(一台机器两个名字)与静默兜底(解析失败被当成永远离线)。
状态灯的语义
控制台的颜色由"最近一次上报时间 + 运行状态"决定:
| 颜色 | 条件 | 含义 |
|---|---|---|
| 🟢 绿 | 阈值内有上报 且 state == ready |
在线且就绪 |
| 🟡 黄 | 阈值内有上报,但状态不是 ready | 在线但非就绪(如 shutdown) |
| 🔴 红 | 超过阈值没有上报 | 离线 |
所以黄色不等于故障,绿色也不等于能打印 —— 要结合 print_stats.state 判断。
坑一:身份错(一台机器两个名字)
现象:云端只看到一台设备在报,另一台永远红灯。
实际原因:设备端的主机名/标签还是占位符(PRINT_NAME 这类未展开的模板值),
于是一台真机以两个身份出现在后台:
- 身份 A:占位符 → 一直在报(其实是同一台机器)
- 身份 B:
kali-<hash>的历史身份 → 早已不存在 → 永远红灯
判断方法:把身份与实际网络地址对起来查(ARP / ping / SSH),而不是只看后台标签。
根治:金镜像 firstboot 必须生成 kali-* 主机名,并确保 agent 侧 label 模板被正确展开。
坑二:静默兜底(最危险的一类)
try:
secs = parse(report_time)
except Exception:
secs = 10**6 # ← 解析失败 = 判为"永远离线"
这种写法的问题:任何字段改名 / 时间戳格式变化,都会让全场设备一起变红, 而且从界面上完全看不出原因是"解析失败"。
正解:解析失败要显式区分成"时间未知",而不是折算成一个巨大的离线秒数。
排查清单
- 比较上报条数与上报时间:真在线设备的最后一条应该很近
- 查 agent 版本:老版本可能上报字段不完整
- 把身份与实际 IP 对应起来,确认有没有幽灵身份
- 看
state字段是不是ready(黄色多半是这个)
相关
- KaliOS 机队管理平台 —— 平台架构与 OTA 机制