Googleスプレッドシートでシステム管理(Nagios通知編)

2016年6月22日 | 平井 澄人

はじめに

弊社ではGoogle Driveを使っていて、以前だとExcelを使っていたような場面も、かなりの部分がGoogleスプレッドシートに置き換わってきているところです。特に社内の資料に関しては、簡単に同僚に共有したり共同編集したりできたりするのが便利で、もう手放せなくなっています。

システムの情報もGoogleスプレッドシートにまとめていきたいところです。

今回、自社管理サーバの監視に使っているNagiosの通知をGoogleスプレッドシートに記録するようにしました。こうすることにより、今までメールだとトラブルの傾向など全貌把握がむつかしかったのが簡単になりました。記録が蓄積されるのもうれしいです。

背景

Nagiosとは複数のホスト、サービス、リソース等の状態の監視するシステムです。 Nagiosサーバから複数のリソースを監視できます。監視対象側にもエージェント(nrpe)をインストールするとより詳しい監視が行えます。

障害を検知した場合の通知は基本はメールですが、プラグインを追加してHipChatなどにも通知することができます。 メールやチャットで過去の履歴をまとめるのは結構つらいので、より便利にみる仕組みがほしくなってきます。

GoogleスプレッドシートはAPIが用意されていてOAuth2という比較的安全なやり方で操作することができます。 これらを用いて自動でNagios通知をスプレッドシートに書き込むやり方を紹介します。 Googleスプレッドシートに書き込むところはrubyのライブラリを使いました。

完成イメージ

sample

手順

大きく次の3つのステップになります。

  1. GoogleDriveの準備
  2. サーバにruby環境構築
  3. Nagiosの設定ファイルに追加

1. GoogleDriveの準備

Google API OAuth2.0という仕組みの準備が必要です。

  1. 使うGoogleアカウントでログイン
  2. Google Developers Consoleにアクセス
  3. プロジェクトを作成
  4. リンクDrive APIをクリックし、「有効にする」をクリックする
  5. 左メニューの「認証情報」から認証情報を作成
  6. クライアント ID の作成 (OauthクライアントIDを選択)
  7. 同意画面を設定※できるだけ情報を入れておきます。
  8. アプリケーションの種類はその他を選択、名前を入力して作成をクリック
  9. 表示される「クライアント ID」, 「クライアント シークレット」をメモっておく
  10. Googleスプレッドシートを作成し、URLを確認

    https://docs.google.com/spreadsheets/d/[IDっぽいこの部分をメモっておく]/edit#gid=0

2. サーバにruby環境構築

google-drive-rubyというgemライブラリを使います。

※今回はrbenvのインストールはユーザーローカルではなく、サーバ全体(グローバル)にインストールします。

Nagiosサーバでrbenv, rubyを使えるようにする。

$ sudo  yum install -y git gcc gcc-c++ openssl-devel readline-devel zlib-devel bzip2
$ sudo visudo -f /etc/sudoers.d/00_base
 
※以下の内容を書き込む
Defaults !secure_path
Defaults env_keep += "PATH RBENV_ROOT"
 
※rbenvのインストールのため環境変数を設定
$ export RBENV_ROOT=/usr/local/rbenv
$ export PATH=${RBENV_ROOT}/bin:${PATH}
※rbenvのインストール
$ sudo git clone git://github.com/sstephenson/rbenv.git ${RBENV_ROOT}
$ sudo git clone git://github.com/sstephenson/ruby-build.git ${RBENV_ROOT}/plugins/ruby-build
 
$ sudo rbenv init -
 
$ sudo vi /etc/profile
 に下記の設定を追記します。
export RBENV_ROOT=/usr/local/rbenv
export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init -)"
※ログインしなおし
 
$ rbenv install -l
※rubyのバージョンの中から新しい目のものを選択する
$ sudo rbenv install 2.3.1
$ sudo rbenv rehash
$ sudo rbenv global 2.3.1
 
※ 使いたいライブラリのインストール
$ sudo gem install google_drive --no-ri --no-rdoc

※CentOS6, CentOS7、ほぼ同じ手順。yum updateしてライブラリを新しくしておいたほうがいいです。

連携の設定

通知のコマンドを作成

  • sudo vi /usr/lib64/nagios/plugins/notify-by-spreadsheet.rb
#!/usr/local/rbenv/shims/ruby
# -*- coding: utf-8 -*-
 
require 'google_drive'
 
session = GoogleDrive.saved_session('/var/spool/nagios/config.json')
spreadsheet_id = '[スプレッドシートを作ったときにメモったid]'
 
host, ipa, state, type, desc, info, timestamp = ARGV
time = Time.at(timestamp.to_i)
 
