はじめに
本ブログでは、これまで仮想環境の構築からBootstrap3まで取り上げて来ましたが、サーバーの運用監視に関してこれまで取り上げたことはありません。そこで、今回はサーバー監視ツールのNagios環境をChefを使って構築する方法を解説します。
2014年01月27日 20時08分
本ブログでは、これまで仮想環境の構築からBootstrap3まで取り上げて来ましたが、サーバーの運用監視に関してこれまで取り上げたことはありません。そこで、今回はサーバー監視ツールのNagios環境をChefを使って構築する方法を解説します。
作業の前提条件は、下記のとおりです。
| ソフトウエア | バージョン |
|---|---|
| OS | Windows 7 Ultimate 32bit |
| Cygwin | Setup Version 2.831 |
| VirtualBox | 4.3.6 r91406 |
| Vagrant | 1.4.1 |
Vagrant+Chef-Soloを使って、LAMPサーバを構築するで使用したCookbookフォルダを、任意のフォルダにコピーします。
$ mkdir -p ~/vagrant/nagios-sever && cd ~/vagrant/nagios-server $ cp -r /tmp/site-cookbooks .
サーバー構築フォルダを作成し、Vagrantを初期化します。
$ vagrant init nagios-server
Vagrantfileを編集し、レシピ内で参照する変数を設定します。
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "nagios-server"
config.vm.box_url = "http://files.brianbirkinbine.com/vagrant-centos-65-i386-minimal.box
config.vm.network :public_network, ip: "192.168.0.50"
config.vm.synced_folder ".", "/vagrant"
config.omnibus.chef_version = :latest
config.vm.provision :chef_solo do |chef|
chef.cookbooks_path = "./site-cookbooks"
chef.add_recipe "base"
chef.add_recipe "repo"
chef.add_recipe "httpd"
chef.json = {
base: {
fqdn: "nagios-server.vagrantup.com",
name: "nagios-server"
},
httpd: {
admin: "root@nagios-server.vagrantup.com",
fqdn: "nagios-server.vagrantup.com",
port: 80
},
}
end
end
Boxを起動すると、レシピが実行されウエブサーバーが起動します。
$ vagrant up
Nagiosのインストールから、設定を行うCookbookを作成し、サーバーに適用します。
knifeコマンドで、Cookbookのひな型を作成します。
$ knife cookbook create nagios -o site-cookbooks

