了解服务器的运行状况是件非常重要的工作,尤其是一些关键数值的变化,不仅可以帮助我们解决一些隐患,而且还能分析服务器的瓶颈、性能等问题。在我维护的公司服务器群中,经常会遇到一些大大小小的问题,不是因为磁盘空间满,就是程序的BUG导致服务器负载过高而死机。所以,必须要有一套系统来维护、管理服务器群,但由于商业软件太昂贵,只能考虑一些免费的管理软件了,呵呵,我们的目标是零投入、高产出,是不是太……,唉,没办法啊,谁让商业软件太贵买不起。
本文通过SNMP、rrdtool、cacti等免费工具打造了一套带有简单报警功能的监控系统,尽管是免费的,但其价值丝毫不逊于商业软件。开始工作前,我们需要了解一些基本概念,这将有助于我们更加全面的掌握、使用监控系统,也使我们在后期的维护及优化中更加游刃有余。
一、SNMP简介
虽然TCP/IP的管理协议SNMP(Simple Network Management Protocol)称为简单网络管理协议,但实际上SNMP相当复杂。所以这里只能给大家简单的描述一下,如果读者想深入SNMP协议,可以参阅http://www.faqs.org/rfcs/index.html中有关SNMP协议的详细介绍。
SNMP主要由两部分组成:一部分是MIB(Management Information Base,管理信息结构)的定义,也就是我们访问的实体内容,如:系统信息、TCP信息等;另一部分是访问管理信息库的协议操作:get、get-next、set和trap,通过这些操作可以访问实体内容。
管理信息库是一个树状的结构,如图1所示,OID(object identifiers)对象标识符用数字表示,MIB则用文字描述。其实这两个概念和IP地址ó域名相对应的原理是一样的,通过查询OID和MIB都可以获取我们想要的信息,但是使用OID更为方便一些,就像我们更喜欢域名一样。本文中所有使用的OID都是1.3.6.1.4.1,即enterprises。
举个例子:查看系统正常运行时间的OID是1.3.6.1.2.1.1.3,也可以将这个OID写成iso.org.dod.internet.mgmt.mib-2.system.sysUpTime。
图1:OID树状结构图
SNMP目前有3个版本:
SNMP Version 1: SNMP协议的首个版本,因为配置、使用很简单,所以也是最常用的。这个版本的安全策略使用的是限制IP访问和团体名的方式,而且数据传输也不加密,一旦被非法用户获取访问方法,服务器的所有信息将被一览无余。
SNMP Version 2: SNMP的第二版本, 也称为v2c。SNMPv2在前一版本的基础上扩展了错误代码数量和计数器的大小,并且在查询大量数据信息时能够保证较高的效率。
SNMP Version 3: 相对于前两个版本,v3提供了更为强大的安全机制和远程配置功能。它不再使用团体名和读写访问控制作为安全策略,而是加入了用户名和密码的机制。最重要的一点是v3版本支持SNMP数据传输和错误检测加密传输。并且可根据每个用户来单独设置访问OID值的权限。
NET-SNMP就是基于上述原理开发的免费SNMP工具,这款工具的实现原理与设计同SNMP协议完全一致。当今几乎所有的Linux系统和网络设备(路由器、防火墙等)都支持SNMP协议,所以通过SNMP能够轻松的获取监控设备的信息。
二、MRTG、RRDtool和cacti
由于NET-SNMP收集的数据都是数值形式,不利于分析系统。需要有工具将收集到的数据画成连续的图形便于直观的了解、监控系统,而MRTG(多路由器流量记录仪)和RRDtool可以实现这个功能。
MRTG是由crontab定时运行,负责从监控的主机采集数据,然后将这些实时数据保存并创建连续图形。MRTG有几项基本功能。首先,它保存着一个不需要维护大小的数据库:软件只保存实时的数据来创建图形,所以保存数据的文件大小一直不变,时间一长,就无法看到历史数据图形了;其次,虽然MRTG可以记录任何SNMP变量并绘制其图形,但很可惜,它的图形整合功能不强,如果想创建有多个数据源的监控,就得画多个图形,这样很不利于管理工作。为了解决上述问题,MRTG的作者编写了RRDtool。
RRDtool在概念上类似于MRTG,但它具有改进的数据合并和图形整合功能。和MRTG不同的是,RRDtool不提供它自己的任何数据收集方法,而是必须由一个单独的软件来收集、保存数据,另外,RRDtool可以将不同的数据源画在一张图表上。
因为RRDtool绘制图形极为复杂,且不易掌握,所以需要和Cacti的配合使用,Cacti是由PHP编写的功能强大的图形显示、配置工具。通过Cacti和这些软件的结合使用,将会展示给我们一个直观的结果。
Cacti作为前端程序,不仅可以方便的监控任何运行SNMP协议的设备,而且加上Shell程序,将可以完成一些简单的报警机制,这对我们自动化监控有很大帮助。我们的目的是使所有的工作简单化,最好什么都不做就实现目标,呵呵,痴人说梦。下面就跟我开始真正的工作吧。
1. 安装软件
我选用了SLES9平台,即SuSE Linux Enterprise Server 9,SuSE这名字是德文“Software und System Entwicklung”的缩写,意思是“软件及系统开发”,目前SUSE公司已被Novell所收购。之所有选择SuSE的操作系统,不仅是因为它是全球第二大Linux厂商,更重要的是它在自动化方面很强大,通过SuSE的YaST(Yet another Setup Tool)图形管理工具不仅可以方便的安装大量软件,而且在配置系统硬件、网络服务时也很容易上手,这项功能对Linux初学者来说很重要。
下面,我们就在已经安装好的系统环境中运行SuSE的强大工具YaST来安装以下繁多的软件吧。安装前有个小建议,请不要将时间浪费在安装软件上,也就是说,有了方便的RPM包,而且没有什么特殊需求,就不要从源代码直接编译安装了,呵呵,可不要像我当初一样,花了好几个小时安装软件,装完也没心情继续下面的工作了。
图2:SLES9界面
apache2-example-pages-2.0.49-27.29 apache2-2.0.49-27.38
apache2-prefork-2.0.49-27.38
apache2-doc-2.0.49-27.29
Mod_php4-apache2-4.3.4-43.8
apache2-mod_php4-4.3.4-43.46.3
mysql-shared-4.0.18-32.1
mysql-client-4.0.18-32.1
mysql-4.0.18-32.20
php4-mysql-4.3.4-43.46.3
php4-4.3.4-43.46.3
php4-snmp-4.3.4-43.8
php4-mysql-4.3.4-43.46.3
rrdtool-1.2.15
libpng-devel-1.2.5-182.4
libart_lgpl-devel-2.3.16-84.1
tcl-devel-8.4.6-26.3
python-devel-2.3.3-88.1
Freetype2-devel-2.1.7-53.5
zlib-devel-1.2.1-70.12
net-snmp-5.1.3.1-0.6
libxml-1.8.17
软件表
如果在安装软件时系统提示还需要别的软件,可根据提示来添加安装。
启动“YaST安装和卸载软件”模块来安装表中软件包:
【方法1】图形模式:单击工具栏“开始”->系统->YaST->系统->安装和卸载软件
【方法2】图形模式:在命令行输入“yast2”->系统->安装和卸载软件
【方法3】图形模式:在命令行输入“yast2 sw_single”
【方法4】文字模式:输入“yast”->Software->Install and Remove Software
【方法5】文字模式:输入“yast sw_single”
利用“YaST安装和卸载软件”模块的搜索功能,输入软件列表中的软件包名,出现如下所示的界面,勾选这些软件包。可以同时将所有软件搜索、选择后再点击“接受(A)”安装。
图3:YaST安装界面
按下“接受(A)”后,这时会出现提示插入光盘的信息,根据提示插入光盘后便可顺利安装。SuSE的RPM软件包不仅多、全,而且还可通过一些SuSE的安装源或http://rpmfind.net查找不同平台、不同版本的RPM包。
我也在其它版本的linux系统安装过这些软件,有时因为找不到相同版本的RPM包,导致包的依赖关系也不一样,所以安装很麻烦。包依赖关系的问题在SuSE系统中得到了比较好的解决。
2. 安装配置cacti
所有软件安装完毕后,接下来就来安装、配置本文的主角cacti。
linux:~ # useradd cactiuser # 添加cacti需要的用户
linux:~ # cd /srv/www/htdocs/ # SuSE的网页目录
linux:/srv/www/htdocs # wget http://www.cacti.net/downloads/cacti-0.8.6h.tar.gz
linux:/srv/www/htdocs # tar zxvf cacti-0.8.6h.tar.gz # 解压cacti软件包
linux:/srv/www/htdocs # mv cacti-0.8.6h cacti
linux:/srv/www/htdocs # chown –R wwwrun.www cacti
linux:/srv/www/htdocs # cd cacti
linux:/ # mysqladmin --user=root create cacti # 创建数据库cacti
linux:/ # mysql cacti < cacti.sql # 导入数据
linux:/ # mysql --user=root mysql # 进入数据库
Mysql > GRANT ALL ON cacti.* TO cactiuser@localhost IDENTIFIED BY 'somepassword';
# 创建cactiuser用户、设置密码“comepassword”并付予新创建的cacti数据库的所有权限
Mysql > flush privileges; # 更新权限表
编辑文件include/config.php,找到下列内容然后根据上面的信息进行修改。
$database_default = "cacti";
$database_hostname = "localhost";
$database_username = "cactiuser";
$database_password = "cacti";
设置权限:
linux: ~ # chown -R cactiuser rra/ log/
# 设置属主为cactiuser,这一步很重要,会影响cacti的正常运行
linux:/ # crontab –e # 设置定时任务
*/5 * * * * php /srv/www/htdocs/cacti/poller.php > /dev/null 2>&1
# 每5分钟使用命令php执行一次poller.php轮循文件,这一步主要将收集到的信息绘制成图表
启动进程服务:
linux:/ # insserv apache2 mysql snmpd # 设置开机时自动启动服务
# 启动下列服务
linux:~ # rcapache2 start
Starting httpd2 (prefork) done
linux:~ # rcmysql start
Starting service MySQL done
Cacti和系统环境配置完毕后,输入目标服务器IP访问Cacti。
http://your-server/cacti/
图4:Cacti登陆界面
恭喜!看到上面的图片,说明cacti已经和mysql、apache结合成功并运行正常了。输入默认的用户名和密码“admin”后,系统将提示你设置新密码。
图5:修改密码界面
设置完新密码后,先别急着添加主机,因为SNMP还没配置好,即使进去了也看不到任何图形和数据,先进入下一环节,配置SNMP。
三. 配置SNMP
如果您在前面的基本概念环节还有模糊的地方,那么接下来的内容将使我们更加深入理解监控系统的工作原理。先来配置snmp。本文中cacti和snmp都配置在同一台主机环境中。
1. 配置snmp文件
linux:~ # cat /etc/snmpd.conf
com2sec test 192.168.0.1 public
group testgroup v1 test
view all included .1 80
access testgroup "" any noauth exact all none none
disk / 95%
disk /home 1048576
includeAllDisks
load 1 3 5
proc apache 10 1
swap 1048576
exec .1.3.6.1.4.1.2021.53 link.sh /bin/sh /root/link.sh
linux:~ #
(1) com2sec NAME SOURCE COMMUNITY
该指令定义了安全访问名、可访问监控主机的IP地址和团体字符串。安全访问名可任意取;第二个选项默认值是default,表示允许所有IP都可访问监控服务器,由于SNMPv1是明文传输数据,所以为了安全,需要将这项修改一下,192.168.0.1表示仅允许这个IP地址访问SNMP监控服务器,除了这种形式,还可将其设置为一个主机名或IP/MASK的形式;Public是系统设置的默认团体名,也得设置复杂些,安全第一嘛。
(2) group NAME MODEL SECURITY
定义一个组并映射com2sec设置的安全访问名,同时设定使用SNMPv1版本。
(3) view NAME TYPE SUBTREE [MASK]
本条指令用来创建可访问OID范围。NAME任取,TYPE包括“included”和“excluded”,表示监控内容包括或排除后边的SUBTREE;“SUBTREE”就是范围OID的范围了,“.1”表示最大权限,即从根部(ISO)访问的权限;“80”是掩码,用来起限制作用。
(4)access NAME CONTEXT MODEL LEVEL PREFX READ WRITE NOTIFY
access用来定义访问OID的权限
(5) disk PATH [ MINSPACE | MINPERCENT% ]
includeAllDisks MINPERCENT%
为了使大家更容易理解这两条语句及下面的配置,请先将上面的配置信息写入/etc/snmpd.conf并启动snmp进程服务。然后运行命令:
linux:~ # snmpwalk -v 1 -c public localhost 1.3.6.1.4.1.2021.9
这个OID是查看磁盘信息的,disk指令表示监控一个分区,第二条则监控全部分区,如果设置了最小使用率,一旦磁盘容量超出最小设定值时,OID中的“dskErrorFlag”的标志位将会置为“1”。磁盘使用率可以用百分比和kb的方式来表示。所有磁盘信息都包含在这个OID中。如果您忘了具体OID号,可以使用下面介绍到的snmp命令snmptranslate获取OID号。
(6) load MAX1 [MAX5 [MAX15]]
OID:1.3.6.1.4.1.2021.10
系统的1、5、15分钟的系统负载变化,超过最大值后也会将相关错误标志位设为“1”
(7)proc NAME [MAX [MIN]]
OID:1.3.6.1.4.1.2021.2
监控进程的数量。这里我设置监控apache的进程数,当进程多于10和少于1都将报错。
(8)swap MIN
OID:1.3.6.1.4.1.2021.4
检测swap分区的状态。
(9)exec [MIBOID] NAME PROG ARGS
OID:1.3.6.1.4.1.2021.53
该指令可以执行脚本程序,“MIBOID”是个自定义的OID,定义前先使用snmpwalk命令确定该OID不存在,NAME任取,“PROG”和“ARGS”表示执行的命令和脚本程序。
link.sh脚本内容:
linux:~ # vi link.sh
netstat –an | wc -l # 显示当前系统的所有连接数
w –h | wc –l # 当前登陆的用户数量。如果后半夜有人登陆系统,说明很有可能黑客光顾了
wc –l < /root/suid
wc –l < /root/sgid # 检测当前系统中所有设置了suid和sgid的文件的数量
linux:~ # chmod 755 link.sh
注意程序的内容必须都是以数值形式返回的,因为Cacti只能使用数值绘制图形。
程序中最后两条指令用来统计系统中SUID和SGID文件的数量。有时,root用户会将一些自己的工作或一些特权指令分配给普通用户,通过SUID和SGID可以实现这项工作,本来是个非常有用的功能,但很可惜,成了黑客最喜欢的工具之一。当黑客攻破系统后,不仅可以通过设置了SUID和SGID的文件或命令轻易获得执行特权指令的权限,而且还有可能通过一些系统漏洞获取ROOT权限。举个例子:
一般情况下,普通用户是无法用fdisk命令看到磁盘信息的,但经过设置suid就能查看了。
linux:~ # ls -l /sbin/fdisk
-rwxr-xr-x 1 root root 73792 2005-06-28 18:20 /sbin/fdisk
sybase@linux:~> /sbin/fdisk -l
Cannot open /dev/hda
Cannot open /dev/sda
sybase@linux:~>
linux:~ # chmod 4755 /sbin/fdisk
linux:~ # ls -l /sbin/fdisk
-rwsr-xr-x 1 root root 73792 2005-06-28 18:20 /sbin/fdisk
linux:~ # su - sybase
sybase@linux:~>
sybase@linux:~> /sbin/fdisk -l
Disk /dev/hda: 81.9 GB, 81964302336 bytes
16 heads, 63 sectors/track, 158816 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Device Boot Start End Blocks Id System
/dev/hda1 * 43693 60337 8389080 83 Linux
/dev/hda2 41612 43692 1048824 82 Linux swap
/dev/hda3 60338 158816 49633416 f W95 Ext'd (LBA)
Partition table entries are not in disk order
Disk /dev/sda: 18.2 GB, 18200739840 bytes
255 heads, 63 sectors/track, 2212 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 13 104391 83 Linux
sybase@linux:~>
通过这个例子,我们了解到了SUID和SGID的优劣,所以最好不要用。为了系统运行在一个安全的环境中,监控这些权限位的文件数量的变化很重要,通过下面的方法实现。
linux:~ # vi findsuid
#!/bin/bash
find / -perm -4000 -type f -print > /root/suid 2>&1
find / -perm -2000 -type f -print > /root/sgid 2>&1 # 将suid和sgid的值保存在这两个文件中
chmod 755 /root/suid
chmod 755 /root/sgid # 设置可执行权限,为SNMP做准备
linux:~ # chmod 755 findsuid
linux:~ # crontab –e
30 2 * * * /bin/bash /root/findsuid # 根据服务器负载来设置脚本的执行时间
这段程序的结果存放在root目录的suid和sgid两个文件中,通过snmp读取这两个文件的统计结果便能实现监控目的。
注意:这个程序运行时间较长,所以要和cacti设置的定时任务时间不能太接近。
这些配置内容是我经过反复的测试、实践得来的,虽然很简单,但很实用,而且大部分的功能都实现了。还有一些高级的配置,可以参阅官方帮助文档或使用“man”命令查看手册。检测配置文件无误后,启动snmp服务:
linux:~ # rcsnmpd start
Starting snmpd done
linux:~ #
测试:
linux:~ # snmpwalk -v 1 -c public localhost 1.3.6.1.4.1.2021
UCD-SNMP-MIB::prIndex.1 = INTEGER: 1
UCD-SNMP-MIB::prNames.1 = STRING: httpd2-prefork
UCD-SNMP-MIB::prMin.1 = INTEGER: 0
UCD-SNMP-MIB::prMax.1 = INTEGER: 0
UCD-SNMP-MIB::prCount.1 = INTEGER: 6
UCD-SNMP-MIB::prErrorFlag.1 = INTEGER: 0
UCD-SNMP-MIB::prErrMessage.1 = STRING:
UCD-SNMP-MIB::prErrFix.1 = INTEGER: 0
UCD-SNMP-MIB::prErrFixCmd.1 = STRING:
……
linux:~ #
如果“哗啦哗啦”显示一大堆的数据,说明配置已经生效,可以顺利的进入下一环节了,如果没有显示信息,请检测配置文件正常性以及网络状态和系统是否设置了防火墙。
四、简单配置cacti
现在继续接着第2环节的Cacti配置。先登陆http://your-server/cacti,然后输入前面设置的用户名和密码,这时cacti将提示用户配置监控环境。
图6:Cacti安装向导(1)
点击“Next”继续
图7:Cacti安装向导(2)
选择安装模式,有全新安装和从cacti老版本升级安装两项,根据环境来选择。
图8:Cacti安装向导(3)
这些设置比较重要,如果命令的位置和版本填写有误,cacti在后面将无法正常工作。如果不是很清楚命令的位置,可以使用“which”命令查找一下。
linux:~ # which php
/usr/bin/php
linux:~ #
(1)添加监控主机
登陆到配置界面后,系统已经将localhost本机加到监控主机列表中,可以先删除它。然后重新将配置好SNMP的主机也,就是本机添加进来。开始前,注意先确定已经启动snmp进程。
图9:Cacti配置主界面
选择图9红框处“Devices”,进入下一界面后,点击右上角的“Add”。
图10:添加监控服务器
参考下列信息填写:
Descritpion 对服务器的描述信息,任意取一个容易记的名称
Hostname 监控主机的IP地址或主机名,如果使用主机名,别忘了设置/etc/hosts
Host Template 根据监控主机的类型来选择,如果是Linux系统,通常选择“Local Linux Machine”和“ucd/net SNMP Host”。这里选择了“ucd/net SNMP Host”。
SNMP Community 要和snmpd.conf中的团体名一致
SNMP Version 如果选择Version 1,就不用设置SNMP Username和SNMP Password两项了,因为只有在Version 3中才会使用。
SNMP Port 默认使用161端口
SNMP Timeout 获取目标主机信息的超时时间
信息填写完整无误后,点击“Create”创建。
图11:监控服务器添加成功
如果出现图11左上角的信息后,表明cacti已经检测到了当前主机的snmp信息。首台服务器添加成功,接着为它创建图形,按照图10的提示,点击“Create Graphs for the Host”。
图12:创建监控图形
创建监控图形是根据前面选择的模板“ucd/net SNMP Host”来创建的,这个模板包含主机的CPU使用率、系统负载、内存信息及网卡数据流量。选择好要创建的图形后,点击“Create”。
图13:创建监控图形成功
当我们看到图13红框框的信息时,说明第一台服务器已经成功添加。写到这里,监控系统的基本框架算是完成了,通过上面的步骤我们可以反复添加多台服务器。接下来,我们需要做一些完善工作。
图14:创建显示图形
为了使创建的图形让我们更容易监控、查看,可以将每台服务器的信息单独分类显示。根据图14依次点击“Graph Trees”->“Add”。
图15:图形名称
输入提示信息,“Name”是图形显示的名称。
图16:选择服务器监控图形
创建完毕后,点击“Graph Management”,Cacti会显示所有创建的图形,在“Filter by host”的下拉菜单中选择刚才我们填加的服务器。
图17:选择服务器
勾选所有图形信息,然后添加到刚才创建的“Graph Trees”中的名称。
图18:确认添加
单击“yes”添加。
图19:显示监控图形
点击“Graph”查看监控图形。
图20:显示服务器监控图形
不出意外的话,将会显示监控图片的信息。配置到这步,添加的主机应该可以正常工作了,如果觉得图形数据更新有些慢,可以手动执行前面crontab中定义的内容
linux:~ # php /srv/www/htdocs/cacti/poller.php
08/05/2006 12:36:27 PM - SYSTEM STATS: Time:1.3777 Method:cmd.php Processes:1 Threads:N/A Hosts:2 HostsPerProcess:2 DataSources:11 RRDsProcessed:10
OK u:0.00 s:0.03 r:0.06
OK u:0.00 s:0.03 r:0.07
OK u:0.00 s:0.03 r:0.07
OK u:0.00 s:0.03 r:0.07
OK u:0.00 s:0.03 r:0.07
OK u:0.00 s:0.03 r:0.07
OK u:0.00 s:0.03 r:0.07
OK u:0.00 s:0.03 r:0.08
OK u:0.00 s:0.03 r:0.08
OK u:0.00 s:0.04 r:0.08
linux:~ #
五、监控远程局域网
我们的服务器分布在全国各地,而且有的机房中是一台服务器带多台后台服务器,由于只有一个公网IP,所以远程内网的机器信息是无法直接获取的,如果想实现真正的全网监控,前面的配置无法满足要求。不过不用担心,强大的NET-SNMP已经考虑到这一点了,通过snmp v3的代理功能可以完成这项工作。
代理的涵义很简单,如下图所示。
图21:获取远程局域网信息
实现代理功能需要对代理服务器和内网服务器分别配置。我们先来配置代理服务器。
(1)创建用户
创建一个名为snmpuser的用户,设置验证密码为“TESTADMIN”,并设置为只读模式。密码不能少于8位字符。添加用户前,要关闭snmp服务进程服务。
linux:~ # net-snmp-config --create-snmpv3-user -ro -a " TESTADMIN " snmpuser
adding the following line to /var/lib/net-snmp/snmpd.conf:
createUser snmpuser MD5 "TESTADMIN" DES
adding the following line to /usr/share/snmp/snmpd.conf:
rouser snmpuser
linux:~ #
(2)配置文件
添加完用户后,就可以配置snmpd.conf了。
linux:~ # cat /etc/snmpd.conf
rouser snmpuser auth # 设置snmpuser为只读用户,并设置认证
proxy -Cn 100.hatest01 -v3 -u snmpuser -l authNoPriv -a MD5 -A TESTADMIN 172.16.0.100 .1.3
# 100.hatest01为自定义名称,172.16.0.100是监控的内网服务器的IP,如果有多台机器,可依次添加。“.1.3”代表可访问内网服务器的OID范围
view all included .1 80 # 设置访问代理服务器OID的权限
其它的一些配置可以参考前面SNMPv1的内容,如:磁盘空间,执行脚本等。配置无误后,启动snmp进程服务。
linux:~ # rcsnmpd start
Starting snmpd done
linux:~ #
配置内网服务器:
(1)添加用户(关闭snmp服务)
必须和代理服务器用户信息内容一致。
linux:~ # net-snmp-config --create-snmpv3-user -ro -a " TESTADMIN " snmpuser
adding the following line to /var/lib/net-snmp/snmpd.conf:
createUser snmpuser MD5 " TESTADMIN " DES
adding the following line to /usr/share/snmp/snmpd.conf:
rouser snmpuser
linux:~ #
(2)配置文件
rouser snmpuser auth
view all included .1 80
启动snmp:
linux:~ # rcsnmpd start
Starting snmpd done
linux:~ #
测试方法:
访问代理服务器:
linux:~# snmpwalk -v3 -u snmpuser -l authNoPriv -a MD5 -A TESTADMIN 172.16.0.210 .1.3.6.1.4.1.2021
上述参数请参阅相关帮助文档。
访问后台监控机器:
linux:~# snmpwalk -n 100.hatest01 -v3 -u snmpuser -l authNoPriv -a MD5 -A TESTADMIN 172.16.0.210 .1.3.6.1.4.1.2021
访问内网的服务器只要多增加一个参数“-n”即可,100.hatest01是前面代理服务器snmp配置文件中设定的内网服务器名。如果有多台,可依次添加。
通过命令行我们已经成功的获取远程局域网服务器的信息了,下面就通过Cacti来创建监控图形。先来添加代理服务器。步骤和上面添加设备的一样。
图22:添加代理服务器
根据配置文件输入图22的信息,然后点击“Create”。
图23:添加成功
创建图形以及图形分类的操作和前面的配置方法一样。接着添加远程局域网的服务器。
图24:添加远程内网服务器
刚开始我使用Cacti添加远程局域网服务器时,始终无法成功,因为不知道如何填写“Hostname”,还有就是多了一个参数“-n”。但是经过我不懈的努力、尝试,还分析了Cacti的源代码,终于让我找到了解决方法。
通过这个方法,彻底实现了全网的服务器监控。图中“SNMP username”的信息非常重要,只有这种形式才能正常的获取远程局域网服务器信息。还有“Hostname”要填写代理服务器的IP地址。
六、Cacti高级配置
snmp配置环节中,我们自定义了一些OID值,但在Cacti的模板中不存在这些图形,所以需要我们自己来制作模板,这项操作不仅可以把所有数据源画在一张图表上,而且便于管理。
现在我们就以前面snmpd.conf配置文件中的指令“exec”新创建的OID 1.3.6.1.4.1.2021.53作为实例,将该OID作为模板的数据源。
图25:创建数据模板(1)
首先,点击图25“Data Templates”
图26:创建数据模板(2)
参考如下内容来填写,其它值保持默认。
Name 第一个Name是模板的名称,可自定义设置
Name 第二个Name,“host_description”用来显示主机的IP地址,Test是新创建的模板名
Data Input Method 获取数据的方法,选择“Get SNMP Data”
Internal Data Source Name 数据源值的名称“Test”
Minimum和Maximum这两个值如果不填写表示使用数据源的最大和最小值作为图形的上、下限值
Data Source Type 选择“COUNTER”
图27:设置OID
输入OID值,这一步是定义数据源最关键的一个环节,不仅要确认OID真实存在而且保证是一个数值才行。点击“save”保存数据源。
图28:创建图形模板
为新的数据源创建图形模板。这部分仅设置两个值,其它默认不变。点击“create”
图29:添加数据源
当图形模板创建完毕后。下面就需要用前面定义的数据源创建我们需要显示的图形了。一个数据源至少需要定义四个数据值,分别是“区域图”、“当前值”、“平均值”和“最大值”,这些值分别显示了系统不同时段的图形状态。点击“Add”添加。
图30:创建数据区域
参考下列信息填写:
Data Source 选择定义的数据源模板
Color 只有“Graph Item Type”图形类型选择的是AREA, STACK, LINE1, LINE2, LINE3其中之一,才能够为数据源选择颜色。
Graph Item Type 定义图形的模板类型,因为是首个图形模板,所以要选择“AREA”。
Text Format 定义一个显示名称
其它的数值保持默认,点击“create”。
图31:当前值图形
再次点击“Add”,创建当前运行值。
Data Source 选择“Test”
Graph Item Type 选择“GPRINT”图形类型,只有这个类型才能定义当前、平均和最大值,具体可查看图35。
Consolidation Function 选择“LAST”,表示当前运行的值
Text Format 定义图表中显示的名称
图32:平均值图形
创建平均值时,只需修改“Consolidation Function”和“Text Format”的内容即可。
图33:最大值图形
创建最大值,也是修改“Consolidation Function”和“Text Format”的内容,不过多了一项“Insert Hard Return”,表示插入一个硬回车,这是为了和其它新创建的图形不要重叠显示在一起。
图34:第二数据源
选择插入硬回车后,说明一个图形模板定义完成,可以继续在新图形模板中加入数据源。创建方法同上,只是注意要修改第一个图形类型为“STACK”,如图34,只有这样才能将所有数据源画在一张图表上。
图35:已创建的图形模板
图35中将两个数据源画在一张图表上。接下来可将新创建的图形模板添加到存在的模板中,这些工作很简单,我就不再多说。到目前为止,基于Cacti的监控、显示全部配置完成,但是还不具备报警功能,所以,下面就跟我来用一些简单的Shell程序实现报警功能吧。
七、监控报警Shell程序
虽然监控系统已经正常工作,但我们不可能时时刻刻都盯着这些图表,为了使监控工作自动化,我们可以通过下面的脚本程序来完成一些简单的报警工作。编写脚本前,先要启动mail服务器进程,因为报警是通过邮件的。SuSE系统的默认安装的是Postfix,直接启动即可,无须修改配置文件。
linux:~ # rcpostfix start
Starting postfix done
linux:~ #
创建脚本:
linux:~ # mkdir -p /etc/shell # 创建目录
linux:~ # touch /etc/shell/snmp-disk.sh # 生成文件
linux:~ # chmod 755 /etc/shell/snmp-disk.sh # 设置权限
linux:~ # cat /etc/shell/snmp-disk.sh
#!/bin/sh
disk=5 # 监控的磁盘空间数量
up=95 # 设置的阀值,超过将报警
ip="168.168.20.221 168.168.20.220 xxx.xxx.xxx.xxx" # 监控的所有目标服务器IP地址
for k in $ip
do
{
dir=`snmpwalk -v 1 -c fqofviqasdfasdfqer984rlks $k 1.3.6.1.4.1.2021.9.1.2|awk '{print $4}'`
# 获取远程主机磁盘目录名
n=1
while [ $n -lt $disk ]
do
{
for i in $dir
do
{
num=`snmpwalk -v 1 -c fqofviqasdfasdfqer984rlks $k 1.3.6.1.4.1.2021.9.1.9.$n|awk '{print $4}'`;
# 获取远程主机磁盘空间容量
if [ $num -gt $up ]
then
echo "服务器 $k 的 \"$i\" 磁盘分区已达$num%,请检查!" | mail -s $k服务器磁盘$i空间已达$num% alex.li@haoxi.com
# 当磁盘空间容量超过设定的阀值时,系统将给指定地址发送电子邮件报警
fi
n=`echo $n+1|bc`; # 累加操作,然后循环再判断其它分区
}
done
}
done
}
done
程序编写无误后,接下来设定crontab定时任务,配置程序的执行时间。
linux:~ # crontab -e
30 0 * * * /bin/bash /etc/mrtg/snmp-disk.sh
# 每天凌晨0点30分执行这个脚本,注意:bash命令要使用绝对地址才能正常运行
如果需要增加监控的次数,可修改crontab设置。虽然这个脚本可以实现邮件报警,但如果我们在“梦中”(睡觉)或看不到邮件就无法收到服务器的报警信息了,一直想通过WAP来实现短信报警的功能,但是没有时间做,而且现在又找到了新工作,呵呵!希望哪位WAP高手有兴趣来试试。通过snmp协议还可以监控到更多的信息,这段小程序仅仅起到一个抛砖引玉的作用,希望大家多多研究,打造出安全、高效的监控、报警系统。因为只有想不到的,而没有做不到的。
八、排错
Cacti在使用过程中有时会遇到一些大大小小的问题,我总结了一下,希望对您有所帮助。
(1)如果无法收到邮件,请检查linux系统上的邮件服务是否启动;
(2)远程机器的snmp数据无法取到时,请先检查snmp服务是否开启,然后查看防火墙配置是否有限制;
(3)当发现无法更新Cacti数据时,查看一下磁盘空间是否已满
这套监控系统我已经安装、配置无数遍了,其中走了不少弯路,如果您是跟着本文中的配置一步步来的,那么,一遍就足够了,除非您想多练习几遍。当您决定要将这些内容配置在真正的应用环境时,我建议按照如下的步骤来做:
确定监控主机数量。监控广域网的服务器是件比较麻烦的事,尤其是在服务器数量庞大、监控信息多、地理位置不同的环境中。如果一台监控服务器不够,可以配置多台来分担负载。
确定要监控的信息。如果将每个信息画成一个图,那么看一遍,估计也头晕眼花了,更别说分析了,确定监控信息的数量主要是考虑到制作成模板,然后将这些数据源整合在一张图表中。
确定snmpd.conf的内容。snmp的配置内容要经过反复测试后,再去修改所有服务器,最好几个系统管理员加上老总开个会,呵呵,这可不是开玩笑,如果有上百台服务器,全部改一遍是很麻烦的,别忘了还有snmp中运行脚本的内容。
如果由一个系统管理员监控所有服务器,肯定是不切合实际的,毕竟一个人的能力有限。通过Cacti的安全配置可以将这些监控工作分配给每一个普通用户,至于如何设置,就由您自己在Cacti配置界面上找找吧。
最后一点就是实施了,因为每个人的习惯不同,所以最好由一个人去修改,虽然累了些,但在后期的维护中将会避免很多麻烦
附录:
SNMP的相关命令使用方法:
snmpdelta 一直监视SNMP变量中的变化
linux:~ # snmpdelta -c public -v 1 -Cs -CT localhost IF-MIB:ifInUcastPkts.3 IF-MIB:ifOutcastPkts.3
localhost ifInUcastPkts.3 ifOutUcastPkts.3
[20:15:59 6/14] 184.00 184.00
[20:16:00 6/14] 158.00 158.00
[20:16:01 6/14] 184.00 184.00
[20:16:02 6/14] 184.00 184.00
[20:16:03 6/14] 158.00 158.00
[20:16:04 6/14] 184.00 184.00
[20:16:05 6/14] 184.00 184.00
[20:16:06 6/14] 158.00 158.00
snmpdf 通过SNMP监视远程主机的磁盘空间
linux:~ # snmpdf -v 1 -c public localhost
Description size (kB) Used Available Used%
0 0 0 0%
Real Memory 0 0 0 0%
Swap Space 0 0 0 0%
/ 5734988 2462884 3272104 42%
/dev/shm 138472 8 138464 0%
/media/cdrecorder 0 0 0 0%
/media/floppy 0 0 0 0%
/proc/bus/usb 0 0 0 0%
linux:~ #
snmpget 从一个代理得到一个SNMP变量的值
linux:~ # snmpget -v 1 -c public localhost 1.3.6.1.4.1.2021.2.1.5.1
UCD-SNMP-MIB::prCount.1 = INTEGER: 6
linux:~ #
snmpgetnext 从序列中获得下一个变量
linux:~ # snmpgetnext -v 1 -c public localhost 1.3.6.1.4.1.2021.2.1.5.1
UCD-SNMP-MIB::prErrorFlag.1 = INTEGER: 0
linux:~ #
snmpset 设置代理上的一个SNMP变量
linux:~ # snmpset -c private -v 1 test-hub system.sysContact.0 s dpz@noc.rutgers.edu ip.ipforwarding.0 = 2
snmptable 得到一个SNMP变量表
linux:~ # snmptable -c public -v 1 localhost 1.3.6.1.2.1.1.1
Was that a table SNMPv2-MIB::system
linux:~ #
snmptranslate 搜索并说明MIB结构中的OID
linux:~ # snmptranslate -On -IR sysDescr
.1.3.6.1.2.1.1.1
linux:~ #
snmptrap 生成一次trap告警
linux:~ # snmptrap -v 1 -c public manager enterprises.spider test-hub 3 0 '' interfaces.iftable.ifentry.ifindex.1 i 1
snmpwalk 从某个特定的OID开始遍历MIB
linux:~ # snmpwalk -v 1 -c public localhost 1.3.6.1.4.1.2021.2
UCD-SNMP-MIB::prIndex.1 = INTEGER: 1
UCD-SNMP-MIB::prNames.1 = STRING: httpd2-prefork
UCD-SNMP-MIB::prMin.1 = INTEGER: 0
UCD-SNMP-MIB::prMax.1 = INTEGER: 0
UCD-SNMP-MIB::prCount.1 = INTEGER: 6
UCD-SNMP-MIB::prErrorFlag.1 = INTEGER: 0
UCD-SNMP-MIB::prErrMessage.1 = STRING:
UCD-SNMP-MIB::prErrFix.1 = INTEGER: 0
UCD-SNMP-MIB::prErrFixCmd.1 = STRING:
linux:~ #
转载:http://blogold.chinaunix.net/u1/42200/showart.php?id=328263