彼岸船夫

我是一只菜鸟,在繁华城市独自飞翔,为生活有时候很迷茫,苦苦坚持在无烟沙场,期待渡船远方

Centos7 Cacti-0.8.8g安装及SNMP简介

在官网可以看到关于cacti的下载说明http://www.cacti.net/download_cacti.php

Download Cacti

The latest stable version is 0.8.8g, released 02/21/16.

Cacti requires MySQLPHPRRDToolnet-snmp, and a webserver that supports PHP such as Apache or IIS. Please see the requirements section of the manual for information on how to fulfill these requirements under certain operating systems. Please use the install guide for either Unix or Windows for information about installing Cacti.

0x01  安装前准备

下载最新源码后根目录下有cacti.sql文件,里面包含数据库语句,用于初始化cacti的数据库环境,但其中不包含数据库建立,所以需要手动建立数据库再导入

1、导入数据库语句,新建数据库用户

mysql> create database cacti;
Query OK, 1 row affected (0.01 sec)

mysql> grant all on cacti.* to 'cactiuser@localhost' identified by 'cactiuser'

2、登陆进入mysql,导入数据库语句。

mysql> source /usr/local/apache2/htdocs/cacti.sql

3、在include目录下有config.php,配置连接数据库的用户信息。可以按照这个内容对数据库配置,也可以自定义。

$database_type = "mysql";
$database_default = "cacti";
$database_hostname = "localhost";
$database_username = "cactiuser";
$database_password = "cactiuser";
$database_port = "3306";
$database_ssl = false;

4、建立一个普通用户用于获取数据,rra和log目录改成该用户,这个用户其实就是用于添加和执行计划任务

0x02  安装

安装cacti是通过网页进行,将cacti内所有文件解压到网页根路径即cacti的index.php在根路径下,访问http://IP(include/config.php里面的url路径设置没改动,自动跳转到http://IP/cacti/install/出现404错误,然后改$url_path = "/";再次访问http://IP,成功出现页面。

注意的是cacti安装默认跳转IP/install或者是IP/cacti/install,是在cacti的配置文件config.php设置的$url_path,没有取消注释就是跳转到IP/cacti/install,这个时候解压的文件夹名称对应上才可以。

在一次用yum搭建的lamp环境中访问http://IP时候,httpd的error_log出现了如下报错。

PHP Notice: A session had already been started - ignoring session_start() in /var/www/html/include/global.php on line 157

重启了httpd又无法重现这个问题,先放着

 

安装界面可以看到一堆东西缺少

[root@localhost htdocs]# yum install rrdtool         使用yum安装并查看相应组件的路径 

[root@localhost htdocs]# rpm -ql rrdtool
/usr/bin/rrdcached
/usr/bin/rrdcgi
/usr/bin/rrdcreate
/usr/bin/rrdinfo
/usr/bin/rrdtool

[root@localhost htdocs]# yum install net-snmp net-snmp-utils    

[root@localhost htdocs]# rpm -ql net-snmp-utils
/usr/bin/encode_keychange
/usr/bin/snmpbulkget
/usr/bin/snmpbulkwalk
/usr/bin/snmpdelta
/usr/bin/snmpdf
/usr/bin/snmpget
/usr/bin/snmpgetnext
/usr/bin/snmpinform
/usr/bin/snmpnetstat
/usr/bin/snmpset
/usr/bin/snmpstatus
/usr/bin/snmptable
/usr/bin/snmptest
/usr/bin/snmptls
/usr/bin/snmptranslate
/usr/bin/snmptrap
/usr/bin/snmpusm
/usr/bin/snmpvacm
/usr/bin/snmpwalk

按照向导安装完成

0x03  错误信息


首次登陆用户名和密码都是admin,但是首次登陆会强制要求改密码。

在根目录下还有一个 poller.php,添加计划任务,定期执行这个php脚本 ,注意的是你用哪个用户身份添加的计划任务要保证这个用户可以访问log和rra目录

但是因为其是单线程,所以功能较弱,官方推出spine替代

尝试用php解释器运行,发现一堆报错

