使用shell脚本完成自动化部署及秒级回滚
一、部署机代码目录结构
使用www用户进行代码部署,所有部署机上需要创建www用户,并赋予根目录权限,同时配置公私钥认证建立信任关系。
[www@ansible-node1 deploy]$ tree
.
├── code
│?? └── web-demo #存放代码
│?? ├── index.html
│?? └── \\\
├── config #存放服务器配置文件
│?? └── web-demo
│?? ├── base
│?? │?? └── config.ini
│?? └── other
│?? └── 192.168.226.130.crontab.xml #不同机器之间的差异匹配值文件
├── tar
└── tmp
二、部署节点
ip:192.168.226.130、192.168.226.132 分别模拟两个主机组来部署不同代码
web根目录: /webroot/webdemo、同时赋予www用户权限
历史代码版本保存路径: /opt/webroot、同时赋予www用户权限
三、使用gitlab来管理代码(在此不做介绍)
四、主要作用
通过脚本,模拟线上环境,实现代码的半自动化部署,以及秒级回滚。
五、脚本实现
流程:获取代码(直接拉取)-----> 编译(可选)-------> 配置文件 ------>打包 -----> scp到目标服务器---->将目标机服务器移除集群----->解压---->放置到webroot----->scp差异文件----->重启(可选)----->测试----->加入集群
[www@ansible-node1 ~]$ cat deploy.sh
#!/bin/bash #Node List
GROUP1_LIST="192.168.226.130"
GROUP2_LIST="192.168.226.132"
ROLLBACK_LIST="192.168.226.130 192.168.226.132" #Date/Time Veriables
LOG_DATE=`date "+%Y-%m-%d"`
LOG_CTIME=`date "+%H-%M-%S"` CDATE=$(date "+%Y-%m-%d")
CTIME=$(date "+%H-%M-%S") #Shell Env
SHELL_NAME="deploy.sh"
SHELL_DIR="/home/www/"
SHELL_LOG="${SHELL_DIR}/${SHELL_NAME}.log" #Code Env
PRO_NAME="web-demo"
CODE_DIR="/deploy/code/web-demo"
CONFIG_DIR="/deploy/config/web-demo"
TMP_DIR="/deploy/tmp"
TAR_DIR="/deploy/tar"
LOCK_FILE="/tmp/deploy.lock" usage(){
echo $"Usage: $0 {deploy | rollback [ list | version]}"
} writelog(){
LOGINFO=$
echo "${CDATE} ${CTIME}: ${SHELL_NAME} : ${LOGINFO}" >> ${SHELL_LOG}
} shell_lock(){
touch ${LOCK_FILE}
} shell_unlock(){
rm -rf ${LOCK_FILE}
} code_get(){
writelog code_get
cd $CODE_DIR && git pull #需要提前从git仓库clone代码到部署机代码存放目录$CODE_DIR
cp -r ${CODE_DIR} ${TMP_DIR}/
API_VERL=$(git show | grep commit | cut -d ' ' -f2)
API_VER=$(echo ${API_VERL::})
} code_build(){
echo code_build
} code_config(){
echo code_config
/bin/cp -r $CONFIG_DIR/base/* $TMP_DIR/"${PRO_NAME}"
PKG_NAME="${PRO_NAME}_"${API_VER}"_"${CDATE}-${CTIME}""
cd ${TMP_DIR} && mv ${PRO_NAME} ${PKG_NAME}
} code_tar(){
writelog "code_tar"
cd ${TMP_DIR} && tar czf ${PKG_NAME}.tar.gz ${PKG_NAME}
writelog "${PKG_NAME}.tar.gz"
} code_scp(){
writelog "code_scp"
for node in $GROUP1_LIST;do
scp ${TMP_DIR}/${PKG_NAME}.tar.gz $node:/opt/webroot
done
for node in $GROUP2_LIST;do
scp ${TMP_DIR}/${PKG_NAME}.tar.gz $node:/opt/webroot
done } cluster_node_remove(){
writelog "iluster_node_remove"
} url_test(){
URL=$1
curl -s --head $URL | grep "200 OK"
if [ $? -ne 0 ];then
shell_unlock;
writelog "test error" && exit;
fi
} group1_deploy(){
echo code_deploy
for node in $GROUP1_LIST;do
ssh $node "cd /opt/webroot && tar zxf ${PKG_NAME}.tar.gz"
ssh $node "rm -rf /webroot/web-demo && ln -sf /opt/webroot/${PKG_NAME} /webroot/web-demo"
done
} group1_test(){
url_test "http://192.168.226.130/index.html"
echo "add to cluster"
}
group2_deploy(){
echo code_deploy
for node in $GROUP2_LIST;do
ssh $node "cd /opt/webroot && tar zxf ${PKG_NAME}.tar.gz"
ssh $node "rm -rf /webroot/web-demo && ln -sf /opt/webroot/${PKG_NAME} /webroot/web-demo"
done
} group2_test(){
url_test "http://192.168.226.132/index.html"
echo "add to cluster"
} config_diff(){
echo config_diff
scp ${CONFIG_DIR}/other/192.168.226.130.crontab.xml 192.168.226.130:/webroot/web-demo/crontab.xml
} code_test(){
echo code_test
} cluster_node_in(){
echo cluster_node
} rollback_fun(){
for node in $ROLLBACK_LIST;do
ssh $node "rm -rf /webroot/web-demo && ln -sf /opt/webroot/$1 /webroot/web-demo"
done } rollback(){
if [ -z $1 ];then
shell_unlock;
echo "Please input rollback version" && exit
fi
case $1 in
list)
ssh $GROUP1_LIST "ls -l /opt/webroot/*.tar.gz"
;;
*)
rollback_fun $1
esac
} main(){
if [ -f $LOCK_FILE ];then
echo "Deploy is running" && exit;
fi
DEPLOY_METHOD=$1
ROLLBACK_VER=$2
case $DEPLOY_METHOD in
deploy) shell_lock;
code_get;
code_build;
code_config;
code_tar;
code_scp;
cluster_node_remove;
group1_deploy;
config_diff;
group1_test;
group2_deploy;
group2_test;
cluster_node_in;
shell_unlock;
;;
rollback) shell_lock
rollback $ROLLBACK_VER;
shell_unlock;
;;
*)
usage;
esac
}
main $1 $2
六、执行脚本
[www@ansible-node1 ~]$ bash deploy.sh
Usage: deploy.sh {deploy | rollback [ list | version]}
[www@ansible-node1 ~]$ bash deploy.sh deploy #部署代码 [www@ansible-node1 ~]$ bash deploy.sh rollback list #列出代码版本
-rw-rw-r-- www www Mar : /opt/webroot/web-demo_123_2018-----.tar.gz
-rw-rw-r-- www www Mar : /opt/webroot/web-demo_123_2018-----.tar.gz
-rw-rw-r-- www www Mar : /opt/webroot/web-demo_123_2018-----.tar.gz
-rw-rw-r-- www www Mar : /opt/webroot/web-demo_123_2018-----.tar.gz
-rw-rw-r-- www www Mar : /opt/webroot/web-demo_123_2018-----.tar.gz
-rw-rw-r-- www www Mar : /opt/webroot/web-demo_123_2018-----.tar.gz
-rw-rw-r-- www www Mar : /opt/webroot/web-demo_123_2018-----.tar.gz
-rw-rw-r-- www www Mar : /opt/webroot/web-demo_123_2018-----.tar.gz [www@ansible-node1 ~]$ bash deploy.sh rollback web-demo_3d9c99_2018----- #回滚到指定版本
使用shell脚本完成自动化部署及秒级回滚的更多相关文章
- kubernetes云平台管理实战: 滚动升级秒级回滚(六)
一.nginx保证有两个版本 1.查看当前容器运行nginx版本 [root@k8s-master ~]# kubectl get pod -o wide NAME READY STATUS REST ...
- Shell脚本,自动化发布tomcat项目【转载】
Shell脚本,自动化发布tomcat项目脚本. 1. vko2c_auto_build_by_scp.sh 文件内容: #---------------------start------------ ...
- Shell脚本,自动化发布tomcat项目【转】
Shell脚本,自动化发布tomcat项目脚本. 1. vko2c_auto_build_by_scp.sh 文件内容: #---------------------start------------ ...
- Dubbo入门到精通学习笔记(二):Dubbo管理控制台、使用Maven构建Dubbo的jar包、在Linux上部署Dubbo privider服务(shell脚本)、部署consumer服务
文章目录 Dubbo管理控制台 1.Dubbo管理控制台的主要作用: 2.管理控制台主要包含: 3.管理控制台版本: 安装 Dubbo 管理控制台 使用Maven构建Dubbo服务的可执行jar包 D ...
- 使用shell脚本来自动化处理我们的工作,解放双手
Shell脚本介绍 1.Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合. 2.Shell可以直接使用在wi ...
- Jenkins+maven+gitlab+shell实现项目自动化部署
确认jdk , maven,git这些已经在服务器上搭建成功,gitlab使用的是公司服务也没有进行搭建 下面是jenkins的两种搭建方式 1. 第一种比较简单下载对应jenkins.wa ...
- shell脚本编写nginx部署脚本
下面为shell脚本编写的nginx的安装及修改nginx.conf的脚本,脚本比较简单: #!/bin/bash function yum_install(){ yum install epel-r ...
- nginx之热部署,以及版本回滚
热部署的概念:当从老版本替换为新版本的nginx的时候,如果不热部署的话,会需要取消nginx服务并重启服务才能替换成功,这样的话会使正在访问的用户在断开连接,所以为了不影响用户的体验,且需要版本升级 ...
- shell脚本编写-自动部署及监控
1.编写脚本自动部署反向代理.web.nfs: I.部署nginx反向代理两个web服务,调度算法使用加权轮询 II.所有web服务使用共享存储nfs,保证所有web都对其有读写权限,保证数据一致性: ...
随机推荐
- .Net C# RSA签名和验签
帮助类 using System; using System.Text; using System.IO; using System.Security.Cryptography; namespace ...
- django+mysql(1)
报错误:mysqlclient 1.3.13 or newer is required; you have 0.9.3 第一种: django降到2.1.4版本就OK了 第二种(仍使用django 2 ...
- MVC授权不通过之后不执行任何自定义ActionFilter
如下一个Action [Authorize] [F1]//自定义过滤器,继承自ActionFilter public ActionResult Index() { return View(); } 如 ...
- vue.js devtools图标不亮
第一步:打开谷歌扩展程序 第二步:设置允许访问文件地址
- h5学习之表单
<html> <head> <title>新型input类型及表单新元素</title> <meta charset="utf-8&qu ...
- vue项目之购物车
简单的完成一个购物车项目,满足基本功能 安装创建好项目以后需要引入安装elementui和vuex 项目目录如下:(home.vue为主页面) ### ~home.vue <template&g ...
- 【ASE高级软件工程】第一次结对作业
问题定义 具体规则见:讲义.大致规则如下: N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数 ...
- 【Git】五、远程仓库
前面4节将的都是本地的git操作,这节开始讲合并到本地分支后,如何与远程仓库做交互 -------------------------------- 提要 //生成本地ssh密钥 $ ssh-keyg ...
- sed原理及sed命令格式 ,缓存区,模式空间
4.1 Sed工作原理 sed是一个非交互式的流编辑器.所谓非交互式,是指使用sed只能在命令行下输入编辑命令来编辑文本,然后在屏幕上查看输出:而所谓流编辑器,是指sed每次只从 ...
- JDBC上
JDBC实战--打通数据库 代码实现: package com.imooc.db; import java.sql.Connection; import java.sql.DriverManager; ...