harumaki.net

インフラ屋の覚書や、ラーメン食べある記とか。

[運用] システム監視ツール”monit”を入れてみた(10年ぶりに!)

   


10年ぶりにmonitを入れてみますた。
常駐型の監視/オペレーションツールで、『プロセスの起動、停止、再起動ができるnagios』のようなもの(?)
daemontoolと同様に、指定した条件でプロセスの再起動を実行できます。

制限事項としては、オープンソースで提供されているものはローカル単体での監視・オペレーションのみ、統合監視をする場合は有償版の”M/Monit”が提供され、インシデントサポートも提供されます。

※ちなみに10年前に試したときのログはこちら
基本的な部分はあまり変わっていないので、旧バージョンからのアップデートはしやすいかも。

参考:お世話になっております!
公式サイト
公式マニュアル
そのほか、インストール後のコマンドヘルプ”man monit”でも詳細な情報を確認できる。とても親切!

▼テスト環境は以下の通り。

サーバーOS CentOS6
テストしたバージョン monit-5.5(RPM)
グローバルIP 203.0.113.254
プライベートIP 192.168.101.254
ホスト名(仮) localhost.example.com

1)インストール

1-1)yumでのインストール

CentOS6でのRPM版monitのバージョンは5.5。

	# yum install monit

	--- snip ---

	Running Transaction
	  Installing : monit-5.5-1.el6.rf.x86_64                      1/1
	  Verifying  : monit-5.5-1.el6.rf.x86_64                      1/1

	Installed:
	  monit.x86_64 0:5.5-1.el6.rf

	Complete!

– インストールされたファイルを確認。割とシンプル。

		# rpm -ql monit
		/etc/monit.conf
		/etc/monit.d
		/etc/rc.d/init.d/monit
		/usr/bin/monit
		/usr/share/doc/monit-5.5
		/usr/share/doc/monit-5.5/CHANGES
		/usr/share/doc/monit-5.5/COPYING
		/usr/share/doc/monit-5.5/README
		/usr/share/man/man1/monit.1.gz
		/var/lib/monit
		/var/monit

1-2)ソースで最新版をインストールする場合。

2015.09.13現在最新の5.14を別のホストに入れてみたので、こちらもログを。

– 事前準備:依存関係パッケージのインストール

# yum -y install pam-devel		←Web画面の認証オプションでPAMを使えるので、依存関係として必要

ソースのダウンロード、インストール

$ wget https://mmonit.com/monit/dist/monit-5.14.tar.gz
$ tar -zxvf monit-5.14.tar.gz %% cd monit-5.14
$ ./configure			←コンフィグファイルの指定が可能。
				 デフォルトでは/etc/monitrc、/usr/local/etc/monitrcなどを指定している。
$ make 
# su -
# make install

※サーバー設定以降はRPM版5.5を前提に進めます。

2)サーバー設定

monitの全体的な設定

コンフィグファイルは”/etc/monit.conf”。

	# cd /etc/
	# ll monit.conf
	-rw------- 1 root root 10652 Mar 20  2013 monit.conf
	# cp -p monit.conf monit.conf.bak
	# vi monit.conf

監視インターバルの設定

デフォルト設定は60秒、サーバーの負荷次第では長くしてもOK。

	set daemon  60              # check services at 1-minute intervals

ログファイルの指定

デフォルト設定でOKだが、コメントされているのでコメントアウトして有効にする。

	set logfile /var/log/monit

IDファイルの指定(デフォルトのままでOK)

	set idfile /var/monit/id

IDファイルはmonit実行時に一意のIDを生成し、出力されたもの。

ステータスファイルの指定(デフォルトのままでOK)

	set statefile /var/monit/state

ステータスファイルは、monit実行中の監視対象、リソースを一覧でキャッシュしている。

アラートメールのフォーマット設定

コメントされている。アラートメールをを使う場合はコメントアウトして有効にする。
Fromアドレスを設定すること。
subject、messageはカスタマイズ可能だが、デフォルトでも問題なし。

	set mailserver localhost               # primary mailserver
	set mail-format {
	     from: monit@localhost.example.com
	  subject: monit alert --  $EVENT $SERVICE
	  message: $EVENT Service $SERVICE
	                Date:        $DATE
	                Action:      $ACTION
	                Host:        $HOST
	                Description: $DESCRIPTION

	           Your faithful employee,
	           Monit
	 }

