Glide Note

glidenote's blog

serf-muninを導入してmunin-nodeの監視追加、削除を自動化した

前回の続きSerfを触ってる。前回のエントリを見て、@zembutsuさんが作ってくれたserf-muninが素晴らしかったので、弊社仕様に若干修正して導入した。

Serf-muninが自動生成、削除するファイルは/etc/munin/conf.d/配下で、 既存のmunin環境(/etc/munin/munin.confとか)を壊すことがないと思うので、すぐに試すことが出来ると思う。

導入環境は

  • CentOS 6.4
  • Serf 0.2.0
  • munin-2.0.17

で、Serfの起動コマンドや生成されるmuninのconfの関係上、Serf 0.2.0とmunin 2.0以上は必須条件になります。

serf-muninの仕組みの説明

1. web server1がmuninサーバと同じクラスタにserf joinしてくる

2. Web server1がクラスタにjoinしてきたので、member-joinイベントが発生

  1. muninサーバでmember-joinイベントで指定しているスクリプトが実行される
  2. muninサーバの/etc/munin/conf.d/web001.foobar.confという設定ファイルが追加され、ポーリング対象のサーバが追加される。
  3. Web Serve1がmuninのグラフに追加される

3. DB server1がクラスタにjoinしてきたので、member-joinイベントが発生

  1. muninサーバでmember-joinイベントで指定しているスクリプトが実行される
  2. muninサーバの/etc/munin/conf.d/db001.foobar.confという設定ファイルが追加され、ポーリング対象のサーバが追加される。
  3. DB Serve1がmuninのグラフに追加される

4. Web server1が突然の死。member-leaveイベントが発生

  1. muninサーバでmember-leaveイベントで指定しているスクリプトが実行される
  2. muninサーバの/etc/munin/conf.d/web001.foobar.confという設定ファイルが削除され、ポーリング対象のサーバから削除される。
  3. Web Server1がmuninのグラフから削除される

もしWeb Server1が復活したら、勝手にクラスタに参加してくるので、再度ポーリング先に自動追加される。

実際の設定

muninサーバ側の設定

SERF_ROLEはmuninのconf内でgroupに利用するために設定してます。 muninサーバにはmanageというroleを設定してます。

作業の流れは

  1. Serfをダウンロードして、/usr/local/bin/serfに設置
  2. 自動生成されるconf用ディレクトリ/etc/munin/conf.dを作成
  3. serf join/leaveイベント発生時に実行されるスクリプトserf-munin.shを作成し、設置
  4. Serfの起動スクリプトを作成
  5. Serfの起動
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
export SERF_ROLE=manage
sudo yum install -y unzip

cd /tmp/
until wget -O serf.zip https://dl.bintray.com/mitchellh/serf/0.2.0_linux_amd64.zip; do
  sleep 1
done
unzip serf.zip
sudo mv serf /usr/local/bin/serf
rm serf.zip

sudo mkdir -p /etc/munin/conf.d/

# create serf-munin.sh
cat <<'EOF' >/tmp/serf-munin.sh
#!/bin/sh

while read line
do
  echo ${line}
    HOSTNAME=`echo ${line} | cut -d ' ' -f 1`
    ADDRESS=`echo ${line} | cut -d ' ' -f 2`
    GROUP=`echo ${line} | cut -d ' ' -f 3`

    case ${SERF_EVENT} in
    "member-join")
      cat << __EOF__ > "/etc/munin/conf.d/${HOSTNAME}.conf"
[${GROUP};${HOSTNAME}]
    address ${ADDRESS}
    use_node_name yes
__EOF__
;;
    "member-leave" | "member-failed")
      rm -f /etc/munin/conf.d/${HOSTNAME}.conf;;
    \?)
      echo "other";;
    esac
    break
done 

exit 0
EOF

sudo mv /tmp/serf-munin.sh /usr/local/bin/serf-munin.sh
sudo chmod 755 /usr/local/bin/serf-munin.sh

# Configure the agent
cat <<EOF >/tmp/agent.conf
description "Serf agent"

start on runlevel [2345]
stop on runlevel [!2345]

exec /usr/local/bin/serf agent \\
  -event-handler="/usr/local/bin/serf-munin.sh" \\
  -role=${SERF_ROLE} >>/var/log/serf.log 2>&1
EOF
sudo mv /tmp/agent.conf /etc/init/serf.conf

# Start the agent!
sudo start serf

この状態で既に/etc/munin/conf.d/${HOSTNAME}.confというファイルが出来上がって、

1
2
3
[manage;manage001.foobar.com]
    address 127.0.0.1
    use_node_name yes

というような内容になっている。

munin-node側の設定

MUNIN_SERVERにmuninサーバのIPもしくはfqdnを設定。MUNIN_SERVERで指定したサーバに serf joinしに行きます。 SERF_ROLEはmuninのconf内でgroupに利用するために設定してます。 例ではwebというroleを設定しており、実環境でもwebdbbackupなどとroleを設定してます。

作業の流れは

  1. Serfをダウンロードして、/usr/local/bin/serfに設置
  2. Serfの起動スクリプトを作成
  3. Serfの起動
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
export MUNIN_SERVER=192.168.100.100
export SERF_ROLE=web

sudo yum install -y unzip

# Download and install Serf
cd /tmp
until wget -O serf.zip https://dl.bintray.com/mitchellh/serf/0.2.0_linux_amd64.zip; do
  sleep 1
done
unzip serf.zip
sudo mv serf /usr/local/bin/serf
rm serf.zip

# Configure the agent
cat <<EOF >/tmp/agent.conf
description "Serf agent"

start on runlevel [2345]
stop on runlevel [!2345]

exec /usr/local/bin/serf agent \\
  -join=${MUNIN_SERVER} \\
  -role=${SERF_ROLE} >>/var/log/serf.log 2>&1
EOF
sudo mv /tmp/agent.conf /etc/init/serf.conf

# Start the agent!
sudo start serf

この状態で既に/etc/munin/conf.d/${HOSTNAME}.confというファイルが出来上がって、

1
2
3
[web;web001.foobar.com]
    address 172.18.100.109
    use_node_name yes

というような内容になっていて、

1
sudo stop serf

でSerfと止めると、confが削除されるのが分かる。

Serf 0.2.0になって、serf agent join="IP"みたいなことが出来るようになっていて起動スクリプトもシンプルになった。 やってることは非常に単純でSerfの設置、スクリプト設置だけなのでpuppet化も非常に楽。

Serf 0.2.0の変更点は@zembutsuさんのブログが非常に参考になります。素晴らしいエントリ!!

担当しているサービス用にインストール用のwrapperスクリプトを公開しているので、参考にどうぞ。

Serf 0.2.0から暗号化も可能になったので、これでサーバ起動して、Puppet流せば、 新規サーバのmuninグラフが勝手に出来上がる仕組みが出来上がった。

参考

Comments