CUBE SUGAR CONTAINER

技術系のこと書きます。

keepalived のログを rsyslog と logrotate でローテーションする

今回はホストの冗長化するのに使う keepalived のログを rsyslog と logrotate を使ってローテーションさせる方法について書く。

検証環境には CentOS7 を使った。

$ cat /etc/redhat-release 
CentOS Linux release 7.1.1503 (Core) 
$ uname -r
3.10.0-229.11.1.el7.x86_64

デフォルトの状態で keepalived を動かす

まずは keepalived と rsyslog をインストールしておく。

$ sudo yum -y install keepalived rsyslog

今回は keepalived を動かすこと自体が目的ではないので設定は最低限に留める。 以下の設定で enp0s8 インターフェースに仮想 IP アドレス (VIP) を付けることができる。 通常であればこれ以外にも LVS (IPVS) や HAProxy などの設定を行うことになる。

$ cat << EOF | sudo tee /etc/keepalived/keepalived.conf > /dev/null
vrrp_instance VipInstance {
    state BACKUP
    interface enp0s8
    virtual_router_id 51
    priority 100
    advert_int 1
    garp_master_delay 5
    nopreempt
    virtual_ipaddress {
        192.168.33.100/24 dev enp0s8
    }
}
EOF

VIP を付ける先の enp0s8 インターフェースはこんな状態。 現状では 192.168.33.10/24 が IP アドレスとして付与されている。

$ ip addr show enp0s8
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:8e:c3:94 brd ff:ff:ff:ff:ff:ff
    inet 192.168.33.10/24 brd 192.168.33.255 scope global enp0s8
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe8e:c394/64 scope link 
       valid_lft forever preferred_lft forever

とりあえずはデフォルトの状態での挙動を確認しておこう。 keepalived のサービスを開始する。

$ sudo systemctl start keepalived
$ sudo systemctl enable keepalived

上手くいけば enp0s8 インターフェースに VIP の 192.168.33.100/24 が付与される。

$ ip addr show enp0s8
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:8e:c3:94 brd ff:ff:ff:ff:ff:ff
    inet 192.168.33.10/24 brd 192.168.33.255 scope global enp0s8
       valid_lft forever preferred_lft forever
    inet 192.168.33.100/24 scope global secondary enp0s8
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe8e:c394/64 scope link 
       valid_lft forever preferred_lft forever

そして、デフォルトでは keepalived のログが /var/log/messages に出力されている。

$ sudo cat /var/log/messages | tail
Aug 19 18:33:37 localhost Keepalived_healthcheckers[13323]: Registering Kernel netlink command channel
Aug 19 18:33:37 localhost Keepalived_healthcheckers[13323]: Opening file '/etc/keepalived/keepalived.conf'.
Aug 19 18:33:37 localhost Keepalived_healthcheckers[13323]: Configuration is using : 5197 Bytes
Aug 19 18:33:37 localhost Keepalived_healthcheckers[13323]: Using LinkWatch kernel netlink reflector...
Aug 19 18:33:40 localhost Keepalived_vrrp[13324]: VRRP_Instance(VipInstance) Transition to MASTER STATE
Aug 19 18:33:41 localhost Keepalived_vrrp[13324]: VRRP_Instance(VipInstance) Entering MASTER STATE
Aug 19 18:33:41 localhost Keepalived_vrrp[13324]: VRRP_Instance(VipInstance) setting protocol VIPs.
Aug 19 18:33:41 localhost Keepalived_vrrp[13324]: VRRP_Instance(VipInstance) Sending gratuitous ARPs on enp0s8 for 192.168.33.100
Aug 19 18:33:41 localhost Keepalived_healthcheckers[13323]: Netlink reflector reports IP 192.168.33.100 added
Aug 19 18:33:46 localhost Keepalived_vrrp[13324]: VRRP_Instance(VipInstance) Sending gratuitous ARPs on enp0s8 for 192.168.33.100

ログをローテーションさせる

ここからは keepalived のログをローテーションさせるための設定に入る。 まずは現状で /var/log/messages に書き込まれているログを別の場所に書き込むように変更したい。 そこで、デフォルトの状態では 'LOG_DAEMON' になっている keepalived のログファシリティを変更する。

$ cat /etc/sysconfig/keepalived
# Options for keepalived. See `keepalived --help' output and keepalived(8) and
# keepalived.conf(5) man pages for a list of all options. Here are the most
# common ones :
#
# --vrrp               -P    Only run with VRRP subsystem.
# --check              -C    Only run with Health-checker subsystem.
# --dont-release-vrrp  -V    Dont remove VRRP VIPs & VROUTEs on daemon stop.
# --dont-release-ipvs  -I    Dont remove IPVS topology on daemon stop.
# --dump-conf          -d    Dump the configuration data.
# --log-detail         -D    Detailed log messages.
# --log-facility       -S    0-7 Set local syslog facility (default=LOG_DAEMON)
#