アラートメールの配信先設定

こちらもデフォルトではコメントになっているので、フォーマット指定と合わせて送信先アドレスを指定する。
アドレスは複数指定可能だが、1行ごとにエントリを追加していく。

		set alert alert@example.com
		set alert system@example.com
		set alert manager@example.com

Web管理画面の設定

Web管理画面へのアクセスに使用するポートおよびアドレスと、ログイン認証の設定。
– ポートはデフォルトで2812番を使用。ポートを変更しない場合はこのままで可。
– デフォルトではリモートから管理画面へのアクセスを禁止しているので、リモートアクセスを許可する。
– 認証はベーシック認証のほか、PAMも利用可能。
— ベーシック認証を使用する場合はアドレスと認証ユーザーとパスワードを設定する。
※PAMの設定はこちらを参考のこと→https://mmonit.com/monit/documentation/monit.html#Authentication

▼デフォルト

	set httpd port 2812 and
	    use address localhost
	    allow localhost      	# アクセス許可制限
	    allow admin:monit    	# ベーシック認証
	    allow @monit         	# こちらはPAM認証の設定
	    allow @users readonly	# おなじくPAM認証の設定

▼変更例

	set httpd port 2812 and
	    use address 203.0.113.254	# Web管理画面にアクセスさせたいアドレスを設定。IP、ドメイン名ともに可
	    allow ***.***.***.***      	# リモートアクセスをしたい場合は、アクセス許可IPを指定する
	    allow admin:<パスワード>   # デフォルトのadminを使う場合でも、パスワードは一意のものに変更しましょう。
	    #allow @monit           	# PAMは今回は使わないのでコメントアウト
	    #allow @users readonly  	# PAMは今回は使わないのでコメントアウト

インクルード設定

