环境如图:
简单环境搭建:
keepalived
MASTER38
root@38:~# vim /etc/keepalived/keepalived.conf
...
vrrp_instance VI_1 {
state MASTER
interface eth0
garp_master_delay 10
#smtp_alert
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.88 dev eth0 label eth0:1
}
}
BACKUP
root@48:~# vim /etc/keepalived/keepalived.conf
...
vrrp_instance VI_1 {
state BACKUP
interface eth0
garp_master_delay 10
#smtp_alert
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.88 dev eth0 label eth0:1
}
}
haproxy
38
root@38:~# echo >> "net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.conf
root@38:~# sysctl -p
net.ipv4.ip_nonlocal_bind = 1
root@38:~# sysctl -a | grep nonlocal
net.ipv4.ip_nonlocal_bind = 1
root@38:~# vim /etc/haproxy/haproxy.cfg
...
listen tomcat-web-80
bind 10.0.0.88:80
mode http
balance roundrobin
server tomcat-1 10.0.0.58:8080 check inter 3s fall 3 rise 3
server tomcat-2 10.0.0.68:8080 check inter 3s fall 3 rise 3
listen status
bind :9009
stats enable
stats uri /haproxy-status
stats realm HAProxy\ Stats\ Page
stats auth haadmin:lijie
stats auth admin:lijie
48
root@48:~# echo >> "net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.conf
root@48:~# sysctl -p
net.ipv4.ip_nonlocal_bind = 1
root@48:~# sysctl -a | grep nonlocal
net.ipv4.ip_nonlocal_bind = 1
root@48:~# vim /etc/haproxy/haproxy.cfg
...
listen tomcat-web-80
bind 10.0.0.88:80
mode http
server tomcat-1 10.0.0.58:8080 check inter 3s fall 3 rise 3
server tomcat-2 10.0.0.68:8080 check inter 3s fall 3 rise 3
listen status
bind :9009
stats enable
stats uri /haproxy-status
stats realm HAProxy\ Stats\ Page
stats auth haadmin:lijie
stats auth admin:lijie
tomcat
略
appBase目录如下
<Host name="localhost" appBase="/data/tomcat/tomcat_webapps"
unpackWARs="true" autoDeploy="true">
root@58:~# hostname -I > /data/tomcat/tomcat_webdir/myapp/index.jsp
root@58:~# tree /data/tomcat/
/data/tomcat/
├── tomcat_appdir
├── tomcat_webapps
│ └── myapp -> /data/tomcat/tomcat_webdir/myapp
└── tomcat_webdir
└── myapp
└── index.jsp
root@68:~# hostname -I > /data/tomcat/tomcat_webdir/myapp/index.jsp
root@68:~# tree /data/tomcat/
/data/tomcat/
├── tomcat_appdir
├── tomcat_webapps
│ └── myapp -> /data/tomcat/tomcat_webdir/myapp/
└── tomcat_webdir
└── myapp
└── index.jsp
5 directories, 1 file
访问测试
root@18:~# curl http://10.0.0.88/myapp/
10.0.0.58
root@18:~# curl http://10.0.0.88/myapp/
10.0.0.68
root@18:~# curl http://10.0.0.88/myapp/
10.0.0.58
root@18:~# curl http://10.0.0.88/myapp/
10.0.0.68
jenkins的job脚本
代码clone:
首先需要完成gitlab中添加jenkins的公钥作为ssh-key实现非交互式代码克隆
代码部署:
需要将jenkins的公钥推送到web服务器,实现代码非交互式拷贝;
root@28:~# ssh-copy-id root@10.0.0.68
root@28:~# ssh-copy-id root@10.0.0.58
root@28:~# ssh root@10.0.0.68 'hostname -I'
10.0.0.68
root@28:~# ssh root@10.0.0.58 'hostname -I'
10.0.0.58
部署脚本
#!/bin/bash
DATE=`date +%Y-%m-%d_%H_%M_%S`
METHOD=$1
BRANCH=$2
GROUP_LIST=$3
HA1="10.0.0.38"
HA2="10.0.0.48"
OK_COLOR="echo -e \e[1;32m"
ERR_COLOR="echo -e \e[1;35m"
END="\e[0m"
host_list(){
if [ ${GROUP_LIST} = group1 ];then
hosts="10.0.0.58"
elif [ ${GROUP_LIST} = group2 ];then
hosts="10.0.0.68"
else
hosts="10.0.0.58 10.0.0.68"
fi
}
code_clone(){
cd /data/gitdata/ && rm -rf ./*
${OK_COLOR} "开始clone ${BRANCH}分支代码到`pwd`" ${END}
git clone -b ${BRANCH} git@10.0.0.18:magedu/test.git && echo "代码克隆完成" && echo "代码克隆完成"
}
code_scanner(){
echo "开始代码扫描"
}
code_compress(){
cd /data/gitdata/test && tar czvf code.tar.gz ./index.html && echo "代码打包完成"
}
node_down(){
ssh root@${HA1} "echo "disable server tomcat-web-80/${node}" | socat stdio /run/haproxy/admin.sock" && echo ${hosts}从HA1下线成功
ssh root@${HA2} "echo "disable server tomcat-web-80/${node}" | socat stdio /run/haproxy/admin.sock" && echo ${hosts}从HA2下线成功
}
tomcat_down(){
echo "${node}即将停止tomcat服务"
ssh root@${node} "/apps/tomcat/bin/catalina.sh stop" && echo "tomcat服务已停止"
sleep 1 && echo 3
sleep 1 && echo 2
sleep 1 && echo 1
}
code_deploy(){
scp /data/gitdata/test/code.tar.gz root@${node}:/data/tomcat/tomcat_appdir/code-${DATE}.tar.gz && echo "${node}代码拷贝完成"
ssh root@${node} "mkdir /data/tomcat/tomcat_webdir/code-${DATE} && tar xzvf /data/tomcat/tomcat_appdir/code-${DATE}.tar.gz -C /data/tomcat/tomcat_webdir/code-${DATE} && rm -rf /data/tomcat/tomcat_webapps/myapp && ln -sv /data/tomcat/tomcat_webdir/code-${DATE} /data/tomcat/tomcat_webapps/myapp"
}
tomcat_up(){
echo "${node}正在启动tomcat"
ssh root@${node} "/apps/tomcat/bin/catalina.sh start" && echo "tomcat服务已启动"
sleep 1 && echo 3
sleep 1 && echo 2
sleep 1 && echo 1
curl http://${node}:8080/myapp && echo "${node}部署完成"
}
node_up(){
ssh root@${HA1} "echo "enable server tomcat-web-80/${node}" | socat stdio /run/haproxy/admin.sock"\
&& echo ${node}从HA1上线成功
ssh root@${HA2} "echo "enable server tomcat-web-80/${node}" | socat stdio /run/haproxy/admin.sock"\
&& echo ${node}从HA2上线成功
}
code_del(){
ssh root@${node} "rm -rf /data/tomcat/tomcat_appdir/*"
VER_NUM=`ssh root@${node} "/bin/ls -ldrt /data/tomcat/tomcat_webdir/code-* | wc -l"`
if [ ${VER_NUM} -gt 3 ];then
OLD_CODE_DIR=`ssh root@${node} ""/bin/ls -ldrt /data/tomcat/tomcat_webdir/code-* | head -n1 | awk '{print $NF}'""`
ssh root@${node} "rm -rf ${OLD_CODE_DIR}" && "旧代码${OLD_CODE_DIR}删除成功"
else
echo "旧代码未超过3个版本无需删除"
fi
}
code_rollback(){
NOW_VER=`ssh root@${node} ""/bin/ls -ld /data/tomcat/tomcat_webapps/myapp | awk '{print $NF}'""`
NOW_VER=`basename ${NOW_VER}`
echo "当前代码版本是: ${NOW_VER}"
PRE_VER=`ssh root@${node} ""/bin/ls -lrt /data/tomcat/tomcat_webdir/ | grep -B 1 ${NOW_VER} | head -n1 | awk '{print $NF}'""`
echo "前一版本: ${PRE_VER}"
ssh root@${node} "rm -rf /data/tomcat/tomcat_webapps/myapp && ln -sv /data/tomcat/tomcat_webdir/${PRE_VER} /data/tomcat/tomcat_webapps/myapp"
}
case $METHOD in
deploy)
host_list
code_clone
code_scanner
code_compress
#code_scanner
for node in ${hosts};do
node_down
tomcat_down
code_deploy
tomcat_up
node_up
code_del
done
;;
rollback)
host_list
for node in ${hosts};do
node_down
tomcat_down
code_rollback
tomcat_up
node_up
done
;;
esac