Cacti をインストールする

cacti を使うとサーバやネットワーク機器などの情報を収集し、結果をグラフ化することが出来ます。

一般的には SNMP で収集した値をグラフ化しますが、スクリプトで取得した値をグラフ化することも出来ますから、実質的にはどんな値でもグラフ化することが出来ます。今回は CentOS 5 x86_64 に cacti をインストールします。

yum リポジトリへ RPMforge を追加する

cactiCentOSRPM パッケージは PRMforge で配布されています。まず、RPMforge を yum リポジトリへ追加します。

$ wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.1-1.el5.rf.x86_64.rpm
$ sudo rpm -ivh --test rpmforge-release-0.5.1-1.el5.rf.x86_64.rpm

必要パッケージのインストール

次に yumcacti をインストールします。"yum install cacti" するだけでは Snmpwalk などのユーティリティ(net-snmp-utils)と MySQL サーバ(mysql-server)がインストールされない為、明示的にパッケージを指定します。

$ sudo yum -y install cacti net-snmp-utils mysql-server

私の環境では以下のパッケージがインストールされました。

  1. cacti.noarch 0:0.8.7g-2.el5.rf
  2. httpd.x86_64 0:2.2.3-43.el5.centos.3
  3. libdbi.x86_64 0:0.8.1-2.1
  4. lm_sensors.x86_64 0:2.10.7-9.el5
  5. lua.x86_64 0:5.1.4-2.el5.rf
  6. mysql-server.x86_64 0:5.0.77-4.el5_5.4
  7. mysql.x86_64 0:5.0.77-4.el5_5.4
  8. net-snmp-libs.x86_64 1:5.3.2.2-9.el5_5.1
  9. net-snmp-utils.x86_64 1:5.3.2.2-9.el5_5.1
  10. net-snmp.x86_64 1:5.3.2.2-9.el5_5.1
  11. perl-DBD-MySQL.x86_64 0:3.0007-2.el5
  12. perl-DBI.x86_64 0:1.52-2.el5
  13. perl-rrdtool.x86_64 0:1.4.4-1.el5.rf
  14. php-cli.x86_64 0:5.1.6-27.el5_5.3
  15. php-common.x86_64 0:5.1.6-27.el5_5.3
  16. php-mysql.x86_64 0:5.1.6-27.el5_5.3
  17. php-pdo.x86_64 0:5.1.6-27.el5_5.3
  18. php-snmp.x86_64 0:5.1.6-27.el5_5.3
  19. php.x86_64 0:5.1.6-27.el5_5.3
  20. rrdtool.x86_64 0:1.4.4-1.el5.rf
  21. ruby-libs.x86_64 0:1.8.5-5.el5_4.8
  22. ruby.x86_64 0:1.8.5-5.el5_4.8
  23. xorg-x11-fonts-Type1.noarch 0:7.1-2.1.el5

NET-SNMP の設定

cacti で監視対象にするサーバに SNMP エージェント(NET-SNMP)の設定を行います。NET-SNMP の設定ファイルは /etc/snmp/snmpd.conf です。これを以下のように設定しておきます。今回は cacti のインストールが目的ですので、詳細は省きます。

com2sec local localhost      public
com2sec mynet 192.168.1.0/24 public

group mygroup v1 local
group mygroup v1 mynet

view all included .1 80

access mygroup "" any noauth exact all none none

設定が完了したら、SNMP エージェントを起動します。

$ sudo /etc/init.d/snmpd start
Starting snmpd:                                            [  OK  ]
$ sudo /sbin/chkconfig snmpd on

MySQL サーバの設定

MySQL サーバを起動します。しかし、"show variables like 'character_set_%';" で確認すると、デフォルトの状態では文字コードが latin1 となっています。

$ sudo /etc/init.d/mysqld start
Starting MySQL:                                            [  OK  ]
$ mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 28
Server version: 5.0.77 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show variables like 'character_set_%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     | 
| character_set_connection | latin1                     | 
| character_set_database   | latin1                     | 
| character_set_filesystem | binary                     | 
| character_set_results    | latin1                     | 
| character_set_server     | latin1                     | 
| character_set_system     | utf8                       | 
| character_sets_dir       | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

mysql> quit
Bye

日本語の扱いを考慮して、MySQL が利用する文字コードUTF-8 へ変更します。MySQL の設定ファイルは /etc/my.cnf ですが、デフォルトでは以下のようになっていました。

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1

# Disabling symbolic-links is recommended to prevent assorted security risks;
# to do so, uncomment this line:
# symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

mysqld セクションへ "init_connect", "default-character-set" を追加し、mysql セクションはまるごと追加します。

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
init_connect='SET NAMES utf8'
default-character-set=utf8

# Disabling symbolic-links is recommended to prevent assorted security risks;
# to do so, uncomment this line:
# symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[mysql]
default-character-set=utf8

設定が完了したら MySQL サーバを再起動します。

$ sudo /etc/init.d/mysqld restart
Stopping MySQL:                                            [  OK  ]
Starting MySQL:                                            [  OK  ]

再度、MySQL サーバへ接続し、文字コードUTF-8 になっていることを確認します。

$ mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.0.77 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show variables like 'character_set_%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       | 
| character_set_connection | utf8                       | 
| character_set_database   | utf8                       | 
| character_set_filesystem | binary                     | 
| character_set_results    | utf8                       | 
| character_set_server     | utf8                       | 
| character_set_system     | utf8                       | 
| character_sets_dir       | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

mysql> quit
Bye

次に cacti 用の DB を作成します。

$ mysqladmin --user=root create cacti
$ mysql --user=root cacti < /var/www/cacti/cacti.sql 
$ mysql --user=root mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 26
Server version: 5.0.77 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> grant all on cacti.* to cactiuser@localhost identified by 'cactiuser';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> quit
Bye

ここまでで問題無いようであれば、Linux の起動と共に、自動的に MySQL サーバが起動するよう設定しておきます。

$ sudo /sbin/chkconfig mysqld on

Spine(旧 Cactid)のインストール

cacti をインストールすると、cacti 自身を定期実行させる為に cron へ以下のように設定されます。

$ sudo cat /etc/cron.d/cacti
*/5 * * * *     cacti   php /var/www/cacti/poller.php &>/dev/null

登録ノード数(=監視対象数)が増えてくると上記の "poller.php" では 5 分以内に全ノードの情報収集を終えることが出来ず、上手く監視が出来なくなってしまう場合があります。こういった場合は poller.php よりも、よりパフォーマンスの良い Spine を使うことが出来ます。Spine も yum を使って簡単にインストールすることが出来るのですが・・・

$ sudo yum -y install cacti-spine

現時点で RPMforge から提供されている Spine のパッケージを使うと、実際に cacti から Spine を使って情報収集をする際、以下のようなエラーが出てしまいました。

12/11/2010 11:40:01 PM - SPINE: Poller[0] ERROR: SNMP Library Version Mismatch (5.3.1 vs 5.3.2.2) (Spine parent)

上記のようなエラーが発生する為、今回は RPMforge 提供の RPM パッケージは用いず、cacti 公式サイトで配布されている Spine のソースコードからコンパイルすることにしました。公式ページの Compiling Spine for Redhat/Fedora Linux によると、Spine をコンパイルする以前に以下のパッケージをインストールする必要があるとのことでした。

  1. net-snmp-devel
  2. mysql
  3. mysql-devel
  4. openssl-devel

今回の環境では mysql-devel と net-snmp-devel が不足していた為、これらのパッケージをインストールしておきます。

$ sudo yum -y install mysql-devel net-snmp-devel

後はソースコードをダウンロードし、コンパイルします。

$ wget http://www.cacti.net/downloads/spine/cacti-spine-0.8.7g.tar.gz
$ tar zxvf cacti-spine-0.8.7g.tar.gz
$ cd cacti-spine-0.8.7g
$ ./configure
$ make

最後に、コンパイルしたバイナリと設定ファイルを適切なディレクトリに配置して Spine は準備完了です。

$ sudo cp spine /usr/bin/
$ sudo cp spine.conf.dist /etc/spine.conf

Apache の設定

cacti の公開用ディレクトリは /etc/httpd/conf.d/cacti.conf として、以下のように定義されています。

$ cat /etc/httpd/conf.d/cacti.conf
Alias /cacti/ /var/www/cacti/
<Directory /var/www/cacti/>
    DirectoryIndex index.php
    Options -Indexes
    AllowOverride all
    order deny,allow
    deny from all
    allow from 127.0.0.1
    AddType application/x-httpd-php .php
    php_flag magic_quotes_gpc on
    php_flag track_vars on
</Directory>

上記のままでは "allow from 127.0.0.1" となっており、ローカルホストからしcacti にアクセス出来ません。そこで、新たに cacti からのアクセスを許可したいアドレスを追加します(今回は "allow from 192.168.1." を追加することで、192.168.1.0/24 のネットワークからのアクセスを許可しました)

Alias /cacti/ /var/www/cacti/
<Directory /var/www/cacti/>
    DirectoryIndex index.php
    Options -Indexes
    AllowOverride all
    order deny,allow
    deny from all
    allow from 127.0.0.1
    allow from 192.168.1.
    AddType application/x-httpd-php .php
    php_flag magic_quotes_gpc on
    php_flag track_vars on
</Directory>

設定が完了したら Apache を再起動します。Apache をデフォルト設定のまま使っており、ServerName が未定義の為、警告が出ていますが、今回はこのまま cacti の設定を進めます。更に、ApacheLinux 起動時に立ち上がるよう、設定しておきます。

$ sudo /etc/init.d/httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
                                                           [  OK  ]
$ sudo /sbin/chkconfig httpd on

iptables の設定

ここまでの設定で cacti は「http:// サーバのアドレス /cacti」でアクセス出来るはずですが、ApacheTCP/80 を Listen しているにもかかわらず、他端末のブラウザから cacti へアクセス出来ない場合は /etc/httpd/conf.d/cacti.conf 内の Allow from 設定が誤っている以外に、iptable によって通信が拒否(Reject)されている可能性があります。私の環境では iptables の設定ファイルである /etc/sysconfig/iptables は以下のようになっており、TCP/80 が許可されていませんでした。

# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT

下から二行目に "-j REJECT" とある行より上に以下の定義を加えることで TCP/80 を許可します。

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

同様に、対象ホストを SNMP エージェントとして動作させる場合は UCP/161 も許可しておきます。

-A RH-Firewall-1-INPUT -p udp --dport 161 -j ACCEPT

変更が完了したら iptables を再起動し、変更を反映します。

$ sudo /etc/init.d/iptables restart

初期設定

ここまでの準備が万全であれば、cacti が利用出来る状態になっているはずです。ブラウザで「http:// 〜 サーバのアドレス /cacti/」にアクセスすると以下のような初期画面が表示されますので、"Next" をクリックします。

インストールの種類を聞かれます。新規インストールなので "New Install" を選択したまま、"Next" をクリックします。

cacti が必要とする、各種ツールが適切なパスに配置されているか、確認します。もし、ツールが見つからない場合は赤字で "NOT FOUND" と表示されます。今回は全て緑字で "FOUND" となっていますので、このまま "Finish" をクリックします。

いよいよ cacti のログイン画面になります。初期設定では User Name と Password のいずれも "admin" ですので、User Name と Password に "admin" と入力し、"Login" ボタンをクリックします。

