- 更新日: 2014年7月18日
- Vagrant & Chef
MonitでSSH,Nginx,MySQLのサービス死活監視を行うChef Cookbook
sshd, mysqld, nginx などのプロセス(サービス)は、常に起動させておきたいわけで、落ちたままになるのは困ります。ということで、サービスの死活監視を行うために Monit を利用することにしました。死活監視は、以前はただのシェルスクリプトで代用していたのだけど、Monit は設定も簡単ですし良さそうでしたので。
サービス監視スクリプトを作成して cron に登録 〜 CentOS6 | EasyRamble
このエントリーは、CentOS サーバー設定用 Chef Cookbook/Recipe の目次 の一部です。
ということで、Chef で Monit のサーバー構成を書きました。まずは、Monit 用の Cookbook を作成。
1 2 3 |
$ bundle exec knife cookbook create -o site-cookbooks app_monit_cookbook |
Monit の設定については、以下のページを参考にさせて頂きました。ありがとうございます。
ServersMan@VPS (CentOS 5) に Monit を入れてサービスの監視+自動起動
Monit のインストール + 設定 Recipe
site-cookbooks/app_monit_cookbook/recipes/default.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# Cookbook Name:: app_monit_cookbook # Recipe:: default # install monit package "monit" do action :install options "--enablerepo=rpmforge" end monit_conf = "/etc/monit.conf" # backup monit.conf bash 'copy_monit_conf_original' do code <<-EOC cp #{monit_conf} #{monit_conf}.org EOC creates "#{monit_conf}.org" end # -------------------------------------------------- # set monit.conf # -------------------------------------------------- monit_interval = 180 # set daemon 180 bash "set_daemon" do set_daemon = "set daemon" code <<-EOC sed -i -e "s/^#{set_daemon} 60/#{set_daemon} #{monit_interval}/g" #{monit_conf} EOC not_if "cat #{monit_conf} | grep '^#{set_daemon} #{monit_interval}'" end # set logfile syslog facility log_daemon bash "set_logfile" do set_logfile = "set logfile syslog facility log_daemon" code <<-EOC sed -i -e "s/^# #{set_logfile}/#{set_logfile}/g" #{monit_conf} EOC not_if "cat #{monit_conf} | grep '^#{set_logfile}'" end # disable web interface web_configs = [ 'set httpd port 2812 and', ' use address localhost', ' allow localhost', ' allow admin:monit', ' allow @monit', ' allow @users readonly' ] web_configs.each do |conf| bash "disable_web_interface_#{conf}" do code <<-EOC sed -i -e "s/^#{conf}/# #{conf}/g" #{monit_conf} EOC not_if "cat #{monit_conf} | grep '^# #{conf}'" end end bash "change_monit_conf_permission" do code <<-EOC chmod 700 #{monit_conf} EOC not_if "stat -c %a #{monit_conf} | grep '700'" end # start monit and set monit as service service "monit" do supports :status => true, :restart => true action [ :enable , :start ] end # -------------------------------------------------- # add monitored services # -------------------------------------------------- %w[ssh nginx mysql].each do |process| cookbook_file "/etc/monit.d/#{process}.conf" do owner "root" group "root" mode 0644 notifies :restart, 'service[monit]' end end |
コメントを読めば、だいたいやってること分かると思います。
set daemon 180 → 3分毎に監視
set logfile syslog facility log_daemon → ログの記録
# disable web interface からの処理 → とりあえずウェブフロントを無効化
/etc/monit.conf のパーミッションを700に
chkconfig on とサービス起動
# add monitored services からの処理 → サービスごとに設定ファイルを作成
と、以上のような一連の処理を行っています。# add monitored services 以降、cookbook_file リソースでサービスごとの設定ファイルをアップロードするので、files ディレクトリに1個ずつ作成します。今回は、ssh, nginx, mysql の3つのサービスを監視することにしました。
【追記 2014/08/14】
このエントリーでは sed で設定ファイルを編集していますけど、template/cookbook_file リソースで /etc/monit.conf を作成したほうが分かりやすいかもです。最近は、私は template/cookbook_file リソースを使うことが多いです。
【追記ここまで】
SSH, Nginx, MySQL監視用の設定ファイルを作成
もっとも死んでもらっては困るプロセスが sshd。落ちたままだと ssh 接続ができなくなります。
/etc/monit.d/ssh.conf 用。
site-cookbooks/app_monit_cookbook/files/default/ssh.conf
1 2 3 4 5 6 7 |
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 timeout |
最後の行は、5回監視して5回再起動を試みた場合に、監視を停止させる命令。
/etc/monit.d/nginx.conf 用。
site-cookbooks/app_monit_cookbook/files/default/nginx.conf
1 2 3 4 5 6 7 8 |
check process nginx with pidfile /var/run/nginx.pid start program = "/etc/init.d/nginx start" with timeout 60 seconds stop program = "/etc/init.d/nginx stop" if failed port 80 protocol http then restart group nginx |
/etc/monit.d/mysql.conf 用。
site-cookbooks/app_monit_cookbook/files/default/mysql.conf
1 2 3 4 5 6 7 |
check process mysql with pidfile /var/run/mysqld/mysqld.pid start program = "/etc/init.d/mysqld start" stop program = "/etc/init.d/mysqld stop" if failed unixsocket /var/lib/mysql/mysql.sock then restart if 5 restarts within 5 cycles then timeout |
/etc/monit.d/ 以下のファイルは、/etc/monit.conf から include されます。以上のように、サービスごとの設定ファイルも簡潔に書けて良い感じです。
nginx を停止させて自動起動するかを検証
以降、Monit で監視対象のサービス(今回はnginx)を対象に、サービスが落ちたあと自動起動するか検証します。
まずは、nginx を手作業で stop させる。
1 2 3 4 |
$ sudo /etc/init.d/nginx stop nginx を停止中: [ OK ] |
nginx のプロセスが走ってないことを確認。1個出てきてるのは grep 自体のプロセス。
1 2 3 4 |
$ ps aux | grep nginx vagrant 6926 0.0 0.1 107452 936 pts/1 S+ 06:53 0:00 grep nginx |
ログを監視します。
1 2 3 4 5 6 7 |
$ sudo tail -f /var/log/messages ... Jul 18 06:57:14 localhost monit[28769]: 'nginx' process is not running Jul 18 06:57:14 localhost monit[28769]: 'nginx' trying to restart Jul 18 06:57:14 localhost monit[28769]: 'nginx' start: /etc/init.d/nginx |
しばらく待ってたら、nginx のプロセスが走っていないので、tyring to restart して nginx が起動されたログが出力されました。
もう一度 nginx のプロセス確認。
1 2 3 4 5 6 |
$ ps aux | grep nginx root 6935 0.0 0.2 45112 1184 ? Ss 06:57 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf nginx 6937 0.0 0.3 45568 1784 ? S 06:57 0:00 nginx: worker process vagrant 6941 0.0 0.1 107452 936 pts/1 S+ 06:57 0:00 grep nginx |
nginx の master と worker のプロセスが、ちゃんと自動で立ち上がってますね。
Chef を使い始めて10日くらいになりますが、ようやく、コンソールからコマンドと vi で1つずつ進めるより、Chef で書いたほうが速い!という感覚を持つことができました。結構自分の中ではブレークスルー。
コンソールでコマンド打って作業進めるのも好きではあるのですが、何しろ2回目以降の同じ作業でも再び手作業でやんないといけない。この面倒を考えると、Chef に慣れてくるにつれて、段々とコンソールでちまちまコマンド打つのがだるくなってきます。そして Chef で書いたほうが速いし、また同じ構成やる時楽やん!となってきました。
- – 参考リンク –
- ServersMan@VPS (CentOS 5) に Monit を入れてサービスの監視+自動起動
- 株式会社シャノン技術ブログ: 15分で始めるmonitによるサーバ監視
- 便利!プロセス監視をしてくれるサーバ監視ツールmonitの設定方法 | EX-CLOUDエクスクラウド エンジニアブログ
- Vagrant & Chef の関連記事
- Vagrantで使うVirtualBoxのVM(仮想マシン)を外付けHDDに移動
- Chefで/etc/sysctl.confのkernel.panicを設定
- Chefでtelnetをインストール
- Chefでyumリポジトリを追加する設定
- Chef で iptables の設定
- ChefでSSH接続用の公開鍵をサーバーに設置
- nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
- Chef Recipe でユーザー・グループを作成
- Chef Recipe で CentOS のネットワーク・ホストを設定
- NetworkManager 他不要なパッケージを削除する Chef Recipe
Leave Your Message!