incronを使ってseekファイルリセット

ログ監視を行う場合に必要なseekファイルのお話

logrotateを使わずアプリケーション側でローテーションしていると…
・ローテーションした際にリセット処理を入れることができない

更に、日付が変わってすぐにローテーションではなく、アクセスがあってからログが生成されると…
・seekファイルをリセットするタイミングが分からない

更に更に、ファイルサイズでローテーションする場合…
・もう完全にseekファイルをリセットするタイミングが分からない

ということでincronを使ってファイルの生成や変更時にスクリプトを叩くよう設定

incronのインストール
リポジトリはrpmforge

[code]
# yum install incron
# /etc/init.d/incrond start
# chkconfig incrond on
[/code]

テスト用スクリプト

[code]
# cat /tmp/echo-date.sh
#!/bin/bash
echo `date` >> /tmp/incrond.log
# chmod +x /tmp/echo-date.sh
[/code]

incronの設定

[code]
# incrontab -e
/tmp/ IN_CREATE /tmp/echo-date.sh
# incrontab -d
[/code]

テスト

[code]
# touch /tmp/testfile
[/code]

/tmp/incrond.logに日付が入力されていることを確認

複数ログを引数で渡す場合は「””」で囲まずバックスラッシュを入れる
※同じディレクトリを複数行設定できない?

[code]
/tmp/ IN_CREATE /tmp/echo-date.sh /path/to/1.log /path/to/2.log /path/to/1.log
[/code]

seekファイルをリセットするスクリプトは
「スクリプト実行時にローテーションされていた場合にseekファイルリセット」
の処理をすればOK

今回は下記スクリプトを作成

[code]
#!/bin/bash
##########################
# Seek File Reset Script #
##########################