KEEPALIVED_OPTIONS="-D"

設定ファイルに書かれている通りに 'KEEPALIVED_OPTIONS' の設定に -S オプションを追加する ここではパラメータに 7 を指定することで、ファシリティを local7 に変更しておく。 これは、他で使っていないものであれば何を使っても構わない構わない。

$ sudo sed -i.back -e 's:^KEEPALIVED_OPTIONS="-D"$:KEEPALIVED_OPTIONS="-D -S 7":' /etc/sysconfig/keepalived
$ cat /etc/sysconfig/keepalived | grep KEEPALIVED_OPTIONS
KEEPALIVED_OPTIONS="-D -S 7"

次に syslog を受信する rsyslog 側の設定でファシリティ local7 のものは全て /var/log/keepalived/keepalived.log に記録するようにしておく。

$ cat << EOF | sudo tee /etc/rsyslog.d/keepalived.conf > /dev/null
local7.* /var/log/keepalived/keepalived.log
EOF

あとは上記のログをローテーションするように logrotate の設定も入れておく。

$ cat << EOF | sudo tee /etc/logrotate.d/keepalived > /dev/null
/var/log/keepalived/keepalived.log {
    dateext
    hourly
    missingok
    rotate 3
    notifempty
    nocompress
    sharedscripts
    delaycompress
    postrotate
        /bin/kill -HUP \`cat /var/run/syslogd.pid 2> /dev/null\` 2> /dev/null || true
        /bin/kill -HUP \`cat /var/run/rsyslogd.pid 2> /dev/null\` 2> /dev/null || true
    endscript
}
EOF

準備ができたら rsyslog と keepalived を再起動する。

$ sudo systemctl restart rsyslog
$ sudo systemctl restart keepalived

これで keepalived のログが /var/log/keepalived/keepalived.log に記録されるようになる。

$ sudo cat /var/log/keepalived/keepalived.log | tail
Aug 19 18:44:02 localhost Keepalived_vrrp[13361]: Opening file '/etc/keepalived/keepalived.conf'.
Aug 19 18:44:02 localhost Keepalived_vrrp[13361]: Configuration is using : 59637 Bytes
Aug 19 18:44:02 localhost Keepalived_vrrp[13361]: Using LinkWatch kernel netlink reflector...
Aug 19 18:44:02 localhost Keepalived_vrrp[13361]: VRRP_Instance(VipInstance) Entering BACKUP STATE
Aug 19 18:44:02 localhost Keepalived_vrrp[13361]: VRRP sockpool: [ifindex(3), proto(112), unicast(0), fd(10,11)]
Aug 19 18:44:06 localhost Keepalived_vrrp[13361]: VRRP_Instance(VipInstance) Transition to MASTER STATE
Aug 19 18:44:07 localhost Keepalived_vrrp[13361]: VRRP_Instance(VipInstance) Entering MASTER STATE
Aug 19 18:44:07 localhost Keepalived_vrrp[13361]: VRRP_Instance(VipInstance) setting protocol VIPs.
Aug 19 18:44:07 localhost Keepalived_vrrp[13361]: VRRP_Instance(VipInstance) Sending gratuitous ARPs on enp0s8 for 192.168.33.100
Aug 19 18:44:07 localhost Keepalived_healthcheckers[13360]: Netlink reflector reports IP 192.168.33.100 added

ローテーションに関しても動作も確認しておこう。 強制的にローテーションさせるために logrotate コマンドを実行する。

$ sudo logrotate -fv /etc/logrotate.d/keepalived
reading config file /etc/logrotate.d/keepalived

Handling 1 logs

rotating pattern: /var/log/keepalived/keepalived.log  forced from command line (3 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/keepalived/keepalived.log
  log needs rotating
rotating log /var/log/keepalived/keepalived.log, log->rotateCount is 3
dateext suffix '-2015081918'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding old rotated logs failed
renaming /var/log/keepalived/keepalived.log to /var/log/keepalived/keepalived.log-2015081918
running postrotate script

ディレクトリを確認すると、これまでのログがリネームされていることがわかる。

$ sudo ls /var/log/keepalived/
keepalived.log-2015081918

元の名前のファイルがないのはまだ新しいログが出力されていないためなので、keepalived のサービスを再起動したりすればできる。

$ sudo systemctl restart keepalived
$ sudo ls /var/log/keepalived/
keepalived.log    keepalived.log-2015081918

いじょう。

まとめ

今回は keepalived のログを syslog で飛ばして、それを rsyslog と logrotate でローテーションさせる方法について扱った。 ホストを運用する上でログの管理は重要なので、ローテーションの設定は必ず入れておきたい。