自動モニタリングツール「Cacti」でサーバーのリソースを監視する

 サーバーやネットワーク機器を管理する際によく使われるのが、機器のリソース情報をネットワーク経由で取得するためのSNMPというプロトコルだ。SNMPではある瞬間のリソース情報しか取得できないが、これらを一定間隔で収集することで、リソースの時間的変化を観測できる。本記事ではこのようなSNMP経由でのリソース情報収集に利用できるツール「Cacti」について紹介する。

シンプルで使い勝手が良いUIが特徴のCacti

 サーバーやネットワーク機器の情報を取得して表示する管理ツールにはさまざまなものがあるが、昔から使われていたツールの1つに「MRTG(Multi Router Traffic Grapher)」というものがある。MRTGはSNMPというプロトコルを使って対象機器からリソース情報を収集し、グラフなどを作成するソフトウェアだ。MRTGは取得したデータを管理する「RRDtool」というソフトウェアと組み合わせて使われるが、MRTGは古いソフトウェアということもあり、設定がやや難しい。そのため、近年ではMRTG以外のソフトウェアとRRDtoolを組み合わせてリソース監視を行うことが多い。今回紹介する「Cacti」もこのようなソフトウェアの1つだ。Cactiは監視設定をWebブラウザ上で行うことができるため使い勝手がよく、また設定項目も比較的シンプルなのが特徴だ。

 なお、本記事ではOSとしてRed Hat Enterprise Linux 6.4互換のCentOS 6.4を使用してインストールおよび使い方の解説を行っている。

Cactiのインストール

 CactiのバイナリパッケージはCentOS 6の標準リポジトリには含まれていないが、「Extra Packages for Enterprise Linux(EPEL)」というプロジェクトが提供するリポジトリから入手できる。EPELはRed Hatが支援しているFedoraプロジェクト傘下のプロジェクトで、RHELの公式パッケージリポジトリに含まれていないパッケージを提供するものだ。EPELのリポジトリを利用するには、次のようにしてepel-releaseパッケージをインストールすれば良い。

# rpm -ivh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-7.noarch.rpm

 すると/etc/yum.repos.dディレクトリ以下に「epel.repo」という設定ファイルが追加され、EPELリポジトリが利用可能となる。ただし、EPELリポジトリはデフォルトでは無効に設定されているため、このリポジトリに含まれているパッケージをインストールするには「–enablerepo=epel」オプション付きでyumコマンドを実行するか、/etc/yum.repos.d/epel.repoファイル内で「enabled=0」となっている部分を「enable=1」に変更してリポジトリを有効化する必要がある。

 たとえば、EPELリポジトリからCactiをインストールするには、以下のようにする。

# yum --enablerepo=epel install cacti

 このとき、Cactiが依存しているPHPやPHPモジュール、RRDtoolなども必要に応じて同時にインストールされる。また、CactiはデータベースにMySQLを、WebサーバーにはApache HTTP Serverを使用するので、これらについても利用できるよう設定しておこう。

 続いて、mysqlコマンドを使ってCactiが使用するデータベース関連の設定を行う。まず、「cacti」というデータベースを作成し、そのデータベースにアクセスできる「cactiuser」ユーザーを作成する。ここでは「cactiuser」というパスワードを指定しているが、実運用の際は適切なものに変更しておこう。

$ mysql -u root -p
 :
 :
mysql> CREATE DATABASE cacti;
Query OK, 1 row affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES 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> Bye

 次に、ここで設定したデータベース名およびユーザー名、パスワードを/etc/cacti/db.phpファイルの下記の個所に記述しておく。

/* make sure these values refect your actual database/host/user/password */
$database_type = "mysql";  ←使用するデータベース種別 = "mysql";  ←使用するデータベース種別 = "mysql";  ←使用するデータベース種別 = "mysql";  ←使用するデータベース種別
$database_default = "cacti";  ←データベース名 = "cacti";  ←データベース名 = "cacti";  ←データベース名 = "cacti";  ←データベース名
$database_hostname = "localhost";  ←ホスト名 = "localhost";  ←ホスト名 = "localhost";  ←ホスト名 = "localhost";  ←ホスト名
$database_username = "cactiuser";  ←データベース接続に使用するユーザー名 = "cactiuser";  ←データベース接続に使用するユーザー名 = "cactiuser";  ←データベース接続に使用するユーザー名 = "cactiuser";  ←データベース接続に使用するユーザー名
$database_password = "cactiuser";  ←データベース接続に使用するパスワード = "cactiuser";  ←データベース接続に使用するパスワード = "cactiuser";  ←データベース接続に使用するパスワード = "cactiuser";  ←データベース接続に使用するパスワード
$database_port = "3306";  ←データベース接続に使用するポート番号 = "3306";  ←データベース接続に使用するポート番号 = "3306";  ←データベース接続に使用するポート番号 = "3306";  ←データベース接続に使用するポート番号
$database_ssl = false;  ←データベース接続にSSLを使うか否か = false;  ←データベース接続にSSLを使うか否か = false;  ←データベース接続にSSLを使うか否か = false;  ←データベース接続にSSLを使うか否か

 続いて、Cactiのインストール時に/usr/share/doc/以下にインストールされるSQLスクリプトを使用して初期データベースを作成しておく。たとえばインストールされたCactiのバージョンが0.8.8aの場合、以下のようにする。