Nagisサーバーに必要なパッケージのインストールなどを行うレシピを作成します。
$ vi site-cookbooks/nagios/recipes/default.rb
%w{
nagios
nagios-plugins-all
perl-Params-Validate
perl-Nagios-Plugin
nagios-plugins-nrpe
mutt
}.each do |p|
package p do
action :install
options "--enablerepo=epel"
end
end
# 連絡先メールアドレスの変更
script "contact" do
interpreter 'bash'
user "root"
code <<-EOC
sed -i -e 's|nagios@localhost|#{node[:nagios][:contact]}|' /etc/nagios/objects/contacts.cfg
EOC
not_if "grep -q #{node[:nagios][:contact]} /etc/nagios/objects/contacts.cfg"
end
# 日付表示方法の変更
script "format" do
interpreter 'bash'
user "root"
code <<-EOC
sed -i -e 's|^date_format.*$|date_format = #{node[:nagios][:format]}|' /etc/nagios/nagios.cfg
EOC
not_if "grep -q #{node[:nagios][:format]} /etc/nagios/nagios.cfg"
end
# 監視対象サーバ設定フォルダの有効化
script "enable remote server config" do
interpreter 'bash'
user "root"
code <<-EOC
sed -i -e 's|^#cfg_dir=/etc/nagios/servers|cfg_dir=/etc/nagios/servers|' /etc/nagios/nagios.cfg
mkdir -p /etc/nagios/servers
EOC
only_if "grep -q ^'#cfg_dir=/etc/nagios/servers' /etc/nagios/nagios.cfg"
end
# 管理者パスワード設定
file "/tmp/.nagios_passwd_done" do
action :nothing
end
script "passwd" do
interpreter 'bash'
user "root"
code <<-EOC
htpasswd -b /etc/nagios/passwd #{node[:nagios][:user]} #{node[:nagios][:passwd]}
EOC
not_if "test -f /tmp/.nagios_passwd_done"
notifies :touch, "file[/tmp/.nagios_passwd_done]", :immediately
end
# SSH/HTTPの状態変化通知の有効化
file "/tmp/.nofitications_enabled_done" do
action :nothing
end
script "notifications" do
interpreter 'bash'
user "root"
code <<-EOC
sed -i -e 's|notifications_enabled.*$|notifications_enabled 1|' /etc/nagios/objects/localhost.cfg
EOC
not_if "test -f /tmp/.nofitications_enabled_done"
notifies :touch, "file[/tmp/.nofitications_enabled_done]", :immediately
end
# 死活監視用ダミーファイル作成
template "index.html" do
path "/var/www/html/index.html"
source "index.html.erb"
mode 0644
action :create
# /var/www/html/index.htmlが無かったら作成する
not_if "test -f /var/www/html/index.html"
end
# メモリ使用量チェックプラグインのインストール
remote_file "check_mem" do
path "/usr/lib/nagios/plugins/check_mem"
source "https://raw.github.com/jasonhancock/nagios-memory/master/plugins/check_mem"
mode 0755
action :create
not_if "test -f /usr/lib/nagios/plugins/check_mem"
end
# 自ホスト用メモリ監視コマンドの設定
script "set local mem usage" do
interpreter 'bash'
user "root"
code <<-EOC
echo '' >> /etc/nagios/objects/commands.cfg
echo 'define command {' >> /etc/nagios/objects/commands.cfg
echo ' command_name check_mem' >> /etc/nagios/objects/commands.cfg
echo ' command_line $USER1$/check_mem -w $ARG1$ -c $ARG2$' >> /etc/nagios/objects/commands.cfg
echo '}' >> /etc/nagios/objects/commands.cfg
EOC
not_if "grep -q check_mem /etc/nagios/objects/commands.cfg"
end
# 自ホスト用メモリ監視サービスの追加
script "check local mem service" do
interpreter 'bash'
user "root"
code <<-EOC
cat<<EOF>>/etc/nagios/objects/localhost.cfg
define service {
use local-service
host_name localhost
service_description Memory Usage
check_command check_mem!80!90
}
EOF
EOC
not_if "grep -q check_mem /etc/nagios/objects/localhost.cfg"
end
# 自ホスト用SWAP監視サービスの修正
script "check local swap service" do
interpreter 'bash'
user "root"
code <<-EOC
sed -i -e 's/check_local_swap\!20\!10/check_local_swap\!20\%\!10\%/' /etc/nagios/objects/localhost.cfg
EOC
not_if "grep -q 'check_local_swap\!20\%\!10\%' /etc/nagios/objects/localhost.cfg"
end
# 監視用NRPEコマンドの登録
script "set nrpe command" do
interpreter 'bash'
user "root"
code <<-EOC
echo '' >> /etc/nagios/objects/commands.cfg
echo 'define command {' >> /etc/nagios/objects/commands.cfg
echo ' command_name check_nrpe' >> /etc/nagios/objects/commands.cfg
echo ' command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$' >> /etc/nagios/objects/commands.cfg
echo '}' >> /etc/nagios/objects/commands.cfg
EOC
not_if "grep -q check_nrpe /etc/nagios/objects/commands.cfg"
end
# サービス起動と自動起動設定
service "nagios" do
action [:start, :enable]
end
Nagiosプラグインのcheck_httpコマンドでは、HTTPサーバーのトップページの読み込みの可否によってシステム監視を行いますので、トップページのテンプレートを作成します。既にトップページが存在する場合、新たにトップページを上書きすることはありません。
$ vi site-cookbooks/nagios/templates/default/index.html.erb
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> NAGIOS</title> </head> <body> </body> </html>
Vagrantfileに作成したCookbookを指定し、レシピ内で参照する変数を設定します。
$ vi Vagrantfile
chef.add_recipe "nagios"
nagios: {
contact: "root@nagios-server.vagrantup.com",
format: "iso8601",
user: "nagiosadmin",
passwd: "ro0tUser"
},
作成したレシピをBoxに適用します。
指定したレシピが実行され、Nagiosサーバーのインストールが実行されます。
$ vagrant provision
Nagios管理画面に初めてアクセスすると、ユーザー認証が行われますので、Vagrantfileで指定したユーザーIDとパスワードを指定します。
左に表示されたメニューからServiceを選ぶと、監視対象サーバの状態が確認できます。
http://192.168.0.50/nagios/


