ども、cloudpackかっぱ (@inokara) です。

ニーズの有無は置いといて

HAProxy で HAProxy 自体のプロセスは生かしたまま frontend を有効、無効にするスクリプトを作ったのでメモ。

HAProxy の stats 機能を使う

HAProxy は stats を有効にすればコマンドラインからバックエンドサーバーの切り離しや frontend を有効にしたり無効にしたいすることが出来る。

例えば、以下の様な設定があったとする。

global
  log 127.0.0.1 local0
  log 127.0.0.1 local1 notice
  maxconn 4096
  daemon
  stats socket /var/run/haproxy.sock mode 644 level admin
(snip)

defaults
  log   global
(snip)

frontend balancer-test01
  monitor-uri /b1
  mode http
  option forwardfor
  bind 0.0.0.0:80

listen stats 0.0.0.0:1919
  mode http
  stats enable
  stats uri  /haproxy?stats
  stats auth  admin:AdMiN123

以下のように実行することで frontend balancer-test01 を一時的に無効にすることが出来る。

echo "disable frontend balancer-test01" | sudo socat stdio /var/run/haproxy.sock

確認。

$ echo "show stat" | sudo socat stdio /var/run/haproxy.sock | grep balancer-test01
balancer-test01,FRONTEND,,,0,100,2000,151,144747,27650,0,0,1,,,,,STOP,,,,,,,,,1,2,0,,,,0,0,0,100,,,,0,0,0,100,51,0,,0,100,151,,,0,0,0,0,,,,,,,,

STOP が確認出来る。

有効にする場合には以下のように実行する。

$ echo "enable frontend balancer-test01" | sudo socat stdio /var/run/haproxy.sock

確認。

$ echo "show stat" | sudo socat stdio /var/run/haproxy.sock | grep balancer-test01
balancer-test01,FRONTEND,,,0,100,2000,181,145557,34010,0,0,1,,,,,OPEN,,,,,,,,,1,2,0,,,,0,1,0,100,,,,0,0,0,100,81,0,,1,100,181,,,0,0,0,0,,,,,,,,

OPEN が確認出来る。

ということでスクリプト

特になんのひねりもないけど。

#!/bin/bash

stats="/var/run/haproxy.sock"

function haproxy_maint() {
  for i in `echo "show stat" | socat stdio ${stats} | grep FRONTEND | awk -F"," '{print $1}'`
  do
    if [ $i != "stats" -a $1 != "status" ];then
      echo "$1 frontend $i" | socat stdio ${stats > /dev/null
      echo "$i $1d"
    else
      status_result=`echo "show stat" | socat stdio ${stats} | grep FRONTEND | grep $i | awk -F"," '{print $18}'`
      echo "frontend $i $1 $status_result"
    fi
  done
}

case $1 in
  status_haproxy)
    haproxy_maint status
    ;;
  enable_haproxy)
    haproxy_maint enable
    ;;
  disable_haproxy)
    haproxy_maint disable
    ;;
  *)
    echo $"Usage: $0 {maint_all|status_haproxy|enable_haproxy|disable_haproxy}"
esac

とりあえず実行すると以下のように。 /var/run/haproxy.sock についている権限次第になるが、今回は sudo をつけて実行する。

$ sudo ./haproxy-maint.sh
Usage: ./haproxy-maint.sh {status_haproxy|enable_haproxy|disable_haproxy}

現在の状態を確認する為に status_haproxy を実行する。

$ sudo ./haproxy-maint.sh status_haproxy
frontend balancer-test01 status OPEN
frontend balancer-test02 status OPEN
frontend stats status OPEN
frontend statistics status OPEN

上記のように、現在の frontend の状態が出力される。とりあえず、現在は全ての frontendOPEN の状態。

次に frontend を全て無効にする。

$ sudo ./haproxy-maint.sh disable_haproxy
balancer-test01 disabled
balancer-test02 disabled
frontend stats disable OPEN
statistics disabled

listen stats 0.0.0.0:1919 は敢えて無効にしないようにしている(ブラウザでもステータスを確認することがある為)。そして、念のために確認。

$ echo "show stat" | sudo socat stdio /var/run/haproxy.sock | grep FRONTEND
balancer-test01,FRONTEND,,,0,100,2000,622,157464,127502,0,0,1,,,,,STOP,,,,,,,,,1,2,0,,,,0,0,0,100,,,,0,0,0,100,522,0,,0,100,622,,,0,0,0,0,,,,,,,,
balancer-test02,FRONTEND,,,2,2,2000,46,0,8228,0,0,44,,,,,STOP,,,,,,,,,1,3,0,,,,0,0,0,1,,,,0,0,0,44,0,0,,0,1,44,,,0,0,0,0,,,,,,,,
stats,FRONTEND,,,0,0,2000,0,0,0,0,0,0,,,,,OPEN,,,,,,,,,1,6,0,,,,0,0,0,0,,,,0,0,0,0,0,0,,0,0,0,,,0,0,0,0,,,,,,,,
statistics,FRONTEND,,,0,0,2000,0,0,0,0,0,0,,,,,STOP,,,,,,,,,1,7,0,,,,0,0,0,0,,,,0,0,0,0,0,0,,0,0,0,,,0,0,0,0,,,,,,,,

ALL STOP になっている。

次に frontend を一気に有効に。

$ sudo ./haproxy-maint.sh enable_haproxy
balancer-test01 enabled
balancer-test02 enabled
frontend stats enable OPEN
statistics enabled

念のため確認。

$ echo "show stat" | sudo socat stdio /var/run/haproxy.sock | grep FRONTEND
balancer-test01,FRONTEND,,,0,100,2000,608,157086,124534,0,0,1,,,,,OPEN,,,,,,,,,1,2,0,,,,0,1,0,100,,,,0,0,0,100,508,0,,1,100,608,,,0,0,0,0,,,,,,,,
balancer-test02,FRONTEND,,,2,2,2000,46,0,8228,0,0,44,,,,,OPEN,,,,,,,,,1,3,0,,,,0,0,0,1,,,,0,0,0,44,0,0,,0,1,44,,,0,0,0,0,,,,,,,,
stats,FRONTEND,,,0,0,2000,0,0,0,0,0,0,,,,,OPEN,,,,,,,,,1,6,0,,,,0,0,0,0,,,,0,0,0,0,0,0,,0,0,0,,,0,0,0,0,,,,,,,,
statistics,FRONTEND,,,0,0,2000,0,0,0,0,0,0,,,,,OPEN,,,,,,,,,1,7,0,,,,0,0,0,0,,,,0,0,0,0,0,0,,0,0,0,,,0,0,0,0,,,,,,,,

とりあえず

誰得な内容だけど自分得だからいいや。

元記事はこちらです。
誰得?HAProxy の frontend を無効にしたり有効にしたりするスクリプト