前段时间有幸接触到关于硬件交换机、存储器这块硬件方面的知识,然后去网上了解了一下怎么去获取设备的配置信息方面的知识
下面我就来简单谈谈自己的观点,还望大神多多指教,相互学习:
众所周知,机房内的各个设备都是需要通过IP网络来通信的,而SNMP是基于TCP/IP协议族的网络管理标准,是一种在IP网络中管理网络节点(如服务器、工作站、路由器、交换机等)的标准协议。SNMP能够使网络管理员提高网络管理效能,及时发现并解决网络问题以及规划网络的增长。网络管理员还可以通过SNMP接收网络节点的通知消息以及告警事件报告等来获知网络出现的问题。
那么今天我这里要讲的就是关于怎样通过SNMP协议来获取配置信息,下面先来介绍SNMP协议的一些知识:
SNMP管理的网络主要由三部分组成
被管理的设备
SNMP代理
网络管理系统(NMS)
它们之间的关系如下:
网络中被管理的每一个设备都存在一个管理信息库(MIB)用于收集并存储管理信息。 通过SNMP协议,NMS能获取这些信息。
被管理设备,又称为网络单元或网络节点,可以支持SNMP协议的有路由器、交换机、服务器或者主机等等。
SNMP代理是被管理设备上的一个网络管理软件模板,拥有本地设备的相关管理信息,并用于将它们转换成与SNMP兼容的格式,传递给NMS。
NMS运行应用程序来实现监控被管理设备的功能。另外,NMS还为网络管理提供大量的处理程序及必须的储存资源。
介绍下上文中的管理信息库(MIB),它由网络管理协议访问的管理对象数据库,它包括SNMP可以通过网络设备的SNMP管理代理进行设置的变量。MIB是对象的集合,它代表网络中可以管理的资源和设备。每个对象基本上是一个数据变量,它代表被管理的对象的一方面的信息。
使用SNMP进行网络管理需要下面几个重要部分:管理基站,管理代理,管理信息库和网络管理工具。
管理基站通常是一个独立的设备,它用作网络管理者进行网络管理的用户接口。基站上必须装备有管理软件,管理员可以使用的用户接口和从MIB取得信息的数据库,同时为了进行网络管理它应该具备将管理命令发出基站的能力。
管理代理是一种网络设备,如主机,网桥,路由器和集线器等,这些设备都必须能够接收管理基站发来的信息,它们的状态也必须可以由管理基站监视。管理代理响应基站的请求进行相应的操作,也可以在没有请求的情况下向基站发送信息。
最后一个方面是管理协议,也就是SNMP,SNMP的基本功能是:取得,设置和接收代理发送的意外信息。取得指的是基站发送请求,代理根据这个请求回送相应的数据,设置是基站设置管理对象(也就是代理)的值,接收代理发送的意外信息是指代理可以在基站未请求的状态下向基站报告发生的意外情况。
而在我们去进行SNMP协议管理的时候会用到几个参数:
IP地址
通信字符串
OID
IP地址:即设备的物理IP地址
最常见的默认通信字符串是public(只读)和private(读/写),除此之外还有许多厂商私有的默认通信字符串。几乎所有运行SNMP的网络设备上,都可以找到某种形式的默认通信字符串。
OID:是指设备MIB库内对应信息会有一个OID编号,这个需要去设备厂商处查询得到。
在此我们还使用了iReasoning MIB Browser这个MIB浏览软件以配合我们的工作,将设备厂商提供的MIB包导入浏览器,就能看见设备的一些OID相关的信息。
而在我工作中呢,SNMP监控的性能指标很多都是通过snmpwalk采集设备的OID信息得到的。
snmpwalk是SNMP的一个工具,它使用SNMP的GETNEXT请求查询指定OID(SNMP协议中的对象标识)入口的所有OID树信息,并显示给用户。通过snmpwalk也可以查看支持SNMP协议(可网管)的设备的一些其他信息,比如cisco交换机或路由器IP地址、内存使用率等,也可用来协助开发SNMP功能。
下面是用到的一部分代码,通过snmpwalk采集设备的OID信息:
public static Map<String, String>snmpWalk(String ip, String community, String targetOid) {
CommunityTarget target = createDefault(ip, community);
TransportMapping transport = null;
Snmp snmp = null;
Map<String, String> map = new HashMap<String, String>();
try {
transport = new DefaultUdpTransportMapping();
snmp = new Snmp(transport);
transport.listen();
PDU pdu = new PDU();
OID targetOID = new OID(targetOid);
pdu.add(new VariableBinding(targetOID));
boolean finished =false;
while (!finished) {
VariableBinding vb = null;
ResponseEvent respEvent = snmp.getNext(pdu, target);
PDU response = respEvent.getResponse();
if (null == response) {
finished = true;
break;
} else {
vb = response.get(0);
}
finished = checkWalkFinished(targetOID, pdu, vb);
if (!finished) {
String key = vb.getOid().toString();
map.put(key.split("\\.")[key.split("\\.").length - 1], vb.getVariable().toString());
pdu.setRequestID(new Integer32(0));
pdu.set(0, vb);
} else {
snmp.close();
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (snmp !=null) {
try {
snmp.close();
} catch (IOException ex1) {
snmp = null;
}
}
}
return map;
}
代码参考了以下这位大神的代码:
http://blog.csdn.net/fw0124/article/details/8559803