$ mysql -u cacti -p cacti < /usr/share/doc/cacti-0.8.8a/cacti.sql
Enter password:  ←cactiuserユーザーのパスワードを入力する

 /etc/httpd/conf.d/以下にはApache HTTP Server向けのCactiの設定ファイルがインストールされているので、こちらも確認しておこう。デフォルトではローカルホストからの接続のみを許可するようになっており、それ以外のホストからCactiの管理画面にアクセスしたい場合は設定の変更が必要だ。

$ less /etc/httpd/conf.d/cacti.conf

<Directory /usr/share/cacti/>
        <IfModule mod_authz_core.c>
                # httpd 2.4
                Require host localhost
        </IfModule>
        <IfModule !mod_authz_core.c>
                # httpd 2.2
                Order deny,allow      ←必要に応じてこの部分を書き換える
                Deny from all         
                Allow from localhost  
        </IfModule>
</Directory>

 設定を変更した場合は、それを反映させるためHTTPサーバーを再起動しておこう。

 また、Cactiはcronを使用して定期的なデータ取得を実行している。そのための設定ファイルが/etc/cron.d/cactiとしてインストールされているはずなので、これを編集して有効にしておこう。

*/5 * * * *    cacti   /usr/bin/php /usr/share/cacti/poller.php > /dev/null 2>&1  ←デフォルトではコメントアウトされているので、「#」を削除して有効にする

 最後にcronを再起動して設定を反映させておく。

# service cron restart

 以上でCactiのインストール作業は完了だ。

Cactiの初期設定

 続いて、Cactiの初期設定を行っていこう。

 Webブラウザで「http://<CactiをインストールしたサーバーのIPアドレス>/cacti/」にアクセスすると、「Cacti Installation Guide」という画面が表示される(図1)。

図1 「Cacti Installation Guide」という画面

 「Next」をクリックすると、続いてインストール方法を選択する画面が表示される(図2)。ここでは「New Install」を選択して「Next」をクリックすれば良い。

図2 インストール方法の選択画面

 最後に、Cactiが使用する各種コマンドのパス名を設定する画面が表示される(図3)。通常はデフォルトですべてのコマンドが適切に設定されているはずなので、そのまま「Finish」をクリックすれば良い。

図3 Cactiが使用する各種コマンドのパス名設定画面

 以上で初期設定は完了し、ログイン画面が表示される(図4)。ここで管理用の「admin」ユーザーでログインする。パスワードは「admin」に初期設定されている。

図4 Cactiのログイン画面

 ログインするとパスワードの変更を要求する画面となるので、適切なパスワードを入力して「Save」をクリックする(図5)。

図5 パスワードの変更画面

 すると、Cactiのメイン画面が表示される(図6)。

図6 Cactiのメイン画面

ローカルホストの監視

 Cactiでは、デフォルトでCactiがインストールされたサーバー(localhost)用の設定が作成されており、ロードアベレージおよびログインユーザー数、メモリの使用量、実行されているプロセス数について情報が取得されるようになっている。Cactiのコンソール画面で「graphs」タブをクリックすると、これらのグラフが表示されるはずだ(図7)。もしこれらが表示されない場合は、データ収集が実行されていない場合がある。正しくcronの設定がされているかを確認し、しばらく時間をおいてから再度チェックしてみよう。

図7 ローカルホストの監視グラフ

SNMPを利用してサーバーを監視する

 Cactiでは、SNMPを使用してネットワーク機器やサーバーからリソース情報を取得し、そのグラフを表示することができる。続いては、監視したいサーバーにSNMPエージェントをインストールしてリソースをグラフ表示する設定方法について説明しよう。

SNMPエージェントのインストール

 今回はUNIX/Linux環境において広く使われているSNMPエージェントである「Net-SNMP」を使用することとする。Net-SNMPはRed Hat Enterprise Linux(およびその互換OSであるCentOSなど)では「net-snpm」というパッケージで提供されており、yumコマンドでインストールできる。また、同時に動作確認などに使用できる関連ツールを含む「net-snmp-utils」パッケージもインストールしておく。

# yum install net-snmp net-snmp-utils

SNMPエージェントの設定

 SNMPエージェントの設定は、/etc/snmp/snmpd.confファイルで行う。以下では、192.168.100.0/24の範囲のIPアドレスから、「SfJPMag」というコミュニティ名でアクセスすることで、ホストに関するすべての情報を取得できるように設定を行っていく。コミュニティ名というのは認証を行うための文字列のことで、パスワードのようなものだ。

 詳しい設定項目については割愛するが、まずはアクセス制御に関する設定が必要だ(リスト1)。追加した個所は太字で示している。

リスト1 /etc/snmp/snmpd.confの変更個所(アクセス制御関連)
# -----------------------------------------------------------------------------

# Here is a commented out example configuration that allows less
# restrictive access.

# YOU SHOULD CHANGE THE "COMMUNITY" TOKEN BELOW TO A NEW KEYWORD ONLY
# KNOWN AT YOUR SITE.  YOU *MUST* CHANGE THE NETWORK TOKEN BELOW TO
# SOMETHING REFLECTING YOUR LOCAL NETWORK ADDRESS SPACE.

##       sec.name  source          community
#com2sec local     localhost       COMMUNITY
#com2sec mynetwork NETWORK/24      COMMUNITY
com2sec local   localhost       SfJPMag
com2sec mynetwork 192.168.100.0/24 SfJPMag

##     group.name sec.model  sec.name
#group MyRWGroup  any        local
#group MyROGroup  any        mynetwork
#
#group MyRWGroup  any        otherv3user
#...
group MyROGroup any mynetwork

##           incl/excl subtree                          mask
#view all    included  .1                               80
view all    included  .1                               80

## -or just the mib2 tree-

#view mib2   included  .iso.org.dod.internet.mgmt.mib-2 fc


##                context sec.model sec.level prefix read   write  notif
#access MyROGroup ""      any       noauth    0      all    none   none
#access MyRWGroup ""      any       noauth    0      all    all    all
access MyROGroup ""      any       noauth    0      all    none   none

 ここではアクセス・権限制御を行うためのセキュリティ名として「local」および「mynetwork」を用意している。これを設定しているのが「com2sec」行だ。

com2sec local   localhost       SfJPMag
com2sec mynetwork 192.168.100.0/24 SfJPMag

 セキュリティ名は接続元およびコミュニティ名の組み合わせを定義したもので、ここではlocalhostからの接続を「local」というセキュリティ名で、192.168.100.0/24からの接続を「mynetwork」というセキュリティ名で参照するよう指定している。コミュニティ名にはどちらも「SfJPMag」と指定しているが、実際に設定を行う場合は適切な文字列に置き換えてほしい。

 続いて、1つ以上のセキュリティ名をまとめた「グループ」を定義する。これは「group」行で定義できる。ここでは「MyROGroup」というグループに先ほど作成したmynetworkを所属させるよう設定している。

group MyROGroup any mynetwork

 このとき、セキュリティ名とともにSNMPの「セキュリティモデル」を指定する必要があるが、ここではすべてのセキュリティモデルを許可する「any」を指定している。

 「view」行ではSNMPで取得できる情報の範囲(ビュー)を定義できる。ここではすべてのデータにアクセスできる「all」というビューを定義している。

view all    included  .1                               80

 最後に「access」行でグループとビューの関連付けを行う。ここではMyROGroupにallというビューを関連付けている。これにより、すべての情報を認証無しで取得できるようになる。

access MyROGroup ""      any       noauth    0      all    none   none

 設定ファイルの編集が完了したら、snmpdを再起動して設定結果を反映させておく。

# service snmpd restart

 ファイアウォールの設定も行っておこう。SNMPではUDPの160番および161番ポートを使用するので、Cactiを実行させているサーバーからこれらのポートにアクセスできるよう設定しておく。

 最後に、正しく設定ができているかを確認するため、SNMPエージェントの動作確認を行う。以下のようにsnmpwalkコマンドを実行してみよう。

$ snmpwalk -v 1 <ホストのIPアドレス> -c <指定したコミュニティ名> system

 正しくSNMPエージェントが動作している場合、次のようにホストに関する情報などが出力として得られるはずだ。

