在阅读了 SNMP 并了解到一些有帮助的问题后,我认为可以理解代理角色作为设备的 SNMP 服务(与 SQL 一样,它是存储的 API)。
当您执行 SQL 查询时,SQL 引擎会完成所有工作并返回结果 - 您不需要了解存储方式和存储位置。
但是 MIB 不是实际存储,那么我的代理的作用是什么?
如果代理仅像我在此过程中所遵循的那样注册 MIB教程,所以它根本不用作处理程序,这意味着有一个 pyhiscal 存储,您可以设置并访问那里而无需绕过处理程序。在本教程中,您只需这样做:
netsnmp_register_int_instance("my example int variable",
my_registration_oid,
OID_LENGTH(my_registration_oid),
&example1, NULL);
无需在处理程序中处理调用。
假设我想监控应用程序的待处理请求队列,因此我需要一个代理,它将为它触发 application_pending_request 的所有 SNMP 请求,并返回队列深度。为什么我需要一个实际的 MIB,而我只需要轮询应用程序队列即可获得结果?
答案1
您对 SNMP 的工作原理存在根本性的误解。快速而粗略的比较:SNMP MIB 类似于主机名。MIB 将 OID 映射到友好名称 - 例如
.1.3.6.1.2.1.1.1.0
=> SNMPv2-MIB::sysDescr.0
=> Host Description
(uname 输出)。
为了从 SNMP 服务器(代理)检索信息,该信息必须在特定 OID 上发布。
为了使 SNMP 守护程序发布信息,它通常需要两件事:
- 获取信息的方式(脚本、程序等)
- 放置该信息的位置(OID)
(某些 SNMP 守护程序可能还需要映射 OID 的 MIB 文件)
为了检索信息,您必须知道 OID - 这可以是数字 OID,也可以是 MIB 文件中的“友好”名称简单网络管理协议 客户。
SNMP“浏览器”通常需要 MIB 文件,因为如果没有该文件,它们所能呈现给您的只是一串毫无意义的数字。
所以你的问题的答案是“你不需要需要MIB 文件,它们只是对需要与 SNMP 交互的人类有帮助”。
以您的示例(报告队列长度)为例,它听起来像您喜欢使用的教程net-snmp
(UCD-SNMP)。
net-snmp
包括用于此类事情的内置功能 - 通读手册页和示例配置文件(特别注意exec
运行外部脚本的指令:通常,您将运行打印队列长度的脚本,并在监控软件/ SNMP 客户端中查询该 OID)