ws = session.spreadsheet_by_key(spreadsheet_id).worksheets[0]
num_rows = ws.num_rows
 
if num_rows == 0
    ws[1, 1] = 'TIME'
    ws[1, 2] = 'HOST'
    ws[1, 3] = 'IP ADDRESS'
    ws[1, 4] = 'STATE'
    ws[1, 5] = 'TYPE'
    ws[1, 6] = 'DESC'
    ws[1, 7] = 'INFO'
    num_rows += 1
end
 
ws[num_rows + 1, 1] = time.strftime('%Y/%m/%d %H:%M:%S')
ws[num_rows + 1, 2] = host
ws[num_rows + 1, 3] = ipa
ws[num_rows + 1, 4] = state
ws[num_rows + 1, 5] = type
ws[num_rows + 1, 6] = desc
ws[num_rows + 1, 7] = info
 
ws.save
ws.reload
  • 権限やjsonなどの準備
$ sudo chmod 755 /usr/lib64/nagios/plugins/notify-by-spreadsheet.rb
  • コンソールで連携のテストを行います。
$ cd /var/spool/nagios/
$ sudo -u nagios vi config.json
以下を記入
{"client_id": "先にメモったクライアントID"
,"client_secret": "メモったクライアントシークレット"}
 
$ sudo -u nagios sh -c '/usr/lib64/nagios/plugins/notify-by-spreadsheet.rb TEST 111.111.111.111 SERV TYPE DESC OUT `date +%s` '
 
1. Open this page:
※長いhttps://accounts.google.com/o/oauth2/auth?~のアドレスが表示されるのでコピーしてブラウザにペーストします。
※許可を確認後、コードが取得できるのでコピーし次に入力します。
 
2. Enter the authorization code shown in the page:

※これで、Googleスプレッドシートに何か書き込まれるはずです。 もう一度実行すると今度は認証なしで実行できるようになります。

3. Nagiosの設定

Nagiosの設定ファイルは作りこんでいる場合もあるので、書く場所はそれぞれです。 以下ではインストールしたばかりの、Nagiosに簡単に組み込んでみた例です。

おまけ(CentOS7にNagiosインストール)

sudo yum -y install gd-devel epel-release
sudo yum --enablerepo=epel -y install nagios nagios-plugins-{ping,disk,users,procs,load,swap,ssh,http}
sudo htpasswd /etc/nagios/passwd nagiosadmin 
sudo systemctl start nagios
sudo systemctl start httpd
sudo systemctl enable nagios.service
sudo systemctl enable httpd.service
※firewalldを調節

http://[IP ADDRESS]/nagios で管理画面にアクセス可能

設定ファイルの調整

/etc/nagios/objects/commands.cfg の末尾に以下の行追加

define command{
  command_name  notify-host-by-spreadsheet
  command_line  $USER1$/notify-by-spreadsheet.rb "$HOSTALIAS$" "$HOSTADDRESS$" "HOST DOWN" "$NOTIFICATIONTYPE$" "-" "-" "$TIMET$"
  }
 
define command{
  command_name  notify-service-by-spreadsheet
  command_line  $USER1$/notify-by-spreadsheet.rb "$HOSTALIAS$" "$HOSTADDRESS$" "$SERVICESTATE$" "$NOTIFICATIONTYPE$" "$SERVICEDESC$" "$SERVICEOUTPUT$" "$TIMET$"
  }

/etc/nagios/objects/contacts.cfg 追加

define contact{
   contact_name spreadsheet
   use          generic-contact
   host_notification_commands     notify-host-by-spreadsheet
   service_notification_commands  notify-service-by-spreadsheet
}
 
※下のほうにある
        members                 nagiosadmin
の行に
        members                 nagiosadmin,spreadsheet 
としてspreadsheetを追加
  • 設定の読み込み
$ sudo nagios -v /etc/nagios/nagios.cfg
で設定ファイルが有効か確認。有効であれば再読み込み
$ sudo service nagios restart

これで、通知が飛んだら作ったGoogleスプレッドシートに書き込まれるはずです。

注意点

間違えて連携の設定してしまうとセキュリティホールになりかねないので注意が必要です。

例えばOauth2の認証でjsonの記述を間違えたりすると”google-drive-ruby”という、 プラグインのクライアントIDを許可を求めてくるのでアカウントに接続されているアプリで確認して、消してやり直してください。

また、この仕組みを使わなくなった場合も許可を削除しておいた方がよいです

PICK UP

ライター

東京でサイト運用の仕事をしています。旅行好き。

お問い合わせ

サービスに関するご相談は
こちらよりお気軽にお問い合わせください。

e-Agencyの様々な情報をSNSでお届けします!