SNMPv2-MIB::sysDescr.0 = STRING: Linux sata 2.6.32-279.5.2.el6.x86_64 #1 SMP Fri Aug 24 01:07:11 UTC 2012 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (33894843) 3 days, 22:09:08.43
SNMPv2-MIB::sysContact.0 = STRING: Root <root@localhost> (configure /etc/snmp/snmp.local.conf)
SNMPv2-MIB::sysName.0 = STRING: sata
SNMPv2-MIB::sysLocation.0 = STRING: Unknown (edit /etc/snmp/snmpd.conf)
 
 

監視対象のサーバーを追加する

 Cacti側で監視対象とするサーバーを追加するには、「Devices」画面で設定作業を行う(図8)。左サイドバーの「Devices」をクリックするとこの画面が表示されるので、右上に用意されている「Add」というリンクをクリックする。

図8 Devices画面

 すると「Devices [new]」という画面が表示されるので、ここで監視対象とするサーバーの情報を入力していく(図9)。

図9 「Devices [new]」画面

 「General Host Options」項目では、サーバーの説明(Description)やホスト名(Hostname)、使用するテンプレート(Host Template)などを指定する。Descriptionにはサーバー名などを、ホスト名には監視対象のホスト名もしくはIPアドレスを入力しておこう。また、あらかじめ用意された監視・グラフ設定を適用するテンプレートを利用することで、容易に設定を行うことが可能だ。テンプレートには複数が用意されているが、SNMPを使用した監視を行う場合は「ucd/net SNMP Host」を選択する。

 「Availability/Reachability Options」項目についてはとくに変更する必要は無い。また、「SNMP Options」ではSNMP関連の設定を行える。「SNMP Version」には使用するSNMPのバージョンを、「SNMP Community」ではSNMPエージェントで設定したコミュニティ名を指定しておこう。

 設定項目の入力が完了したら、「Create」ボタンをクリックすると設定が保存される。SNMPで正しくデータの取得が行えていれば、画面左上に取得されたサーバー情報が表示されるはずだ(図10)。

図10 画面左上に表示される「SNMP Information」

 続いて左サイドバーの「New Graphs」をクリックし、作成するグラフを指定する(図11)。まず、「Host」欄で対象とするホストを選択する。すると、作成できるグラフの一覧が表示される。

図11 作成するグラフを指定する「Create New Graphs」画面

 「ucd/net SNMP Host」テンプレートを指定した場合、デフォルトでは以下のグラフが描画できる。

  • CPUリソースの利用状況(「CPU Usage」)
  • ロードアベレージ(「Load Average」)
  • 空きメモリ(「Memory Usage」)
  • 「/」にマウントされているディスクの空き容量(「Disk Space」)
  • ネットワークデバイスごとのネットワークトラフィック(「Traffic」)

 ここからグラフを作成したい項目の右側にあるチェックボックスをクリックして「Create」をクリックするとグラフが作成される。

 続いて、「graphs」タブでグラフを表示するための設定を行う。左サイドバーの「Graph Trees」をクリックして「Graph Trees」画面を開き、表示されている「Default Tree」をクリックする(図12)。

図12 「Graph Trees」画面

 Graph Treeの編集画面が表示されるので、ここで右上の「Add」リンクをクリックする(図13)。

図13 Graph Treeの編集画面

 次の「Graph Tree Items」画面では、「Tree Item Type」で「Host」を選択する。すると新たにフォームが表示されるので、ここで対処とするホストを選択し、「Create」をクリックする(図14)。

図14 「Graph Tree Items」画面

 以上でグラフの設定は完了だ。「graphs」タブをクリックすると、左ペインに新たにホストが追加されていることが分かる。これをクリックすると、そのホストに関連するグラフが表示される(図15)。

図15 「graphs」タブに新たに追加したホストのグラフが追加されている

プラグインによる機能拡張も可能、用途に応じてカスタマイズを

 Cacti本体にはデータの収集やグラフの作成といった機能しか含まれないが、Cactiにはプラグイン機構が用意されており、プラグインを使用して機能を拡張することが可能だ。プラグインはCactiのWebサイトにあるPluginsページなどから入手できる。プラグインは多数公開されているが、たとえば取得したデータが一定の条件を満たしたときにアラートメールを送信したり、グラフの管理や設定方法などを変更するものなどが用意されている。

 また、さまざまなホストに向けた設定テンプレートも公開されている。これらは同じくCactiのWebサイトにあるTemplatesページから入手が可能だ。必要に応じてこれらを導入してカスタマイズを行ってみるとよいだろう。