以上で、監視サーバの構築は終了です。
Nagiosのインストール直後の監視対象サーバは、自サーバ(localhost)のみとなっていますので、Vagrant+Chef-Soloを使って、LAMPサーバを構築するで作成したBoxを監視対象サーバとして追加します。
なお、リモートサーバの監視には、NRPE(Nagios Remote Plugin Executor)を使用します。
NRPEは、Linuxサーバの監視に特化した監視エージェントですので、Linux以外のプラットフォームには対応していませんので、注意して下さい。
$ cd /tmp/test-box $ vagrant up
$ knife cookbook create nrpe_remote -o site-cookbooks
リモートサーバーに必要なパッケージのインストールなどを行うレシピを作成します。
$ vi site-cookbooks/nrpe_remote/recipes/default.rb
# パッケージインストール
%w{
nagios-nrpe
nagios-plugins-all
perl-Params-Validate
perl-Nagios-Plugin
}.each do |p|
package p do
action :install
options "--enablerepo=epel"
end
end
# メモリ使用量チェックプラグインのインストール
remote_file "check_mem" do
path "/usr/lib/nagios/plugins/check_mem"
source "https://raw.github.com/jasonhancock/nagios-memory/master/plugins/check_mem"
mode 0755
action :create
not_if "test -f /usr/lib/nagios/plugins/check_mem"
end
# 監視サーバからのアクセスを許可する
script "allow nagios server" do
interpreter 'bash'
user "root"
code <<-EOC
sed -i -e 's|^allowed_hosts.*$|allowed_hosts=127.0.0.1,#{node[:nrpe_remote][:nagios]}|' /etc/nagios/nrpe.cfg
EOC
not_if "grep -q #{node[:nrpe_remote][:nagios]} /etc/nagios/nrpe.cfg"
end
# 死活監視用ダミーファイル作成
template "index.html" do
path "/var/www/html/index.html"
source "index.html.erb"
mode 0644
action :create
# /var/www/html/index.htmlが無かったら作成する
not_if "test -f /var/www/html/index.html"
end
# NRPEコマンドの登録
script "add nrpe cmd" do
interpreter 'bash'
user "root"
code <<-EOC
cat /tmp/nrpe.cfg >> /etc/nagios/nrpe.cfg
touch /tmp/.nrpe_cfg_done
EOC
action :nothing
not_if "test -f /tmp/.nrpe_cfg_done"
end
template "nrpe.cfg" do
path "/tmp/nrpe.cfg"
source "nrpe_command.erb"
notifies :run, 'script[add nrpe cmd]', :immediately
end
# サービス起動と自動起動設定
service "nrpe" do
action [:start, :enable]
end
Nagiosプラグインのcheck_httpコマンドがアクセスするトップページテンプレートを作成します。
$ vi site-cookbooks/nrpe_remote/templates/default/index.html.erb
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>NAGIOS</title> </head> <body> </body> </html>
$ vi site-cookbooks/nrpe_remote/templates/default/nrpe_command.erb
# ディスク使用量監視コマンドの登録 command[check_disk]=/usr/lib/nagios/plugins/check_disk -w 20% -c 10% / # メモリ使用量監視コマンドの登録 command[check_mem]=/usr/lib/nagios/plugins/check_mem -w 90 -c 99 # HTTP死活監視コマンドの登録 command[check_http]=/usr/lib/nagios/plugins/check_http -I 127.0.0.1 # MySQL監視コマンドの登録 command[check_mysql]=/usr/lib/nagios/plugins/check_mysql -H 127.0.0.1 -u root -p<%= node[:mysql][:passwd] %> # SSH監視コマンドの登録 command[check_ssh]=/usr/lib/nagios/plugins/check_ssh 127.0.0.1 # Swap監視コマンドの登録 command[check_swap]=/usr/lib/nagios/plugins/check_swap -w 20% -c 10%
Vagrantfileに作成したCookbookを指定し、レシピ内で参照する変数を設定します。
$ vi Vagrantfile
chef.add_recipe "nrpe_remote"
nrpe_remote: {
nagios: "192.168.0.50"
},
作成したレシピをBoxに適用します。
指定したレシピが実行され、NRPEのインストールが実行されます。
$ vagrant provision
Boxに接続した後、NRPE監視エージェントに登録された監視コマンドを実行します。
実行時にエラーとなったコマンドがあった場合、Nagios管理画面でもエラーとなって状態表示されますので、エラーが出た場合、対処して下さい。
$ vagrant ssh $ grep ^'command\[' /etc/nagios/nrpe.cfg | grep -v hda1 | sed 's/^.*=//' | sh

監視サーバ上の管理画面では、エラーになっていたステータスを確認します。
なお、リモート監視サーバ上で実行されたチェックコマンドが順次実行されステータスとして徐々に反映されていきます。このため、ステータスが一気に変わらないからと言って慌てることはありません。
ステータス画面の更新は、90秒ごとに行われますので、概ね監視項目数×90秒くらいの時間を見ておいた方が良いでしょう。