if [[ ${#} < 1 ]]; then
echo “Usage: ./`basename ${0}` /path/to/log”
exit 1
fi

LOGLIST=${1}
DIR=”/etc/nagios/kanshi”

for LOGPATH in ${LOGLIST}
do
LOGFILE=`basename ${LOGPATH}`

HEADFILE=”${LOGFILE}.head”
SEEKFILE=”${LOGFILE}-*.seek”

MD5=`head -n 1 ${LOGPATH} | md5sum | awk ‘{print $1}’`
HEAD=`cat ${DIR}/${HEADFILE}`

if [[ ${MD5} != ${HEAD} ]]; then
/bin/rm ${DIR}/${SEEKFILE}
echo ${MD5} > ${DIR}/${HEADFILE}

#debug
# export LANG=en
# echo “`date`: Reset ${DIR}/${SEEKFILE}” >> /var/log/seek-reset-incron.log
#gubed
fi
done
[/code]

CentOS6にSensuをインストールする

CentOS6にChef(Solo)を使ってSensuをインストールする手順

rbenvで美しくRubyをインストール
CentOS 6.4にrbenvでRuby 2.0.0をインストールする

epelリポジトリ追加
[code]
[root@sensu ~]# rpm -ivh &quot;http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm&quot;[/code]

必要なものをインストール
[code]
[root@sensu ~]# yum -y install –enablerepo=epel git make gcc zlib-devel openssl-devel readline-devel ncurses-devel gdbm-devel db4-devel libffi-devel tk-devel libyaml-devel
[/code]

gitでrbenvとruby-buildをクローン
[code]
[root@sensu ~]# git clone https://github.com/sstephenson/rbenv.git /usr/local/rbenv
[root@sensu ~]# git clone https://github.com/sstephenson/ruby-build.git /usr/local/rbenv/plugins/ruby-build
[/code]

環境変数の設定
[code]
[root@sensu ~]# vim /etc/profile.d/rbenv.sh
export RBENV_ROOT=&quot;/usr/local/rbenv&quot;
export PATH=&quot;/usr/local/rbenv/bin:$PATH&quot;
eval &quot;$(rbenv init -)&quot;

[root@sensu ~]# . /etc/profile.d/rbenv.sh
[/code]

Rubyのインストール
[code]
[root@sensu ~]# rbenv install 2.1.1
[root@sensu ~]# rbenv global 2.1.1
[/code]

Chefのインストール
[code]
[root@sensu ~]# gem install –no-ri –no-rdoc chef knife-solo
[root@sensu ~]# rbenv rehash
[/code]

opscodeを使う準備
※予め登録して秘密鍵を入手する
[code]
[root@sensu ~]# knife configure
[root@sensu ~]# vim /root/.chef/opscode.pem
—–BEGIN RSA PRIVATE KEY—–
~
~
~
—–END RSA PRIVATE KEY—–
[root@sensu ~]# chmod 600 /root/.chef/opscode.pem
[root@sensu ~]# vim ~/.chef/knife.rb
client_key ‘/root/.chef/opscode.pem’
[/code]

Chefを使う準備
[code]
[root@sensu ~]# knife solo init chef-repo
[root@sensu ~]# cd chef-repo
[root@sensu chef-repo]# git init
[root@sensu chef-repo]# git add .
[root@sensu chef-repo]# git commit -m ‘first commit’
[/code]

opscodeからsensuを入手
[code]
[root@sensu chef-repo]# knife cookbook site vendor sensu -o cookbooks/
[/code]

SSLの設定
[code]
[root@sensu chef-repo]# cd ./cookbooks/sensu/examples/ssl/
[root@sensu ssl]# ./ssl_certs.sh generate
[root@sensu ssl]# cd /root/chef-repo/
[root@sensu chef-repo]# mkdir ./data_bags/sensu
[root@sensu chef-repo]# cp ./cookbooks/sensu/examples/ssl/ssl.json data_bags/sensu/
[/code]

Chef-Soloの準備
[code]
[root@sensu ~]# cd
[root@sensu ~]# mkdir ~/chef-repo/config
[root@sensu ~]# vim ~/chef-repo/config/solo.rb
file_cache_path &quot;/tmp/chef-solo&quot;
cookbook_path &quot;/root/chef-repo/cookbooks&quot;
role_path &quot;/root/chef-repo/roles&quot;

[root@sensu ssl]# cd /root/chef-repo/nodes/
[root@sensu nodes]# vim sensu.json
{
&quot;default_attributes&quot;: {
},
&quot;override_attributes&quot;: {
},
&quot;run_list&quot;: [
&quot;sensu&quot;,
&quot;sensu::redis&quot;,
&quot;sensu::rabbitmq&quot;
]
}
[/code]

Chef-Solo実行
[code]
[root@sensu ~]# chef-solo -c ~/chef-repo/config/solo.rb -j ~/chef-repo/nodes/sensu.json
[/code]

起動
[code]
[root@sensu ~]# /etc/init.d/sensu-server start
[root@sensu ~]# /etc/init.d/sensu-api start
[root@sensu ~]# /etc/init.d/sensu-dashboard start
[/code]

自動起動設定
[code]
[root@sensu ~]# chkconfig sensu-server on
[root@sensu ~]# chkconfig sensu-api on
[root@sensu ~]# chkconfig sensu-dashboard on
[/code]

アクセス
http://(IP Address):8080/
admin: secret

参考URL:
Sensu Documentation
CentOS 6.5でChefからSensuをインストールしようとするとRabbitMQでコケる回避策

NATの冗長化 〜High Availability NATパターンの別案〜

High Availability NATパターン
http://blog.suz-lab.com/2013/01/high-availability-natcentos6.html
が何故か安定しないので別案。

「pacemaker+corosync」は「ノード死活+iptables」から「ノード死活のみ」に変更し、iptablesはmonitで管理を行う。

crmコマンド再び
でcrmshを入れるとcorosyncとpacemakerも入るのでそのまま。

[code]
chkconfig pacemaker on
chkconfig corosync on
[/code]

NATインスタンスを作成する
の通り、NATインスタンスを作成する。(2台)

monitが入っていない場合はインストールする。
[code]
yum install monit
chkconfig monit on
[/code]

監視間隔は適宜変更する。
[code]
vim /etc/monit.conf
set daemon 5
[/code]

iptables用の設定を作成する。
[code]
vim /etc/monit.d/iptables.conf
check program iptables with path “/root/scripts/iptables-check.sh” with timeout 5 seconds
if status != 0 then restart
start program = “/etc/init.d/iptables start”
stop program = “/etc/init.d/iptables stop”
[/code]

iptables監視用のスクリプトを作成する。
[code]
mkdir /root/scripts/
vim /root/scripts/iptables-check.sh
#!/bin/bash
/etc/init.d/iptables status
exit ${?}

chmod +x /root/scripts/iptables-check.sh
[/code]

monitを起動する。
[code]
/etc/init.d/monit start
[/code]
この時点でサーバ起動時は常にiptablesが起動している環境ができあがる。
ここから下はルートテーブル変更の為の設定。

フェイルオーバー時のルートテーブル変更用スクリプトを作成する。
[code]
vim /etc/init.d/associate-nat
#!/bin/sh
#
# chkconfig: 2345 99 10
# description: Associate RouteTables

# Source Function Library
. /etc/init.d/functions

# System Variable
prog=${0##*/}
lock=/var/lock/subsys/$prog

# User Variavle
ROUTE_TABLE_ID=(ルートテーブルのID)
DESTINATION_CIDR=0.0.0.0/0

# Source Config
if [ -f /etc/sysconfig/$prog ] ; then
. /etc/sysconfig/$prog
fi

#
case “$1” in
start)
touch $lock
AZ=`curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone`
REGION=`echo $AZ | cut -c 1-$((${#AZ} – 1))`
INSTANCE_ID=`curl -s http://169.254.169.254/latest/meta-data/instance-id`
aws –region $REGION ec2 replace-route
–destination-cidr-block $DESTINATION_CIDR
–route-table-id $ROUTE_TABLE_ID
–instance-id $INSTANCE_ID
| logger -s -i -t $prog

exit ${PIPESTATUS[0]}
;;
stop)
rm -f $lock
exit 0
;;
status)
if [ -f $lock ] ; then
exit 0
else
exit 3
fi
;;
*)
echo “Usage: $0 {start|stop|status}”
exit 1
esac

