万事开头难,使用SNMP的经验

-

-

什么是:SNMP

Simple Network Management Protocol 简单网络管理协议
.

SNMP是基于TCP/IP协议族的网络管理标准,它的前身是简单网关监控协议(SGMP),用来对通信线路进行管理。随后,人们对SGMP进行了很大的修改,特别是加入了符合Internet定义的SMI和MIB:体系结构,改进后的协议就是著名的SNMP。SNMP的目标是管理互联网Internet上众多厂家生产的软硬件平台,因此SNMP受Internet标准网络管理框架的影响也很大。现在SNMP已经出到第三个版本的协议,其功能较以前已经大大地加强和改进了。

业务需求:

其实感觉这个东西运维的兄弟用的应该是比较多的,但是作为开发的我其实是第一次接触到,所以在使用的过程当中也遇到了些问题,但是经过各种查找资料总算是能够继续下去了。

先说说我们的业务需求,我们目前的项目是为一家企业做私有云的服务,其实“云”的最基本的东西就是虚拟资源的管理及合理使用,我们之前的虚拟资源的搭建与铺垫是通过openstack实现的,目前我的工作是需要30s去获取我们虚拟机的信息帮助客户那边的运维兄弟更直观的管理与监控多台虚拟机的状态,所以我需要去获取机器的信息,包括:cpu状态,内存状态,网络状态,磁盘使用状态,IO状态等。前端期望以图表的形式显示出来。

所以整个业务的最重要的就是怎样拿到虚拟机状态,考虑到去这么多虚拟机上装一个软件不太现实,所以准备使用snmp,由于snmp默认并未安装所以需要我们将其装在虚拟机上:

windows:

进入“控制面板”的"打开或关闭Windows功能"安装snmp:

进入本地服务,打开对应的snmp service:

鼠标双击“SNMP
Service”选项,在弹出的窗口中切换到“安全”选项卡中,如上图添加“接受的社区名称”和接收那些主机发出的SNMP数据包。

“接受的社区名称”是自己定义的任意字符都可以,接收那些主机发出的SNMP数据包定义成你的Nagios服务器即可。

到这里被监控端的Windows主机的SNMP服务就配置完成了。

Linux:

我这里用的是Ubuntu,作为参考,

1.Installation

sudo -i

apt-get install snmpd snmp

2. Configuration

将/etc/snmp/snmpd.conf 这个配置文件,重命名为/etc/snmp/snmpd.conf.org:

mv /etc/snmp/snmpd.conf  /etc/snmp/snmpd.conf.org

新建一个/etc/snmp/snmpd.conf文件:

rocommunity public

syslocation "Chengdu"

syscontact [email protected]

打开/etc/default/snmpd:

gedit /etc/default/snmpd

找到

# snmpd options (use syslog, close stdin/out/err).

SNMPDOPTS=‘-Lsd -Lf /dev/null -u snmp -I -smux -p/var/run/snmpd.pid
127.0.0.1‘

将其改成

# snmpd options (use syslog, close stdin/out/err).

#SNMPDOPTS=‘-Lsd -Lf /dev/null -u snmp -I -smux -p/var/run/snmpd.pid
127.0.0.1‘

SNMPDOPTS=‘-Lsd -Lf /dev/null -u snmp -I -smux -p/var/run/snmpd.pid -c
/etc/snmp/snmpd.conf‘

重启snmpd

/etc/init.d/snmpd restart

3.Test

snmpwalk -v 1 -c public localhost

有信息输出表示snmp及snmpd安装完成。

通过vi修改config文件之后,我们测试localhost得到了信息,说明本机没有问题了,我们为了达到远程机器可以访问snmp服务的目的同样去修改conf文件,然后重启snmpd保护进程:

然后我们远程尝试连接snmp服务提示成功。

下面是我找到的两个.net开发库

http://sharpsnmplib.codeplex.com/

http://www.snmpsharpnet.com/

我只是将里面的代码摘出来了:


#region 通过oid字符数组获得相应的值
public static Dictionary<string, string> getOIDValue(string host,string[] oid) {
Dictionary<string, string> dic = new Dictionary<string, string>();

OctetString community = new OctetString("public");
AgentParameters param = new AgentParameters(community);
param.Version = SnmpVersion.Ver1;
IpAddress agent = new IpAddress(host);
UdpTarget target = new UdpTarget((IPAddress)agent,161,2000,1);
Pdu pdu = new Pdu(PduType.Get);

foreach (String singleOid in oid)
{
pdu.VbList.Add(singleOid);
}

SnmpV1Packet result = (SnmpV1Packet)target.Request(pdu,param);
if (result != null) {
if (result.Pdu.ErrorStatus == 0) {
for (int i = 0; i < result.Pdu.VbList.Count; i++)
{
dic.Add(result.Pdu.VbList[i].Oid.ToString()+"-"+i, result.Pdu.VbList[i].Value.ToString());
}
}
}
target.Close();

return dic;
}
#endregion