[root@localhost cacti]# /usr/local/php/bin/php ./poller.php 

PHP Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in /usr/local/apache2/htdocs/cacti/lib/functions.php on line 482
03/07/2016 04:59:02 PM - SYSTEM STATS: Time:1.8146 Method:cmd.php Processes:1 Threads:N/A Hosts:2 HostsPerProcess:2 DataSources:5 RRDsProcessed:5

这个也被记录到日志中了

[root@localhost cacti]# tail log/cacti.log
03/07/2016 04:59:02 PM - SYSTEM STATS: Time:1.8146 Method:cmd.php Processes:1 Threads:N/A Hosts:2 HostsPerProcess:2 DataSources:5 RRDsProcessed:5

1、报错中可以看出这是因为php时区问题,/etc/php.ini文件中,将注释行;date.timezone改为date.timezone = Asia/Shanghai ,再次执行结果如下。

[root@localhost cacti]# /usr/local/php/bin/php ./poller.php
OK u:0.00 s:0.00 r:0.01
OK u:0.00 s:0.00 r:0.01
OK u:0.00 s:0.00 r:0.01
OK u:0.00 s:0.00 r:0.01
OK u:0.00 s:0.00 r:0.02
03/08/2016 01:03:10 AM - SYSTEM STATS: Time:0.1658 Method:cmd.php Processes:1 Threads:N/A Hosts:2 HostsPerProcess:2 DataSources:5 RRDsProcessed:5

2、snmp public 报错

注意cacti使用的community要和snmp对应

0x04  SNMP理解

 

SNMP为管理员提供了一个网管平台(NMS),又称为管理站,负责网管命令的发出、数据存储、及数据分析。被监管的设备上运行一个SNMP代理(Agent)),实现设备与管理站的SNMP通信。

每个SNMP从代理负责回答SNMP管理工作站(主代理)关于MIB定义信息的各种查询。简单来说,就是需要一个服务器程序(代理,agent)和一个客户机(管理器,manager)。而与直观上不同的是,SNMP的服务器端代表被管理的事物,而客户机端才是管理者。

其中MIB是以树状结构来组织数据的,每一个节点表示一个被管理的对象,如果没有在这个树上面,那就无法管理(获取信息)

