我们有一个软件套件,可以从其模块(服务)中收集健康信息。 我们在内部处理此健康信息,但我们也想使用SNMP来让外界知道模块的状态。 我们希望使用一个MIB文件在一个集中式服务中使用SNMP,而不是使用MIB文件并在每个模块中实现SNMP。 这有其优点,但是由于每个模块都可能包含其对等模块的完整副本,因此随附的MIB文件越来越大。 看起来像这样,这只是一个非常简单的示例。
问题是: 有没有一种方法可以在mib树中构造子节,以使MIB文件更易于维护? 为具有所有子对象的模块创建一种模板,然后仅通过该模板创建对象,将是非常不错的。
这有可能吗?
下面是此示例mib树的MIB文件:
MYCOMP-MYAPP-MIB DEFINITIONS ::= BEGIN
IMPORTS
MODULE-IDENTITY, OBJECT-TYPE, NOTIFICATION-TYPE, enterprises
FROM SNMPv2-SMI
TEXTUAL-CONVENTION
FROM SNMPv2-TC;
mycomp OBJECT IDENTIFIER ::= {enterprises 12345}
myapp MODULE-IDENTITY
LAST-UPDATED "201810220000Z"
ORGANIZATION "MyCompany"
CONTACT-INFO ""
DESCRIPTION ""
::= { mycomp 40 }
systemInfoGroup OBJECT IDENTIFIER ::= {myapp 2}
ErrorStatus ::= TEXTUAL-CONVENTION
STATUS current
DESCRIPTION
"Status"
SYNTAX INTEGER {
normal(0),
error(1),
}
sysManagerGroup OBJECT IDENTIFIER
::= {systemInfoGroup 1}
sysManagerModule1 OBJECT IDENTIFIER
::= {sysManagerGroup 1}
sysManagerModule1Version OBJECT-TYPE
SYNTAX OCTET STRING (SIZE (1..100))
ACCESS read-only
STATUS current
DESCRIPTION
"Contains the version string of the software module."
::= { sysManagerModule1 1 }
sysManagerModule1Uptime OBJECT-TYPE
SYNTAX OCTET STRING (SIZE (1..100))
ACCESS read-only
STATUS current
DESCRIPTION
"Up time."
::= { sysManagerModule1 2 }
sysManagerModule1ErrorA OBJECT-TYPE
SYNTAX ErrorStatus
ACCESS read-only
STATUS current
::= { sysManagerModule1 4 }
sysManagerModule1ErrorB OBJECT-TYPE
SYNTAX ErrorStatus
ACCESS read-only
STATUS current
::= { sysManagerModule1 5 }
sysManagerModule1ErrorC OBJECT-TYPE
SYNTAX ErrorStatus
ACCESS read-only
STATUS current
::= { sysManagerModule1 6 }
sysManagerModule2 OBJECT IDENTIFIER
::= {sysManagerGroup 2}
sysManagerModule2Version OBJECT-TYPE
SYNTAX OCTET STRING (SIZE (1..100))
ACCESS read-only
STATUS current
DESCRIPTION
"Contains the version string of the software module."
::= { sysManagerModule2 1 }
sysManagerModule2Uptime OBJECT-TYPE
SYNTAX OCTET STRING (SIZE (1..100))
ACCESS read-only
STATUS current
DESCRIPTION
"Up time."
::= { sysManagerModule2 2 }
sysManagerModule2ErrorA OBJECT-TYPE
SYNTAX ErrorStatus
ACCESS read-only
STATUS current
::= { sysManagerModule2 4 }
sysManagerModule2ErrorB OBJECT-TYPE
SYNTAX ErrorStatus
ACCESS read-only
STATUS current
::= { sysManagerModule2 5 }
sysManagerModule2ErrorC OBJECT-TYPE
SYNTAX ErrorStatus
ACCESS read-only
STATUS current
::= { sysManagerModule2 6 }
END
答案 0 :(得分:1)
我没有完全理解您的用例(我并没有完全理解“每个模块可能都包含其对等模块的完整副本”部分,特别是因为您的模块本身实际上“没有” (如果您将信息集中在一处),但这似乎是表的绝佳机会。这类似于C语言中的一系列结构。
有一百万次表,而不是重复一遍(在MIB和实际逻辑树中)版本,正常运行时间,ErrorA,ErrorB和ErrorC,您将拥有一个包含五列的表它具有所需的任意多行。每列的语法/形式只需要指定一次。
您需要为每一行的“索引”增加一列(首先输入),即模块编号。
我的SMI生锈,但是定义看起来像这样:
sysManagerGroup OBJECT IDENTIFIER
::= { systemInfoGroup 1 }
sysManagerModuleTable OBJECT-TYPE
SYNTAX SEQUENCE OF SysManagerModuleEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION "Table of modules being monitored"
::= { sysManagerGroup 1 }
sysManagerModuleEntry OBJECT-TYPE
SYNTAX SysManagerModuleEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION "A row in the table of modules being monitored"
INDEX { sysManagerModuleId }
::= { sysManagerModuleTable 1 }
SysManagerModuleEntry ::= { SEQUENCE
sysManagerModuleId Integer32,
sysManagerModuleVersion OCTET STRING,
sysManagerModuleUptime OCTET STRING,
sysManagerModuleErrorA ErrorStatus,
sysManagerModuleErrorB ErrorStatus,
sysManagerModuleErrorC ErrorStatus,
}
sysManagerModuleId OBJECT-TYPE
SYNTAX Integer32,
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION "Numeric ID of the module"
::= { sysManagerModuleEntry 1 }
sysManagerModuleVersion OBJECT-TYPE
SYNTAX OCTET STRING (SIZE (1..100))
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Contains the version string of the software module."
::= { sysManagerModuleEntry 2 }
sysManagerModuleUptime OBJECT-TYPE
SYNTAX OCTET STRING (SIZE (1..100))
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Up time."
::= { sysManagerModuleEntry 3 }
sysManagerModuleErrorA OBJECT-TYPE
SYNTAX ErrorStatus
MAX-ACCESS read-only
STATUS current
::= { sysManagerModuleEntry 4 }
sysManagerModuleErrorB OBJECT-TYPE
SYNTAX ErrorStatus
MAX-ACCESS read-only
STATUS current
::= { sysManagerModuleEntry 5 }
sysManagerModuleErrorC OBJECT-TYPE
SYNTAX ErrorStatus
MAX-ACCESS read-only
STATUS current
::= { sysManagerModuleEntry 6 }
就是这样-不需要重复的定义。在运行时,根据需要/想要添加任意多的行。
可以直接访问以下个人条目:
4.1.12345.40.2.1.1.1.<ID>.<FIELD>
例如模块2的ErrorB是
4.1.12345.40.2.1.1.1.2.5
并且模块48,570的正常运行时间为
4.1.12345.40.2.1.1.1.48570.3
当然,您的远程Manager不会提前知道行数,但是没关系:Manager将使用“ walk”或变体- GetNext 或的某种组合GetBulk 请求-发现表的内容。
将这些SMIv2定义插入您的MIB中,并将MIB馈入SNMP Manager,您将看到它如何改善布局。实际填充表格的方式取决于您的Agent软件。
请注意,“表”和“条目”对象实际上是一种伪对象,因此必须具有not-accessible
访问级别;该条目的索引是真实值,但应为not-accessible
,因为它的值在逻辑上是每个条目的OID的一部分,而不是可以轮询的独特对象。
顺便说一句,企业号12345已assigned属于 VWB Group ;除非您是他们,否则您将需要get your own。