如何为SNMP-MIB文件中的节创建某种模板

时间:2018-10-23 12:27:20

标签: snmp mib

我们有一个软件套件,可以从其模块(服务)中收集健康信息。 我们在内部处理此健康信息,但我们也想使用SNMP来让外界知道模块的状态。 我们希望使用一个MIB文件在一个集中式服务中使用SNMP,而不是使用MIB文件并在每个模块中实现SNMP。 这有其优点,但是由于每个模块都可能包含其对等模块的完整副本,因此随附的MIB文件越来越大。 看起来像这样,这只是一个非常简单的示例。

example mib tree

问题是: 有没有一种方法可以在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

1 个答案:

答案 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