在snmp协议的开始学习中,发现自己比较难理解的就是MIB库的作用。找了一些相关资料相关描述如下

  1、管理站与代理端通过MIB进行接口统一,MIB定义了设备中的被管理对象。管理站和代理都实现了相应的MIB对象,使得双方可以识别对方的数据,实现通信。管理站向代理申请MIB中定义的数据,代理识别后,将管理设备提供的相关状态或参数等数据转换为MIB定义的格式,应答给管理站,完成一次管理操作。

  2、管理信息库MIB:定义了设备上可以使用的管理信息。代理和管理站使用MIB作为统一的数据接口通信。管理信息库MIB指明了网络元素所维持的变量(即能够被管理进程查询和设置的信息)。

  3、厂商可以在产品(如路由器)中包含SNMP代理软件,并保证在定义新的MIB项目后该软件仍遵守标准。用户可以使用同一网络管理客户软件来管理具有不同版本的MIB的多个路由器。当然,一个没有新的MIB项目的路由器不能提供这些项目的信息。这里要提一下MIB中的对象{1.3.6.1.4.1},即enterprises(企业),其所属结点数已超过3000。例如IBM为11.3.6.1.4.1.2},Cisco为{1.3.6.1.4.1.9},Novell为{1.3.6.1.4.1.23}等。世界上任何一个公司、学校只要用电子邮件发往iana-mib@isi.edu进行申请即可获得一个结点名。这样各厂家就可以定义自己的产品的被管理对象名,使它能用SNMP进行管理。

  4、SNMP对于任何程序设计人员来说是特别易于理解的。总体的简化能够很好地把这个系统简化。一个网络设备以守护进程的方式运行SNMP代理,该守护进程能够响应来自网络的各种请求信息。该SNMP代理提供大量的对象标识符(OID-Object Identifiers)。一个OID是一个唯一的键值对。该代理存放这些值并让它们可用。一个SNMP管理器(客户)可以向代理查询键值对中的特定信息(就是Agent用MIB可以解析来自NMS的请求)

  从程序员的角度看,这和导入大量的全局变量没有多少区别。SNMP的OID是可读或可写的。尽管向一个SNMP设备写入信息的情况非常少,但它是各种管理应用程序用来控制设备的方法(例如针对交换机的可管理GUI)。SNMP中有一个基本的认证框架,能够让管理员发送公共名来对OID读取或写入的认证。绝大多数的设备使用不安全的公共名 "public" 。 SNMP协议通过UDP端口161和162进行通信的。

  注意,我还没有提到MIB!MIB的重要性被大大地夸大了。刚开始时,MIB显得非常复杂,但是它们其实非常简单。OID是数字的和全局的键值对。一个OID看起来和一个IPv6的地址很象(比如:1.3.6.1.2.1),并且不同的厂商有不同的前缀等信息。OID都非常长,使得人们难以记住,或者对他非常感冒。因此,人们就设计了一种将数字OID翻译为人们可读的格式。这种翻译映射被保存在一个被称为 “管理信息基础"(Management Infomation Base) 或MIB的、可传递的无格式文本文件(管理信息库)里。

  使用SNMP或者向SNMP设备查询,你不需要使用MIB,但是,如果没有MIB,你就得猜测你正在查看的数据是什么。某些情况下,不使用MIB也非常简单,例如查看主机名、磁盘使用率数字,或者端口状态信息。其他情况下,就非常困难了,这个时候使用MIB就非常有帮助。对于准备编写的应用程序来说,为了让用户避免妥当安装MIB带来的麻烦,而严格使用数字OID是并不是很少见的。

  安装一个MIB的动作,只是将他放置到你的SNMP客户端应用软件能够搜索到并进行上述翻译映射工作的某个位置而已。

  5、IETF规定的管理信息库MIB(由中定义了可访问的网络设备及其属性,由对象识别符(OID:Object Identifier)唯一指定。MIB是一个树形结构,SNMP协议消息通过遍历SNMP MIB树形目录中的节点来访问网络中的设备。

总结一下:我们可以通过NMS发送指令查询Agent的相关信息,可是怎么获得想要的信息呢,比如我想查询cpu,而不是磁盘,那要怎么标识呢?我的理解就是MIB里面的OID就是唯一标识,如果MIB里面没有这个OID那么NMS也就无法查到相关信息。即被监控主机上提供了怎样的MIB库就能对库里定义的信息进行监控,要是库中不包含就无法获取信息,因为无法解析请求

同样MID也记录了映射关系,我们要找一个人通常是知道这个人的名字而不是他的身份证号码(对应OID)

MIB也可以自行添加,关于自定义MIB的参考:

http://wenku.baidu.com/view/c3ebe8c008a1284ac8504346.html  基于NETSNMP开发mib说明

http://blog.csdn.net/shanzhizi/article/details/15340305  关于SNMP的MIB文件的语法简述

0x05  SNMP基本使用

要使用SNMP就要安装net-snmp 和net-snmp-utils 两个工具

打开/etc/snmp/snmpd.conf配置文件,发现除了四行步骤说明和下面几行,后面的都是注释,注释内容就是个使用步骤了,这里注意community(密码)。

 

1、snmpwalk

snmpwalk是一个SNMP小程序,它使用SNMP的GETNEXT(获取一个设备下所有子节点的信息)请求查询指定OID(SNMP协议中的对象标识)入口的所有OID树信息,并显示给用户

snmpwalk -v 1或2(代表SNMP版本) -c SNMP读密码 IP地址 OID(对象标示符)

(1) -v: 指定snmp的版本, 1或者2(2c);
(2) -c:    指定连接设备SNMP读密码;
(3) IP:    指定要walk的设备的IP地址;
(4) Oid:代表要获取设备的指标oid;

用法举例:

[root@localhost22 ~]# snmpwalk -v 2c -c public localhost .1.3.6.1.2.1.1.1
SNMPv2-MIB::sysDescr.0 = STRING: Linux localhost22 3.10.0-123.el7.x86_64 #1 SMP Mon Jun 30 12:09:22 UTC 2014 x86_64

http://blog.sina.com.cn/s/blog_54837cf301011607.html    SNMP中MIB2所有主要节点

注意:

(1)配置文件中的view定义了可以查看MIB库的哪些资源,如果发现查看不了就在配置文件添加view/,或者是community不对。

(2)返回一个OID时会包括一个数据类型,数据类型后的值有些会自动被解释。如上面的sysDescr.0

 

2、snmpget

snmpget是取具体的OID的值。(适用于OID值是一个叶子节点的情况,即没有子节点)

snmpwalk是针对该节点下面还有子节点的情况

 

3、snmptranslate

snmptranslate [OPTIONS] OID [OID]

将一个或者多个 SNMP OID 从文字名称格式转换为数字格式的程序[oid] 可以是数字格式或者文字格式。

注意!snmptranslate 可以直接将数字格式的 oid 转换为名称格式,但要把名称格式的 oid 转换为数字格式的 oid ,需要 -I 选项的配合。

[root@localhost22 ~]# snmptranslate tcp                                        //直接使用名称的情况
tcp: Unknown Object Identifier (Sub-id not found: (top) -> tcp)           

[root@localhost22 ~]# snmptranslate -IR tcp                                  //单独使用IR
TCP-MIB::tcp
[root@localhost22 ~]# snmptranslate -On -IR tcp                            //-On(输出数字格式的oid),使用 -IR(允许“随机”访问 MIB)
.1.3.6.1.2.1.6

[root@localhost22 ~]# snmptranslate .1.3.6.1.2.1.6                        //OID转名称
TCP-MIB::tcp

 

4、snmpnetstat

直接通过snmp获取网络状态

[root@localhost22 ~]# snmpnetstat -v 2c -c public -Can -Cp tcp localhost
Active Internet (tcp) Connections (including servers)
Proto   Local Address   Remote Address   (state)
tcp       *.22       *.*          LISTEN
tcp       *.3306     *.*          LISTEN
tcp      127.0.0.1.25   *.*          LISTEN
tcp      127.0.0.1.199   *.*          LISTEN
tcp       172.16.4.22.22 172.16.4.146.53945 ESTABLISHED

 

http://bbs.linuxtone.org/thread-6694-1-1.html   snmpd使用详解,这个文章写得还可以。

0x06  MIB文件简介

MIB路径 /usr/share/snmp/mibs/,选取一个mib文件打开如下:

首先就是一个MIB头,在头部使用BEGIN声明来开始MIB的定义,IMPORT用来从其他MIB库中提取信息,一般用来提取规范要求的内容。--是注释符号

SNMPv2-MIB DEFINITIONS ::= BEGIN

IMPORTS
MODULE-IDENTITY, OBJECT-TYPE, NOTIFICATION-TYPE,
TimeTicks, Counter32, snmpModules, mib-2
FROM SNMPv2-SMI
DisplayString, TestAndIncr, TimeStamp

FROM SNMPv2-TC
MODULE-COMPLIANCE, OBJECT-GROUP, NOTIFICATION-GROUP
FROM SNMPv2-CONF;

一些基本结构如下标注。

上图那个”子树对象标识符“失误打成了“子数”(⊙﹏⊙)

关键是::={}的内容,可以得知父子关系。

0x07  获取其他信息

1、查看/usr/share/snmp/mibs路径下的MIB库,简单的可以通过文件名判断,比如TCP-MIB,HOST-RESOURCES-MIB。

2、查看文件内的具体,找到如:tcp OBJECT IDENTIFIER ::= { mib-2 6 },可以获知tcp的OID为mib-2下的6,(即.1.3.6.1.2.1.6)

3、将OID添加到/etc/snmp/snmpd.conf配置文件下的view

4、重新加载服务systemctl reload snmpd

5、使用工具snmpwalk获取信息

 

posted on 2016-03-25 16:36  彼岸船夫  阅读(2865)  评论(0编辑  收藏  举报

导航