图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.php08/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:10OK u:0.00 s:0.03 r:0.06OK u:0.00 s:0.03 r:0.07OK u:0.00 s:0.03 r:0.07OK u:0.00 s:0.03 r:0.07OK u:0.00 s:0.03 r:0.07OK u:0.00 s:0.03 r:0.07OK u:0.00 s:0.03 r:0.07OK u:0.00 s:0.03 r:0.08OK u:0.00 s:0.03 r:0.08OK u:0.00 s:0.04 r:0.08linux:~ #五、监控远程局域网我们的服务器分布在全国各地,而且有的机房中是一台服务器带多台后台服务器,由于只有一个公网IP,所以远程内网的机器信息是无法直接获取的,如果想实现真正的全网监控,前面的配置无法满足要求。不过不用担心,强大的NET-SNMP已经考虑到这一点了,通过snmp v3的代理功能可以完成这项工作。代理的涵义很简单,如下图所示。图21:获取远程局域网信息实现代理功能需要对代理服务器和内网服务器分别配置。我们先来配置代理服务器。(1)创建用户创建一个名为snmpuser的用户,设置验证密码为“TESTADMIN”,并设置为只读模式。密码不能少于8位字符。添加用户前,要关闭snmp服务进程服务。linux:~ # net-snmp-config --create-snmpv3-user -ro -a " TESTADMIN " snmpuseradding the following line to /var/lib/net-snmp/snmpd.conf:createUser snmpuser MD5 "TESTADMIN" DESadding the following line to /usr/share/snmp/snmpd.conf:rouser snmpuserlinux:~ #(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 startStarting snmpd donelinux:~ #配置内网服务器:(1)添加用户(关闭snmp服务)必须和代理服务器用户信息内容一致。linux:~ # net-snmp-config --create-snmpv3-user -ro -a " TESTADMIN " snmpuseradding the following line to /var/lib/net-snmp/snmpd.conf:createUser snmpuser MD5 " TESTADMIN " DESadding the following line to /usr/share/snmp/snmpd.conf:rouser snmpuserlinux:~ #(2)配置文件rouser snmpuser authview all included .1 80启动snmp:linux:~ # rcsnmpd startStarting snmpd donelinux:~ #测试方法:访问代理服务器: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 startStarting postfix donelinux:~ #创建脚本: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/shdisk=5 # 监控的磁盘空间数量up=95 # 设置的阀值,超过将报警 ip="168.168.20.221 168.168.20.220 xxx.xxx.xxx.xxx" # 监控的所有目标服务器IP地址for k in $ipdo{dir=`snmpwalk -v 1 -c fqofviqasdfasdfqer984rlks $k 1.3.6.1.4.1.2021.9.1.2|awk '{print $4}'`# 获取远程主机磁盘目录名 n=1while [ $n -lt $disk ]do{for i in $dirdo{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 ]thenecho "服务器 $k 的 \"$i\" 磁盘分区已达$num%,请检查!" | mail -s $k服务器磁盘$i空间已达$num% # 当磁盘空间容量超过设定的阀值时,系统将给指定地址发送电子邮件报警 fin=`echo $n+1|bc`; # 累加操作,然后循环再判断其它分区}done}done}done程序编写无误后,接下来设定crontab定时任务,配置程序的执行时间。 linux:~ # crontab -e30 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.3localhost 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.00snmpdf 通过SNMP监视远程主机的磁盘空间linux:~ # snmpdf -v 1 -c public localhostDescription 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.1UCD-SNMP-MIB::prCount.1 = INTEGER: 6linux:~ #snmpgetnext 从序列中获得下一个变量linux:~ # snmpgetnext -v 1 -c public localhost 1.3.6.1.4.1.2021.2.1.5.1UCD-SNMP-MIB::prErrorFlag.1 = INTEGER: 0linux:~ #snmpset 设置代理上的一个SNMP变量 linux:~ # snmpset -c private -v 1 test-hub system.sysContact.0 s ip.ipforwarding.0 = 2snmptable 得到一个SNMP变量表 linux:~ # snmptable -c public -v 1 localhost 1.3.6.1.2.1.1.1Was that a table SNMPv2-MIB::systemlinux:~ #snmptranslate 搜索并说明MIB结构中的OIDlinux:~ # snmptranslate -On -IR sysDescr.1.3.6.1.2.1.1.1linux:~ #snmptrap 生成一次trap告警linux:~ # snmptrap -v 1 -c public manager enterprises.spider test-hub 3 0 '' interfaces.iftable.ifentry.ifindex.1 i 1snmpwalk 从某个特定的OID开始遍历MIBlinux:~ # snmpwalk -v 1 -c public localhost 1.3.6.1.4.1.2021.2UCD-SNMP-MIB::prIndex.1 = INTEGER: 1UCD-SNMP-MIB::prNames.1 = STRING: httpd2-preforkUCD-SNMP-MIB::prMin.1 = INTEGER: 0UCD-SNMP-MIB::prMax.1 = INTEGER: 0UCD-SNMP-MIB::prCount.1 = INTEGER: 6UCD-SNMP-MIB::prErrorFlag.1 = INTEGER: 0UCD-SNMP-MIB::prErrMessage.1 = STRING:UCD-SNMP-MIB::prErrFix.1 = INTEGER: 0UCD-SNMP-MIB::prErrFixCmd.1 = STRING:linux:~ #
#Cacti
该贴由system转至本版2014-9-9 23:19:48