#region 通过snmpwalk返回oid根下面的所有值
public static Dictionary<string, string> getWalkValue(string host, string irootOid)
{
Dictionary<string, string> dic = new Dictionary<string, string>();
// SNMP community name
OctetString community = new OctetString("public");

// Define agent parameters class
AgentParameters param = new AgentParameters(community);
// Set SNMP version to 2 (GET-BULK only works with SNMP ver 2 and 3)
param.Version = SnmpVersion.Ver2;
// Construct the agent address object
// IpAddress class is easy to use here because
// it will try to resolve constructor parameter if it doesn‘t
// parse to an IP address
IpAddress agent = new IpAddress(host);

// Construct target
UdpTarget target = new UdpTarget((IPAddress)agent, 161, 2000, 1);

// Define Oid that is the root of the MIB
// tree you wish to retrieve
Oid rootOid = new Oid(irootOid); // ifDescr

// This Oid represents last Oid returned by
// the SNMP agent
Oid lastOid = (Oid)rootOid.Clone();

// Pdu class used for all requests
Pdu pdu = new Pdu(PduType.GetBulk);

// In this example, set NonRepeaters value to 0
pdu.NonRepeaters = 0;
// MaxRepetitions tells the agent how many Oid/Value pairs to return
// in the response.
pdu.MaxRepetitions = 5;

// Loop through results
while (lastOid != null)
{
// When Pdu class is first constructed, RequestId is set to 0
// and during encoding id will be set to the random value
// for subsequent requests, id will be set to a value that
// needs to be incremented to have unique request ids for each
// packet
if (pdu.RequestId != 0)
{
pdu.RequestId += 1;
}
// Clear Oids from the Pdu class.
pdu.VbList.Clear();
// Initialize request PDU with the last retrieved Oid
pdu.VbList.Add(lastOid);
// Make SNMP request
SnmpV2Packet result = (SnmpV2Packet)target.Request(pdu, param);
// You should catch exceptions in the Request if using in real application.

// If result is null then agent didn‘t reply or we couldn‘t parse the reply.
if (result != null)
{
// ErrorStatus other then 0 is an error returned by
// the Agent - see SnmpConstants for error definitions
if (result.Pdu.ErrorStatus == 0)
{
// Walk through returned variable bindings
foreach (Vb v in result.Pdu.VbList)
{
// Check that retrieved Oid is "child" of the root OID
if (rootOid.IsRootOf(v.Oid))
{
dic.Add(v.Oid.ToString(), v.Value.ToString());
}
else
{
// we have reached the end of the requested
// MIB tree. Set lastOid to null and exit loop
lastOid = null;
}
}
}
}
}
target.Close();
return dic;
}
#endregion

然后再找到适配windows,linux的oid信息就可以帮助我们拿到相对应的机器信息了。

时间: 2024-08-08 15:51:13

万事开头难,使用SNMP的经验的相关文章

万事开头难,使用NLog经验

俗话说,万事开头难.记录下怎么使用Nlog的,一个简单的Demo. 首先有一个项目包含自身的业务类库Lib,以及启动程序Console. 通过NuGet在console中引入Nlog.config,在Lib中引入NLog: 在console的NLog.config中填写以下信息: 其中Rules节点时针对于多种不同Path的log记录的实现writeTo指向的是target的name,而logger 的name是对应类文件中通过Logger("")赋的name. 建立两个业务类:cla

学习前端,万事开头难

万事开头难. 当我想要认真写一篇文章向大家分享我对前端的认识与感悟的时候,突然就深刻的体会到了这句话确实太有道理了. 最近几年对于web前端的传闻很多,比如人才稀缺,简单易学,待遇丰厚,整体势头发展良好等等.曾看到过有人对前端市场人才的稀缺这样吹捧过:现在,几乎整个互联网行业都缺前端工程师,不仅在刚起步的创业公司,对上市公司乃至巨头这个问题也一样存在.没错,优秀的前端工程师简直比大熊猫还稀少.不仅在国内的互联网行业,在国外,前端工程师一样是需求旺盛.供不应求的香饽饽. 对于我这种金融行业的学生的

一个想法照进现实-《IT连》创业项目:万事开头难

