Vagrant+Chef-Soloを使って、Nagios環境を構築する

2014年01月27日 20時08分

201401272008OCHC00.png

はじめに

本ブログでは、これまで仮想環境の構築からBootstrap3まで取り上げて来ましたが、サーバーの運用監視に関してこれまで取り上げたことはありません。そこで、今回はサーバー監視ツールのNagios環境をChefを使って構築する方法を解説します。

前提条件

作業の前提条件は、下記のとおりです。

ソフトウエアバージョン
OSWindows 7 Ultimate 32bit
CygwinSetup Version 2.831
VirtualBox4.3.6 r91406
Vagrant1.4.1

LAMPサーバーの構築

  1. LAMP構築レシピの準備

    Vagrant+Chef-Soloを使って、LAMPサーバを構築するで使用したCookbookフォルダを、任意のフォルダにコピーします。

    $ mkdir -p ~/vagrant/nagios-sever && cd ~/vagrant/nagios-server
    $ cp -r /tmp/site-cookbooks .
    
  2. Vagrant初期化

    サーバー構築フォルダを作成し、Vagrantを初期化します。

    $ vagrant init nagios-server
    
  3. Vagrantfile設定

    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
    
  4. サーバー起動

    Boxを起動すると、レシピが実行されウエブサーバーが起動します。

    $ vagrant up
    
    201401272008OCHC01.png
    201401272008OCHC02.png
    201401272008OCHC03.png

Nagiosサーバーの構築

Nagiosのインストールから、設定を行うCookbookを作成し、サーバーに適用します。

  1. Nagios Cookbookの作成

    knifeコマンドで、Cookbookのひな型を作成します。

    $ knife cookbook create nagios -o site-cookbooks
    
    201401272008OCHC04.png
  2. レシピの作成

    Nagisサーバーに必要なパッケージのインストールなどを行うレシピを作成します。

    $ vi site-cookbooks/nagios/recipes/default.rb
    
    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
    
  3. HTTP死活監視用テンプレートの作成

    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>
    
  4. Vagrantfile設定

    Vagrantfileに作成したCookbookを指定し、レシピ内で参照する変数を設定します。

    $ vi Vagrantfile
    
        chef.add_recipe "nagios"
          nagios: {
            contact: "root@nagios-server.vagrantup.com",
            format: "iso8601",
            user: "nagiosadmin",
            passwd: "ro0tUser"
          },
    
  5. プロビジョニング

    作成したレシピをBoxに適用します。
    指定したレシピが実行され、Nagiosサーバーのインストールが実行されます。

    $ vagrant provision
    
    201401272008OCHC05.png
    201401272008OCHC06.png
  6. Nagios管理画面へのアクセス

    Nagios管理画面に初めてアクセスすると、ユーザー認証が行われますので、Vagrantfileで指定したユーザーIDとパスワードを指定します。

    左に表示されたメニューからServiceを選ぶと、監視対象サーバの状態が確認できます。

    http://192.168.0.50/nagios/
    
    201401272008OCHC07.png
    201401272008OCHC08.png

以上で、監視サーバの構築は終了です。

監視対象サーバの設定

Nagiosのインストール直後の監視対象サーバは、自サーバ(localhost)のみとなっていますので、Vagrant+Chef-Soloを使って、LAMPサーバを構築するで作成したBoxを監視対象サーバとして追加します。
なお、リモートサーバの監視には、NRPE(Nagios Remote Plugin Executor)を使用します。
NRPEは、Linuxサーバの監視に特化した監視エージェントですので、Linux以外のプラットフォームには対応していませんので、注意して下さい。

  1. 監視対象サーバの起動
    $ cd /tmp/test-box
    $ vagrant up
    
  2. NRPEリモート監視 Cookbookの作成
    $ knife cookbook create nrpe_remote -o site-cookbooks
    
  3. レシピの作成

    リモートサーバーに必要なパッケージのインストールなどを行うレシピを作成します。

    $ 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 &lt;&lt;-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 &lt;&lt;-EOC
    cat /tmp/nrpe.cfg &gt;&gt; /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
    
  4. HTTP死活監視用テンプレートの作成

    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>
    
  5. NRPEコマンドテンプレートの作成
    $ 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&lt;%= node[:mysql][:passwd] %&gt;
    
    # 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%
    
  6. Vagrantfile設定

    Vagrantfileに作成したCookbookを指定し、レシピ内で参照する変数を設定します。

    $ vi Vagrantfile
    
        chef.add_recipe "nrpe_remote"
          nrpe_remote: {
            nagios: "192.168.0.50"
          },
    
  7. プロビジョニング

    作成したレシピをBoxに適用します。
    指定したレシピが実行され、NRPEのインストールが実行されます。

    $ vagrant provision
    
    201401272008OCHC09.png
    201401272008OCHC10.png
  8. NRPEプラグインの動作確認

    Boxに接続した後、NRPE監視エージェントに登録された監視コマンドを実行します。
    実行時にエラーとなったコマンドがあった場合、Nagios管理画面でもエラーとなって状態表示されますので、エラーが出た場合、対処して下さい。

    $ vagrant ssh
    $ grep ^'command\[' /etc/nagios/nrpe.cfg | grep -v hda1 | sed 's/^.*=//' | sh
    
    201401272008OCHC11.png
  9. 監視ステータスの確認

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

    201401272008OCHC12.png
    201401272008OCHC13.png