はじめに
本ブログでは、これまで仮想環境の構築から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秒くらいの時間を見ておいた方が良いでしょう。