LVS keepalive VRRP DSR構成 でkeepalive.confを自動生成するスクリプト

LVS keepalive構成で、keepalive.confが単一ファイルであるため、メンテナンスが非常にめんどうです。そこで、コンフィグファイルを複数に分けてmakeでコンフィグファイルをmakeするといったことはklabさんとかでもされているようです。しかし、klabさんでもこの部分は公開されておらず、また、なかなか公開しているところもないようですので、オリジナルのものを晒してみます。

ルータのarpテーブルのキャッシュを強制クリアするスクリプト

#!/bin/bash

echo 1 > /proc/sys/net/ipv4/ip_nonlocal_bind
/sbin/arping -I eth0 -c 3 -U -s LVS 仮想IPアドレス ルーターIPアドレス
echo 0 > /proc/sys/net/ipv4/ip_nonlocal_bind

keepalived.confを生成するスクリプト

#!/bin/bash
cd /etc/keepalived/vsg/
if [ -f vrrp.conf ];then
  cat vrrp.conf
fi
echo
for vsg in *; do
  if [ -d $vsg ]; then
    echo "virtual_server_group $vsg {"
    for vs in $vsg/*.*.*.*;do echo -n "  `basename $vs` ";cat $vs;done
    echo "}"
    echo
    echo "virtual_server group $vsg {"
    if [ -f $vsg/vs.conf ];then
      cat $vsg/vs.conf
    fi
    if [ -d $vsg/real ];then
      for f in $vsg/real/*.*.*.*;do echo -n "  real_server `basename $f` ";cat $f;done
    fi
    echo "}"
    echo
  fi;
done

keepalived.confを生成するMakefile

keepalivedの制御・configのコピーをもできる。

restart:
        @echo "再起動"
        @service keepalived restart
sync:
        @echo "keepalived.confを同期"
        @cat /etc/keepalived/keepalived.conf |sed 's/priority 101/priority 100/g' |ssh root@lv2 'cat > /etc/keepalived/keepalived.conf'
rrestart:
        @echo "リモートサーバー再起動"
        @ssh lv2 'service keepalived restart'
makeconf:
        @echo "コンフィグのチェックアウト"
        @co -l keepalived.conf
        @./bin/makeconf.sh > keepalived.conf
        @echo "コンフィグ作成中"
        @echo "コンフィグのチェックイン"
        @ci -u keepalived.conf

設定ファイル

/etc/keepalived/vrrp/vsg/以下にファイルを置いて書く
直下のvrrp.confはvrrpの設定

vrrp_instance VI {
  state BACKUP
  interface eth0
  lvs_sync_daemon_interface eth0
  garp_master_delay 5
  virtual_router_id 1
  priority 101
  nopreempt
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass パスワード
  }
  virtual_ipaddress {
    LVS 仮想IPアドレス/24 dev eth0
  }
  notify_master /etc/keepalived/bin/arping.sh
}
la -al /etc/keepalived/vrrp/vsg/
DNS
HTTP
SMTP
SSH
vrrp.conf

それぞれのプロトコルの設定をvs.confで設定。以下はHTTPの場合をサンプルで

  delay_loop  3
  lvs_sched   rr
  lvs_method  DR
  protocol    TCP
  virtualhost ヴァーチャルホスト名
  sorry_server <ソーリーサーバーIP> 80

ディレクトリに対象IPアドレスのファイルを作り、対象Portを記述

80
||
>|sh|
cat 80 > 10.0.0.1-20

などとして作る。

次はディレクトリrealをつくりそこでrealサーバーの設定を置く

はrealサーバーの設定が冗長になりがちなので、テンプレートファイルを以下のように作り

80 {
    weight 1
    inhibit_on_failure
    HTTP_GET {
      url {
        path /
        status_code 200
      }
      connect_timeout 3
    }
  }
ls -al /etc/keepalived/vrrp/vsg/HTTP/real/template
10.0.0.50 -> template
template
ln -s template 10.0.0.51

のようにシンボリックリンクを作成して使う。

*1:Virtual Server Group

*2:でなくてもよい。わかりやすい名前を付ける