指定したディレクトリ以下にコンフィグファイルがあればインクルードする。
デフォルトでは/etc/monit.d/となっているが、このままでもOK。
このディレクトリ以下に、監視対象のプロセスのファイルを個別に作成する。

	include /etc/monit.d/*

3)起動と停止、およびステータス確認

設定後、プロセスを起動して監視を開始。
デフォルトではリソースのステータスをレポーティングする。

monitプロセスの起動や停止

		/etc/init.d/monit start / stop / restart /status

参考:最初の起動時にコンソールに出力されるメッセージ

		monit: generated unique Monit id 4c07ac6a1e6c3e5e9293bcae092c9175 and stored to '/var/monit/id'
		Starting monit daemon with http interface at [203.0.113.254:2812]
		                                                           [  OK  ]

起動時に生成されるIDが”/var/monit/id”にストアされる。

参考:起動時のログ

		Sep 10 14:20:46 localhost monit[24269]: monit: generated unique Monit id 60dd77099aeb718412b98c51b5e48ec1 and stored to '/var/monit/id'
		Sep 10 14:20:46 localhost monit[25574]: Starting monit daemon with http interface at [203.0.113.254:2812]
		Sep 10 14:20:46 localhost monit[24271]: State file '/var/monit/state': Unable to read magic
		Sep 10 14:20:46 localhost monit[25576]: Starting monit HTTP server at [203.0.113.254:2812]
		Sep 10 14:20:46 localhost monit[24271]: monit HTTP server started
		Sep 10 14:20:46 localhost monit[24271]: 'localhost.example.com' Monit started

参考:トップ画面

参考:トップ画面

参考:トップ画面

参考:ホストステータス

参考:ホストステータス

参考:ホストステータス

4)サービス監視の設定

httpdやmysqldなどのサービス監視の設定。
/etc/monit.confへ直接記述するほか、monit.confにてincludeを許可している場合
指定したディレクトリ以下に、個別に設定ファイルを作成してインクルードすることも可能。
デフォルトでは/etc/monit.d/以下へファイルを作成することで監視対象に追加される。
追加した場合はmonitプロセスを再起動してインクルードさせる。

★★★メモ:バージョン5.7から”restart program”を使用可能になっている。
障害発生時のrestartを行う際は、”restart program”を使用すると、より安全。

今回はhttpd、mysqld、sshを追加したのでその設定を。

参考:サービス監視追加後のホストステータス

参考:サービス監視追加後のホストステータス

参考:サービス監視追加後のホストステータス

httpd監視

ファイル:/etc/monit.d/httpd

タイムアウト20秒で再起動

– プロセスIDの指定

	check process httpd with pidfile "/var/run/httpd/httpd.pid"

– 各プロセスの起動/停止/再起動などの指定

	    start program = "/etc/init.d/httpd start" with timeout 30 seconds
	    stop program  = "/etc/init.d/httpd stop"
	    restart program  = "/etc/init.d/httpd stop && "/etc/init.d/httpd start"

– 監視対象・閾値・アクションの指定

	    if cpu > 85% for 2 cycles then alert
	    if cpu > 95% for 2 cycles then restart
	    if totalmem > 200.0 MB for 5 cycles then restart
	    if loadavg(5min) greater than 2 for 3 cycles then restart
	    if failed host 203.0.113.254 port 80 protocol http
	       #and request "/somefile.html"
	       then restart
	    if failed port 443 type tcpssl protocol http
	       with timeout 20 seconds
	       then restart

– プロセス実行グループの指定

	    group apache

まとめるとこんな感じ。

	check process httpd with pidfile "/var/run/httpd/httpd.pid"
	    start program = "/etc/init.d/httpd start" with timeout 30 seconds
	    stop program  = "/etc/init.d/httpd stop"
	    restart program  = "/etc/init.d/httpd stop && "/etc/init.d/httpd start"
	    if cpu > 85% for 2 cycles then alert
	    if cpu > 95% for 2 cycles then restart
	    if totalmem > 200.0 MB for 5 cycles then restart
	    if loadavg(5min) greater than 2 for 3 cycles then restart
	    if failed host 203.0.113.254 port 80 protocol http
	       #and request "/somefile.html"
	       then restart
	    if failed port 443 type tcpssl protocol http
	       with timeout 20 seconds
	       then restart
	    group apache

参考:httpd監視ステータス

参考:httpd監視ステータス

参考:httpd監視ステータス

mysqld監視

ファイル:/etc/monit.d/mysqld

タイムアウト20秒で再起動

– プロセスIDの指定

	check process mysqld with pidfile "/var/run/mysqld/mysqld.pid"

– 各プロセスの起動/停止/再起動などの指定

	start = "/etc/init.d/mysqld start"
	#       as uid root and gid root
	stop = "/etc/init.d/mysqld stop"
	#       as uid root and gid root

– 監視対象・閾値・アクションの指定

	if failed unixsocket /var/lib/mysql/mysql.sock with timeout 20 seconds then restart
	if 5 restarts within 5 cycles then timeout

– プロセス実行グループの指定

	group mysql

まとめるとこんな感じ

	check process mysqld with pidfile "/var/run/mysqld/mysqld.pid"
	start = "/etc/init.d/mysqld start"
	#       as uid root and gid root
	stop = "/etc/init.d/mysqld stop"
	#       as uid root and gid root
	if failed unixsocket /var/lib/mysql/mysql.sock with timeout 20 seconds then restart
	if 5 restarts within 5 cycles then timeout
	group mysql

参考:mysqld監視ステータス

参考:mysqld監視ステータス

参考:mysqld監視ステータス

sshd監視

ファイル:/etc/monit.d/sshd
こちらはタイムアウト60秒で再起動。

– プロセスIDの指定

	check process sshd with pidfile /var/run/sshd.pid

– 各プロセスの起動/停止/再起動などの指定

	start program "/etc/init.d/sshd start" with timeout 60 seconds
	stop program "/etc/init.d/sshd stop"

– 監視対象・閾値・アクションの指定

	if failed port 22 protocol ssh then restart
	if 5 restarts within 5 cycles then time

– プロセス実行グループの指定

	group root

まとめるとこんな感じ。

    check process sshd with pidfile /var/run/sshd.pid
	start program "/etc/init.d/sshd start" with timeout 60 seconds
	stop program "/etc/init.d/sshd stop"
	if failed port 22 protocol ssh then restart
	if 5 restarts within 5 cycles then time
	group root

参考:sshd監視ステータス

参考:sshd監視ステータス

参考:sshd監視ステータス

/etc/monit.d/以下のファイルを新規作成、編集した後monitプロセスを再起動させると
指定したインターバルを経過したのち、ステータスの取得/更新が行われる。

5)monitコマンドでの各種操作

運用中のmonitはコマンドラインから様々なオペレーションを実行できますが
比較的利用頻度が高そうな操作を抜粋しました。

1)プロセス操作

monitの監視対象下にあるプロセス/サービスで、ログを残したい場合などは
通常のinitコマンドでの再起動でなくmonit restartを使います。(監視対象のプロセスのみ可能)

起動

		# monit start <プロセス名>

– mysqlの場合の実行例

		# monit start mysqld

– 監視対象の全プロセスに対する操作

		# monit start all

停止

		# monit stop <プロセス名>

– mysqlの場合の実行例

		# monit stop mysqld

– 監視対象の全プロセスに対する操作

		# monit stop all

再起動

		# monit restart <プロセス名>

– mysqlの場合の実行例

		# monit restart mysqld

監視対象の全プロセスに対する操作

			 # monit restart all

2)モニタリング操作

– モニタリングの開始

		# monit monitor <プロセス名>

– mysqlの場合は

		# monit monitor mysqld

– 監視対象の全プロセスに対する操作

		# monit monitor all

モニタリングの停止

		# monit unmonitor <プロセス名>

– mysqlの場合は

		# monit unmonitor mysqld

– 監視対象の全プロセスに対する操作

		# monit unmonitor all

3)監視プロセスのステータスのサマリ出力

監視対象リソースやサービスのステータスを簡易表示。

		# monit summary

– 実行例

		# monit summary
		The Monit daemon 5.5 uptime: 20m

		Process 'sshd'                      Running
		Process 'mysqld'                    Running
		Process 'httpd'                     Running
		System 'localhost.example.com'      Running

4)監視プロセスのステータスの詳細確認

Web管理画面で表示されるステータスと同じ内容のものですが、コマンドラインからも確認できます。

		# monit status

– 実行例

		# monit status
		The Monit daemon 5.5 uptime: 20m

		Process 'sshd'
		  status                            Running
		  monitoring status                 Monitored
		  pid                               28068
		  parent pid                        1
		  uptime                            23m
		  children                          0
		  memory kilobytes                  1232
		  memory kilobytes total            1232
		  memory percent                    0.0%
		  memory percent total              0.0%
		  cpu percent                       0.0%
		  cpu percent total                 0.0%
		  port response time                0.006s to localhost:22 [SSH via TCP]
		  data collected                    Thu, 10 Sep 2015 15:50:06

		Process 'mysqld'
		  status                            Running
		  monitoring status                 Monitored
		  pid                               28706
		  parent pid                        28256
		  uptime                            19m
		  children                          0
		  memory kilobytes                  106688
		  memory kilobytes total            106688
		  memory percent                    5.0%
		  memory percent total              5.0%
		  cpu percent                       0.0%
		  cpu percent total                 0.0%
		  unix socket response time         0.000s to /var/lib/mysql/mysql.sock [DEFAULT]
		  data collected                    Thu, 10 Sep 2015 15:50:06

		Process 'httpd'
		  status                            Running
		  monitoring status                 Monitored
		  pid                               28849
		  parent pid                        1
		  uptime                            17m
		  children                          11
		  memory kilobytes                  16192
		  memory kilobytes total            334232
		  memory percent                    0.7%
		  memory percent total              15.9%
		  cpu percent                       0.0%
		  cpu percent total                 0.0%
		  port response time                0.011s to 203.0.113.254:80 [HTTP via TCP]
		  data collected                    Thu, 10 Sep 2015 15:50:06

		System 'localhost.example.com'
		  status                            Running
		  monitoring status                 Monitored
		  load average                      [0.15] [0.03] [0.01]
		  cpu                               0.4%us 0.0%sy 0.0%wa
		  memory usage                      642276 kB [30.6%]
		  swap usage                        16900 kB [0.8%]
		  data collected                    Thu, 10 Sep 2015 15:50:06

今回はこんなところで。
そのほか、スマートフォンアプリもリリースされており、リモートでのシステムオペレーションにも対応しているのがステキ。
スタンドアロンでの監視はいささか現実的ではないながら、有償ライセンス利用前の検証としては良いかも。
ちなみに5ホスト/65ユーロのプランから1000ホスト/699ユーロのプランまでラインナップされ、個人的にはリーズナブルに感じられました(最上位のエンタープライズライセンスは12000ユーロと、なかなかのプライスですが…)

 - CentOS, infra, サーバー監視, 運用 ,