前言: 之前是一个想法,现在已经进入创业阶段,所以这个系列的标题,改了. 众筹的事在今天也停止了. 7-9号会在深圳龙岗布吉参加一个风投对接的活动,今晚(6号)会出发. 因为:在深圳会呆几天,而且这个会估计有很多内容或内幕值得和大伙分享. 所以:先和大伙分享这十天左右我遇到的一些事情和体会. 创业只因我们坚信这事,并不是因为支持或反对的比例 每一个创业者,在创业时,都会收获一些支持,和一些反对. 有人告诉我:如果这件事,有80%人反对,那么这件事就值的去做. 但我想说的是,这碗鸡汤我不喝:80%

万事开头难 &amp;&amp; 实践出真知

实践出真知,真是千古不变的真理. 前几天在顺手做一个万年历项目,实现了用TFT屏显示实时时间,日期,温度,和按键设置时间,能在特定时间显示特定的话语在显示屏上面.其实这个项目现在想想还是挺简单的.我的功能也不是很多.但是在认真做这个项目的时候,真的确确实实让我自己充实了很多,学了很多知识,也发现了很多我之前没有发现的问题.也就只有在实际动手中才能发现问题的所在.在我们这个电气工程专业,我觉得技能是检验能力的重要标准之一.等到这个项目做完的时候,我又陷入了无聊和无方向的循环中.每天也在学习,但是感

大白话Vue源码系列(01):万事开头难

阅读目录 Vue 的源码目录结构 预备知识 先捡软的捏 Angular 是 Google 亲儿子,React 是 Facebook 小正太,那咱为啥偏偏选择了 Vue 下手,一句话,Vue 是咱见过的最对脾气的 MVVM 框架.之前也使用过 knockout,angular,react 这些框架,但都没有让咱产生 follow 的冲动.直到见到 Vue,简直是一见钟情啊. Vue 的官方文档已经对 Vue 如何使用提供了最好的教程,建议 Vue 新手直接去官网学习,而不要在网上找些质量参差不齐的

万事开头难!

接触Java算早的,但遗憾的是没有早点吃螃蟹. 时间匆匆过,现去而复返,希望不算太晚.踌躇犹豫.焦虑担心,还是得鼓起勇气,至少自己还未老掉牙. 认识了不少新同学,时间久了觉得自己又找到组织了,飘摇了太久,孤单了太久,一直觉得自己是独行侠,突然要试着合作,团队合作,挺担心自己,不过我没到丧失沟通能力的地步,说不定能碰撞出更好的火花,相信自己! 第一次记录,给自己打打气吧,不论多困难,坚持.刻苦.不放弃!

RF+Appium框架自动化测试系列一之(Mac下Appium环境搭建)万事开头难

Mac下Appium环境搭建: 消失了3个月,有一段时间没来园子更新博客了,各位看官见谅哈哈,消失是因为TestYao刚换了工作环境没外网,好多笔记没能及时的记录分享,以后有时间慢慢补上吧,这段时间主要接触了移动端app的自动化测试,公司为了快速把移动端自动化这块搞起来,试用几款目前流行的工具,腾讯的xtest定制版.神州数码的自动化测试平台.开源rf+appium框架. 经过一段试用最终还是选择了rf+appium主要原因有: 1.开源,网上社区活跃 2.扩展性强,针对不同项目不同的需求,封装

【C#】万事开头难(二)&amp;lt;机房重构&amp;gt;

前言 机房将要进行完了,之所以仍然使用这个题目,是由于我想告诉自己.无论面对多么未知的事物.不要害怕,去做就好.在这么多天的机房重构中,发现了好多问题,也攻克了好多问题,今天,就把我解决的问题分享给大家. 充值中的分行显示 在充值和退卡功能窗口中,我们会将一些信息分行显示到lablebox中,那么这个分行是怎么做到的呢? lblDetail.Text = "充值卡号: " + txtCardNo.Text.Trim() + System.Environment.NewLine+&quo

如何配置visual studio 2013进行负载测试-万事开头难

声明:工作比较忙,文章写得不好,有时间再整理. 起因:最近众包平台因迁移到azure之后一直有网站慢的情况,让老板挨批了,但是测试环境一切正常,而且生产环境也没发现有卡顿和慢的情况,所以干脆来一次负载测试看看网站性能到底如何. 本来这活应该测试做,但是测试是做功能测试的,不会编程,简单会用 Loadrunner,但是还是不行. 所以没辙,我得自己上. 开发环境:visual studio 2013 1.新建web性能测试 如何录制脚本,我就不详细写了,这个网上都有. 2.新建负载测试 3.选择相