monitを使ってサーバの運用を自動化してみた

どうもこんにちは、ディーネットの山田です。
さて、今回はmonitのインストールに触れmonitを使ったサーバ運用の自動化についてお伝えしようと思います。

monitとはなんなのか?

ざっくり言うと、サービスを監視しサービスがダウンしていた場合に、サービス復旧を自動で行ってくれる
大変ありがたいオープンソースのソフトウェアになります。
ただ、動作としては、条件と一致(対象のプロセスがダウン)したら、対象のプロセスを再起動してくれるって
言うやつですので根本原因などは人間が調べることになります。
ちょっと宣伝させて下さい!
当社では、24時間365日エンジニアが常駐しておりますので、このような自動復旧ソフトウェアに任せること
なく、アラートが発生したらエンジニアが原因をお客様サーバ上で調査し、対応を行っております。

前提

今回は、CentOS7系にインストールします。
CentOS7系は既にセットアップされた状態でのお話です。

# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)

monitのインストール

epelのリポジトリを追加しましょう

# yum install epel-release.noarch

yumを使ってmonitをインストールしましょう

# yum install --enablerepo=epel monit

monitの設定ファイルに手を加えるためにバックアップしておく

# cp -a /etc/monitrc{,_org}

それでは、設定ファイルに手を加えていく

# vi /etc/monit
============================================================
19 set daemon  30              # check services at 30 seconds intervals
20 #   with start delay 240    # optional: delay the first check by 4-minutes (by
21 #                           # default Monit check immediately after Monit start)
============================================================
↓20行目の起動遅延について設定を入れる。
↓※サーバ再起動時などでmonitの方が先に起動して監視対象がまだ起動しておらず
↓ 監視条件に引っ掛かってしまうことを防ぐためです。
============================================================
19 set daemon  30              # check services at 30 seconds intervals
20     with start delay 240    # optional: delay the first check by 4-minutes (by
21 #                           # default Monit check immediately after Monit start)
============================================================

文法に問題がないかチェックする

# monit -t

「Control file syntax OK」が表示されればOKです。

monitを起動する

# systemctl start monit
# systemctl enable monit

monitが起動したことと、自動起動されるようになったことを確認する

# systemctl status monit
# systemctl is-enabled monit

これにてmonitのインストールは完了です

では、例としてApacheを監視してみましょう

Apacheを監視するように設定する

# vi /etc/monit.d/httpd
============================================================
check process httpd
with pidfile "/var/run/httpd/httpd.pid"
start program = "/usr/bin/systemctl start httpd"
stop  program = "/usr/bin/systemctl stop httpd"
if failed port 80 with timeout 10 seconds then restart
if failed port 443 with timeout 10 seconds then restart
if 30 restarts within 30 cycles then unmonitor
============================================================

設定ファイルの文法チェック

# monit -t
Control file syntax OK

「Control file syntax OK」が表示されればOKです。

設定ファイルを読み込みさせる

# monit reload
Reinitializing monit daemon

設定が反映されたことを確認

# monit status
============================================================
Process 'httpd'
status                       OK
monitoring status            Monitored
monitoring mode              active
on reboot                    start
pid                          9617
parent pid                   1
uid                          0
effective uid                0
gid                          0
uptime                       20d 4h 3m
threads                      1
children                     5
cpu                          0.0%
cpu total                    0.0%
memory                       0.2% [7.1 MB]
memory total                 0.7% [26.2 MB]
security attribute           (null)
disk write                   0 B/s [44 kB total]
port response time           0.181 ms to localhost:443 type TCP/IP protocol DEFAULT
port response time           0.078 ms to localhost:80 type TCP/IP protocol DEFAULT
data collected               Mon, 07 May 2018 14:51:47
============================================================

このように表示されればOK

それでは、模擬障害としてApacheを停止させてmonitによって起動されるかをテストします。

Apacheが起動していることを確認

# ps aux | grep httpd
============================================================
root      9617  0.0  0.1 247948  7316 ?        Ss   Apr17   0:48 /usr/sbin/httpd -DFOREGROUND
apache   16533  0.0  0.1 250192  4472 ?        S    May06   0:00 /usr/sbin/httpd -DFOREGROUND
apache   16535  0.0  0.1 250032  3980 ?        S    May06   0:00 /usr/sbin/httpd -DFOREGROUND
apache   16537  0.0  0.1 250192  4472 ?        S    May06   0:00 /usr/sbin/httpd -DFOREGROUND
apache   16538  0.0  0.1 250168  4236 ?        S    May06   0:00 /usr/sbin/httpd -DFOREGROUND
apache   16539  0.0  0.1 250192  4472 ?        S    May06   0:00 /usr/sbin/httpd -DFOREGROUND
root     19717  0.0  0.0 112660   972 pts/0    R+   14:55   0:00 grep --color=auto httpd
============================================================

Apacheを停止します

# systemctl stop httpd

Apacheが停止したことを確認します

# ps aux | grep httpd
============================================================
root     19754  0.0  0.0 112660   972 pts/0    S+   14:56   0:00 grep --color=auto httpd
============================================================

しばらく待つと...

Apacheが停止していることをmonitが検知して、Apacheを起動してくれる

#  ps aux | grep httpd
============================================================
root     19757  0.1  0.1 247948  7316 ?        Ss   14:56   0:00 /usr/sbin/httpd -DFOREGROUND
apache   19758  0.0  0.0 250032  3772 ?        S    14:56   0:00 /usr/sbin/httpd -DFOREGROUND
apache   19759  0.0  0.0 250032  3772 ?        S    14:56   0:00 /usr/sbin/httpd -DFOREGROUND
apache   19760  0.0  0.0 250032  3772 ?        S    14:56   0:00 /usr/sbin/httpd -DFOREGROUND
apache   19761  0.0  0.0 250032  3772 ?        S    14:56   0:00 /usr/sbin/httpd -DFOREGROUND
apache   19762  0.0  0.0 250032  3772 ?        S    14:56   0:00 /usr/sbin/httpd -DFOREGROUND
root     19764  0.0  0.0 112660   972 pts/0    S+   14:57   0:00 grep --color=auto httpd
============================================================

monitのログにもApacheの停止を検知して、Apacheを再起動してくれたときのログ

#  cat /var/log/monit.log
============================================================
[JST May  7 14:56:47] error    : 'httpd' process is not running
[JST May  7 14:56:47] info     : 'httpd' trying to restart
[JST May  7 14:56:47] info     : 'httpd' start: '/usr/bin/systemctl start httpd'
[JST May  7 14:57:18] info     : 'httpd' process is running with pid 19757
============================================================

備考

監視の設定ファイルを色々作成していくことで、対象サーバ上で稼動している複数サービスの
監視が自動で行えるようになりますね。
ただ、複雑な障害はまだまだ自動化の道のりは長いのでまずは簡単なプロセス再起動で
直るような障害から自動化していきましょう。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA