使用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都对其有读写权限,保证数据一致性: ...
随机推荐
- 优化方法总结以及Adam存在的问题(SGD, Momentum, AdaDelta, Adam, AdamW,LazyAdam)
优化方法总结以及Adam存在的问题(SGD, Momentum, AdaDelta, Adam, AdamW,LazyAdam) 2019年05月29日 01:07:50 糖葫芦君 阅读数 455更多 ...
- Scala学习十七——类型参数
一.本章要点 类.特质.方法和函数都可以有类型参数 将类型参数放置在名称之后,以方括号括起来 类型界定的语法为T<:UpperBound.T>:LowerBound.T<%ViewB ...
- Pytorch入门随手记
Pytorch入门随手记 什么是Pytorch? Pytorch是Torch到Python上的移植(Torch原本是用Lua语言编写的) 是一个动态的过程,数据和图是一起建立的. tensor.dot ...
- vue.js devtools图标不亮
第一步:打开谷歌扩展程序 第二步:设置允许访问文件地址
- 垃圾分类常见APP
垃圾分类指南app 上海就要实行垃圾分类了,垃圾分类指南app你需要吗,这里有相关的各种垃圾分类的介绍与上海垃圾分类投放指南,这里是垃圾分类指南手机入口能够让你更好的去完成垃圾分类呢.垃圾分类指 .. ...
- Vue项目中使用AES加密
1.在vue中安装crypto-js 备注:千万不要安装错了,中间是 ‘-’连接,不是‘.’ 2.在项目的工具文件夹中新建 encryption.js,用于定义加密和解密的方法,方便调用 ...
- h5嵌套iframe实时传参(适用vue)
今天看到一个同事研究给iframe传参,由于好奇,我自己也写了个demo,说起来其实也挺简单的,但是在此之前没有用过,便想记录一下 其中主要用到的是postMessage 在页面中引入一个iframe ...
- ngnix反向代理后获取用户真实ip及https配置
server {listen 80;listen 802;server_name test111.xxxx.com 118.24.122.101; gzip on;gzip_min_length 10 ...
- 常用Linux文件系统
- Oracle笔记(十六) 数据库设计范式
数据库设计范式是一个很重要的概念,但是这个重要程度只适合于参考.使用数据库设计范式,可以让数据表更好的进行数据的保存,因为再合理的设计,如果数据量一大也肯定会存在性能上的问题.所以在开发之中,唯一可以 ...