现主要用来在检测到域名变动时,更新haproxy配置文件。
然而haproxy可以自动完成这个功能,所以以下不用看了(除了参考一些shell的写法)。
#!/bin/bash
[[ "$EUID" -ne '0' ]] && echo "Error:This script must be run as root!" && exit 1
haproxypath='/etc/haproxy'
haproxyprofile=${haproxypath}/haproxy.cfg
backendpath=${haproxypath}/backend
domainhost='inputyourdomainhere'
mkdir -p ${backendpath}
#check time s
SLEEPT=30
nameserver1=8.8.8.8
nameserver2=8.8.4.4
which nslookup >/dev/null 2>&1 || yum install bind-utils -y
which tcping >/dev/null 2>&1 || (
yum install epel-release -y
yum install tcping -y
)
function AlertSend() {
#alert message code
echo "$1"
}
function echo_red() {
echo -e "\033[41;37m$1\033[0m"
}
function echo_green() {
echo -e "\033[32m$1\033[0m"
}
function echo_yellow() {
echo -e "\033[33m$1\033[0m"
}
function status() {
case $1 in
ON)
echo_yellow "WUP"
;;
OFF)
echo "OK"
;;
ERR)
echo_red "Resolv Failed"
;;
DOWN)
echo_red "Dis Con"
;;
*)
echo_red "ERROR?"
;;
esac
}
function backendQuery() {
#echo backendQuery
for portsfile in ${backendpath}/*; do
echo_green "\n==>\t${portsfile##*/}"
echo -e "\tid\tdomain\t\t\tport\tIP\t\tweight\tstatu"
(grep -v '^$' ${portsfile} | cat -n) | while read portline; do
dp=$(echo $portline | awk -F '|' '{print $1}' | awk '{print $2}')
dip=$(echo $portline | awk -F '|' '{print $2}')
echo -e "\t$(echo $portline | awk -F '|' '{print $1}' | awk '{print $1}')\t${dp%%:*}\t${dp##*:}\t$([ "${dip}" == "" ] && echo -e '空\t' || echo ${dip})\t$(echo $portline | awk -F '|' '{print $3}')\t$(status $(echo $portline | awk -F '|' '{print $4}'))"
done
done
}
function backendCheck() {
#echo backendCheck
for portsfile in ${backendpath}/*; do
(grep -vn '^$' ${portsfile}) | while read portline; do
domain=$(echo $portline | awk -F '|' '{print $1}' | awk -F ':' '{print $2}')
dip=$(echo $portline | awk -F '|' '{print $2}')
newIP=$(nslookup $domain $nameserver1 | grep 'Address:' | grep -v "$nameserver1" | tail -n1 | awk '{print $NF}')
port=$(echo $portline | awk -F '|' '{print $1}' | awk -F ':' '{print $3}')
if [ "$dip" != "$newIP" ]; then
id=$(echo $portline | awk -F '|' '{print $1}' | awk -F ':' '{print $1}')
weight=$(echo $portline | awk -F '|' '{print $3}')
sed -i "${id}a${domain}:${port}|${newIP}|${weight}|ON" $portsfile && sed -i "${id}d" $portsfile
if [ $? != 0 ]; then
LocalIP=$(curl -s http://ipv4.icanhazip.com)
AlertSend "#warning ${HOSTNAME} ${LocalIP} : ${portsfile##*/} 's backend ${domain} resolve ${newIP},when check domain"
fi
fi
done
done
}
function backendInstall() {
[[ "$EUID" -ne '0' ]] && echo "Error:This script must be run as root!" && exit 1
echo "[Unit]
Description=haproxyManager
After=network-online.target
Wants=network-online.target
[Service]
WorkingDirectory=/etc/haproxy
EnvironmentFile=
ExecStart=/bin/bash /etc/haproxy/haproxy_manager.sh -s
Restart=always
RestartSec=30
[Install]
WantedBy=multi-user.target " >/lib/systemd/system/haproxym.service
if [ $? != 0 ]; then
echo_red "install to service failed!"
exit 1
fi
systemctl enable haproxym
if [ $? != 0 ]; then
echo_red "enable startup service failed!"
exit 1
fi
systemctl start haproxym
if [ $? != 0 ]; then
echo_red "start service failed!"
exit 1
fi
}
function backendWriteProfile() {
mkdir -p ${haproxypath}/cfgback
cp ${haproxypath}/haproxy.cfg ${haproxypath}/cfgback/haproxy.cfg.$(date "+%Y%m%d%H%M%S")
case $1 in
dns)
doway=$1
;;
ip)
doway=$1
;;
*)
optionError "$1"
;;
esac
echo "global
#log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn $(($(ulimit -n)/2))
user haproxy
group haproxy
daemon
defaults
mode tcp
#log global
#option tcplog
#option dontlognull
#option http-server-close
#option forwardfor except 127.0.0.0/8
option redispatch
maxconn $(($(ulimit -n)/2))
retries 3
#timeout http-request 10s
timeout queue 1m
timeout connect 360s
timeout client 10m
timeout server 10m
#timeout http-keep-alive 10s
#timeout check 10s
listen admin_status
bind 0.0.0.0:1189
mode http
stats refresh 30s
stats uri /whatever
stats auth admin:yourpasswd
#stats hide-version
stats admin if TRUE
resolvers mydns
nameserver dns1 8.8.8.8:53
nameserver dns2 8.8.4.4:53
resolve_retries 3
timeout retry 2s
hold valid 10s
" >${haproxyprofile}
for portsfile in ${backendpath}/*; do
echo -e "\nlisten ${portsfile##*/}" >>${haproxyprofile}
echo " bind *:${portsfile##*/}" >>${haproxyprofile}
echo " balance source" >>${haproxyprofile}
(grep -vn '^$' ${portsfile} | grep -E 'ON|OFF') | while read portline; do
domain=$(echo $portline | awk -F '|' '{print $1}' | awk -F ':' '{print $2}')
dip=$(echo $portline | awk -F '|' '{print $2}')
port=$(echo $portline | awk -F '|' '{print $1}' | awk -F ':' '{print $3}')
weight=$(echo $portline | awk -F '|' '{print $3}')
if [ "$doway" == "dns" ]; then
echo " server ${domain%%.*}:${port} ${domain}:${port} maxconn 20480 weight ${weight} rise 2 fall 3 check inter 2000 resolvers mydns" >>${haproxyprofile}
elif [ "$doway" == "ip" ]; then
echo " server ${domain}:${port} ${dip}:${port} maxconn 20480 weight ${weight} rise 2 fall 3 check inter 2000" >>${haproxyprofile}
fi
done
done
}
function backendProfileReload() {
(grep -v '^$' ${haproxyprofile}) | while read profileline; do
#port
if $(echo $profileline | grep -qE '^listen [0-9]{3,4}$'); then
port=$(echo $profileline | awk '{print $2}')
cd . >${backendpath}/${port}
fi
#server
if $(echo $profileline | grep 'server ' | grep -q ' weight '); then
if $(echo $profileline | awk -F '[ :]+' '{print $2}' | grep -q "${domainhost}"); then
echo "$(echo $profileline | awk -F '[ :]+' '{print $2":"$5"|"$4"|"$9"|OFF"}')" >>${backendpath}/${port}
else
echo "$(echo $profileline | awk -F '[ :]+' '{print $4":"$5"|"$4"|"$9"|OFF"}')" >>${backendpath}/${port}
fi
fi
done
}
function backendService() {
while true; do
backendQuery
sleep $SLEEPT
done
}
function optionError() {
if [[ "$1" != 'error' ]]; then echo -ne "\nInvaild option: '$1'\n\n"; fi
echo -e "Usage:"
echo -e "\t-c/--check\t Check all domain's ip in the backend file, if changes, set ON label, plan to reload haproxy."
echo -e "\t-q/--query\t Display the status of all the backend profile."
echo -e "\t-i/--install\t Install $(basename $0) into service on CENTOS 7."
echo -e "\t-s/--service\t Do check every $SLEEPT seconds. You can change this time by edit \$SLEEPT in $(basename $0)."
exit 1
}
while [[ $# -ge 1 ]]; do
case $1 in
-c | --check)
shift
backendCheck
;;
-q | --query)
shift
backendQuery
;;
-i | --install)
shift
backendInstall
;;
-s | --service)
shift
backendService
;;
-w | --write)
#write config to haproxy.cfg
shift
if [ 1"$1" == 1"" ]; then
doway=dns
elif [ "$1" == "dns" ]; then
doway=dns
elif [ "$1" == "ip" ]; then
doway=ip
else
optionError "$1"
fi
backendWriteProfile "$1"
shift
;;
-r | --reload)
#load config from haproxy.cfg
shift
backendProfileReload
;;
*)
optionError
;;
esac
done
© 著作权归作者所有
文章评论(0)