一、部署机代码目录结构

  使用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脚本完成自动化部署及秒级回滚的更多相关文章

  1. kubernetes云平台管理实战: 滚动升级秒级回滚(六)

    一.nginx保证有两个版本 1.查看当前容器运行nginx版本 [root@k8s-master ~]# kubectl get pod -o wide NAME READY STATUS REST ...

  2. Shell脚本,自动化发布tomcat项目【转载】

    Shell脚本,自动化发布tomcat项目脚本. 1. vko2c_auto_build_by_scp.sh 文件内容: #---------------------start------------ ...

  3. Shell脚本,自动化发布tomcat项目【转】

    Shell脚本,自动化发布tomcat项目脚本. 1. vko2c_auto_build_by_scp.sh 文件内容: #---------------------start------------ ...

  4. Dubbo入门到精通学习笔记(二):Dubbo管理控制台、使用Maven构建Dubbo的jar包、在Linux上部署Dubbo privider服务(shell脚本)、部署consumer服务

    文章目录 Dubbo管理控制台 1.Dubbo管理控制台的主要作用: 2.管理控制台主要包含: 3.管理控制台版本: 安装 Dubbo 管理控制台 使用Maven构建Dubbo服务的可执行jar包 D ...

  5. 使用shell脚本来自动化处理我们的工作,解放双手

    Shell脚本介绍 1.Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合. 2.Shell可以直接使用在wi ...

  6. Jenkins+maven+gitlab+shell实现项目自动化部署

    确认jdk , maven,git这些已经在服务器上搭建成功,gitlab使用的是公司服务也没有进行搭建 下面是jenkins的两种搭建方式 1.      第一种比较简单下载对应jenkins.wa ...

  7. shell脚本编写nginx部署脚本

    下面为shell脚本编写的nginx的安装及修改nginx.conf的脚本,脚本比较简单: #!/bin/bash function yum_install(){ yum install epel-r ...

  8. nginx之热部署,以及版本回滚

    热部署的概念:当从老版本替换为新版本的nginx的时候,如果不热部署的话,会需要取消nginx服务并重启服务才能替换成功,这样的话会使正在访问的用户在断开连接,所以为了不影响用户的体验,且需要版本升级 ...

  9. shell脚本编写-自动部署及监控

    1.编写脚本自动部署反向代理.web.nfs: I.部署nginx反向代理两个web服务,调度算法使用加权轮询 II.所有web服务使用共享存储nfs,保证所有web都对其有读写权限,保证数据一致性: ...

随机推荐

  1. 在生产环境中使用Compose 【翻译】

    在生产环境中使用Compose 在开发环境中使用Compose定义你的应用,可以使用此定义在不同的环境,(如 CI.暂存和生产)中运行应用程序. 部署应用程序的最简单方法是在单个服务器上运行该应用程序 ...

  2. 三调数据库标注插件v1.3

    三调数据库标注插件 插件介绍: 本插件基于VS2010+ARCGIS Addin 开发,高效率处理三调数据,可以标注相关属性.检查尖角.检查节点平均密度.检查地类图斑属性一致性,方便数据导入建库软件之 ...

  3. Django rest-framework框架-解析器

    解析器: 开始: django: request.POST/ request.body 满足一下两个要求POST中才有值 1. 如果请求头中的 Content-Type: application/x- ...

  4. Python中,标识符用法

    Python中,标识符 在Python中,所有标识符都可以包括英文.数字和下划线(),但不能包括数字.python中的标识符区分大小写.这是知识的背景.但通常,Python成为以下划线开头的标识符的习 ...

  5. paypal支付 NVP支付 paypal 手续费 GetTransactionDetails

    主要内容: 本文章主要讲解的是NVP的对接,以最简单的接口案例,讲解一下对接NVP的方案. 先提供下paypal 官方文档的主要功能对接说明,如下 1.请求API 服务器端点 描述 https://a ...

  6. 【Distributed】大型网站高并发和高可用

    一.DNS域名解析 二.大型网站系统应有的特点 三.网站架构演变过程 3.1 传统架构 3.2 分布式架构 3.3 SOA架构 3.4 微服务架构 四.高并发设计原则 4.1 拆分系统 4.2 服务化 ...

  7. 二、MySQL介绍

    目录 一.MySQL背景 二.MySQL的优点 三.MySQL安装 四.MySQL服务的启动和停止 五.MySQL登录和退出 六.MySQL常用命令 (一)常用命令 (二)语法规范 (三)SQL语言细 ...

  8. 通过mysql 连接远程数据库时,输入密码后,提示10060错误

    能提示输入密码,说明网络能够连接,而且能连到服务器.输入密码后提示错误,说明应该是权限问题 解决方法: ​一.进入mysql数据库命令行 ​二.输入use mysql; ​三.设置root账号密码为1 ...

  9. MySQL无法启动:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

    1 详细异常 ct 11 17:31:51 bd02.getngo.com mysqld[20513]: 2019-10-11T09:31:51.187848Z 0 [Note] /usr/sbin/ ...

  10. Matlab---绘制柱状图

    Matlab---绘制柱状图 目录: hist()函数 histc( )函数 bar()函数 正文: 注意区分:频率.频数分布直方图. 一.             hist()函数 hist():实 ...