chmod +x /etc/init.d/associate-nat
[/code]

corosyncの設定を各サーバへ行う。
[code]
vim /etc/corosync/corosync.conf
compatibility: whitetank

service {
name: pacemaker
ver: 0
use_mgmtd: yes
}

totem {
version: 2
secauth: off
threads: udpu
transport: udpu
interface {
ringnumber: 0
bindnetaddr: (自ノードのIPアドレス)
mcastport: 5405
ttl: 1
member {
memberaddr: (ノード1のIPアドレス)
}
member {
memberaddr: (ノード2のIPアドレス)
}
}
}

logging {
fileline: off
to_stderr: no
to_logfile: yes
to_syslog: yes
logfile: /var/log/cluster/corosync.log
debug: off
timestamp: on
logger_subsys {
subsys: AMF
debug: off
}
}

amf {
mode: disabled
}

/etc/init.d/corosync start
[/code]

リソースを追加する。(片側)
[code]
crm configure property no-quorum-policy=”ignore” stonith-enabled=”false”
crm configure rsc_defaults resource-stickiness=”INFINITY” migration-threshold=”1″
crm configure primitive associate-nat lsb:associate-nat
[/code]
associate-natを入れることで、フェイルオーバー時にルートテーブルを変更するスクリプトが実行される。

crm_monで確認する。
[code]
Last updated: Thu Feb 13 19:51:51 2014
Last change: Thu Feb 13 19:08:52 2014 via cibadmin on node02
Stack: classic openais (with plugin)
Current DC: node02 – partition with quorum
Version: 1.1.10-14.el6_5.2-368c726
2 Nodes configured, 2 expected votes
1 Resources configured

Online: [ node01 node02 ]

associate-nat (lsb:associate-nat): Started node01
[/code]

監視方法は下記の通り
・monitのプロセス監視
・NAT配下のインスタンスから外部(8.8.8.8)へfping

crmコマンド再び

pacemaker+corosyncに使うcrmコマンドが無くなってしまい、pcsコマンドで代用していたものの…
http://blog.suz-lab.com/2013/03/pacemakercrmpcs.html
やはり使いにくい。
リポジトリを教えてもらったので秒速でcrmコマンドをインストール!

[code]
# cd /etc/yum.repos.d/
# curl -L -o ha-clustering.repo “http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/network:ha-clustering:Stable.repo”

# yum install crmsh.x86_64

# crm –version
1.2.6-6.1 (Build 5b87f0a85ccc4248a2204685ea8a1f5fac347c1d)
[/code]

やったー!