共计 8805 个字符,预计需要花费 23 分钟才能阅读完成。
在官网可以看到关于 Cacti 的下载说明 http://www.cacti.net/download_cacti.php
Download Cacti
The latest stable version is 0.8.8g, released 02/21/16.
Cacti requires MySQL, PHP, RRDTool, net-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.
Cacti 监控内网本机 TCP 连接状况 http://www.linuxidc.com/Linux/2016-08/133869.htm
CentOS 6.6 下 Cacti 安装部署 http://www.linuxidc.com/Linux/2015-11/125039.htm
CentOS7 下安装搭建 Cacti 详解 http://www.linuxidc.com/Linux/2017-03/141995.htm
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://www.linuxidc.com/Linux/2017-03/142000.htm 基于 NETSNMP 开发 mib 说明
http://www.linuxidc.com/Linux/2017-03/141999.htm 关于 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
注意:
(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
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 获取信息
PDF 文档可以到 Linux 公社资源站下载:
—————————————— 分割线 ——————————————
免费下载地址在 http://linux.linuxidc.com/
用户名与密码都是www.linuxidc.com
具体下载目录在 /2017 年资料 / 3 月 /21 日 /CentOS7 下 Cacti 0.8.8g 安装及 SNMP 简介 /
下载方法见 http://www.linuxidc.com/Linux/2013-07/87684.htm
—————————————— 分割线 ——————————————
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-03/141998.htm