初回のログイン時のみ、強制的にパスワードの変更を促されます。任意のパスワードを設定します。


バイスの登録

これで cacti にログイン出来たはずです。ログイン直後は以下のような画面が表示されているはずです。

監視対象を新規登録するには左側の Management メニューから "Devices" をクリックします。

登録済み監視対象の一覧が表示されます。初期状態では localhost のみです。右上の "Add" をクリックして次へ進みます。

これから監視対象として登録する機器の情報を入力します。最低限、以下が入力に正しい値が入力されていれば次へ進めます。

Description
分かりやすい名称を入力します(表示名として利用されるだけなので、実際のホスト名と異なっても構いません)
Hostname
DNS で名前解決出来るホスト名か、もしくは IP アドレスを入力します
Host Template
テンプレートを選択します。例えば、Cisco ルータの監視をするなら「Cisco Router」、Linux ホストなら「Local Linux Machine」といった具合に予め監視用のテンプレートが用意されていますので、適切なテンプレートを選択します。
Downed Device Detection
監視対象の死活を監視する方法を選択します。例えば、SNMPPing(ICMP)といった方法を選択することが出来ます
SNMP Version
監視対象の情報を SNMP で取得する際、利用する SNMP のバージョンを指定します
SNMP Community
SNMP のコミュニティ名を指定します

設定が完了したら "Create" をクリックします。

"Save Successful." と表示され、監視対象が登録(保存)されました。"Create Graphs for this Host" をクリックし、次へ進みます。

次は監視対象機器からグラフ化する項目を選択します。例えば「CPU 使用率だけを監視する」「CPU 使用率とメモリ使用率を監視する」といった項目を選択します。今回は先ほどテンプレートに従って表示される全ての項目にチェックを入れ、次に進みます。

先ほど選択したテンプレートをベースに、グラフの色などを選択します。今回はデフォルトのまま "Create" をクリックして次へ進みます。

これでグラフが作成されました。しかし、グラフを作成しただけでは、"見る" ことが出来ません。左側のメニューから "Graph Trees" をクリックし、グラフをツリーに登録し、閲覧状態にする作業へ進みます。


グラフツリーへの登録

監視対象はツリーを作成し、ツリーごとに登録していくことが出来ます。今回は新規ツリーを作成せず、"Default Tree" をクリックして次へ進みます。

ツリーへ監視対象を追加するので、右上の "Add" をクリックします。

ツリーへ追加するアイテムを選択します。今回は Linux ホストを登録しますので、アイテムの種類は「ホスト」になります。

Tree Item Type
登録するアイテムの種類を選択します。ホストだけではなく、ホストに紐付かないグラフを登録することも可能です
Host
アイテムの種類として「ホスト」を選択した場合は、この項目で対象ホストを選択します

設定が完了したら "Create" をクリックします。

"Save Successful." と表示され、保存が完了します。画面上部のメニューから "Graph" を選択し、グラフ表示画面へ移行します。

左側には先ほど登録したツリーが表示され、更にそのツリーにぶら下がるように設定したホストが登録されているはずです。


Spine の設定

Poller を Spine に変更するには、まず左側の Configuration メニューから "Settings" をクリックします。

上部のメニューから "Paths" をクリックします。

"Alternate Poller Path" に Spine のパスを設定します。今回はソースコードからコンパイルして出来上がったバイナリを /usr/bin/spine にコピーしているので、そのまま "/usr/bin/spine" を指定し、"Save" をクリックします。

"Save Successful." と表示され、保存が完了します。"Alternate Poller Path" が「FOUND」ではなく、「NOT FOUND」になっている場合は Spine へのパス指定が誤っているので、指定した位置に Spine のバイナリが存在しているか、確認します。上部のメニューから "Poller" をクリックして次へ進みます。

Poller Type はデフォルトで "cmd.php" となっていますが、これを "spine" に変更し、"Save" をクリックします。

これで Spine の設定は完了です。