linux脚本开发流程,通过shell脚本实现代码自动化部署

一、传统部署方式及优缺点

1.传统部署方式

(1)纯手工scp

(2)纯手工登录git pull、svn update

(3)纯手工xftp往上拉

(4)开发给打一个压缩包,rz上去;解压

2.缺点

(1)全程运维参与,占用大量时间

(2)上线速度慢

(3)人为失误多,管理混乱

(4)回滚慢,不及时

二、环境规划

1、开发环境--开发者本地有自己的环境。

运维需要设置的开发环境,大家共用的服务。

2、测试环境:功能测试环境和性能测试环境。

3、预生产环境:生产环境集群中的某一个节点。

4、生产环境:直接对用户提供服务的环境。

测试环境与生产环境的数据库不一致时,可能会导致测试的功能不全面,在测试环境测无问题,放在线上可能出现问题

三、需求分析

一、功能需求需求

一个集群有十个节点

1.实现 一键部署10个节点

2.一键回滚到任意版本

3.一键回滚到上个版本

二、部署需求

部署:

1.代码在哪里:svn、git

2.获取什么版本代码?svn/git:直接拉去某个分支

svn:指定版本号

git:指定tag

3.差异解决:

(1)各个节点直接差异:配置文件未必一致(crontab.xml)。预生产节点。

(2)代码仓库和实际的差异。配置文件是否放在代码仓库中。

4.如何更新

更新时需要考虑是否重启。例如java代码,需要考虑重启tomcat。重启过程中,用户就不能访问了。

5.测试

部署多个节点,某个节点由于配置问题导致部署不成功。如何测试。

6.串行和并行

部署多个节点,串行部署还是并行部署,视具体业务需求决定。

7.如何执行1.shell脚本,直接执行

2.web界面

三、部署流程1.获取代码(直接拉取)----》 2.编译(可选)----》 3.配置文件放进去----》 4.打包 ----》

5.SCP到目标服务器----》 6.将目标服务器移除集群----》 7.解压 ----》 8.放置到webroot ----》

9.SCP差异文件 ----》 10.重启(可选) ----》 11.测试 ----》 12.加入集群

四、代码实现

1、设置无交互访问通过ssh-keygen将部署机的公钥发送给应用服务器。

注意,这里通常是用普通用户登陆部署机,生成公钥后,再把公钥发给应用服务器

ssh-keygen -t rsa

切换到.ssh目录下

[www@linux-node1 ~/.ssh]$ ll

total 16

-rwx------ 1 www www  397 Jul 31 22:45 authorized_keys

-rwx------ 1 www www 1679 Jul 31 22:44 id_rsa

-rwx------ 1 www www  397 Jul 31 22:44 id_rsa.pub

将id_rsa.pub中的内容复制粘贴到应用服务器的www用户的.ssh目录下,

文件名称为authorized_keys

[www@linux-node2 .ssh]$ cat authorized_keys

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCqT3VwY9Wo7tKsXa4Ce1zXGLT/Iygy30tDBKnV4HW4g5BdUS48urTvYljL9cwJ/HWvoqbtJ5mc7PMmhDMOAjIh1CRZtGxKEkQFB/Xp5cLeAsE7iH+WfkNqavFHD75+YuM2mbNBvisDXO+/pJ/QfbmYwWJ6CW6uLpQKpitdJwrLpQDJGQv5H3aV0kHKZdoA+twdXm0LmQcWWJt7zruPq19CAXG5b93KTdgyt/1x4BfcT5/+PCaEd9suYwEneI2Io8CX9oTAe3MRyRPtlN0szT89qP/q+Q4sktVjc1nkxHhdP2mahqeiBLUGULfkgUBtEjaGAFSWb+ejFV0fRDHk6bSJ www@linux-node1

注意,修改authorized_keys的权限

chmod 600 authorized_keys

另外,将.ssh目录的权限设置成700

chmod 700 .ssh

2、详细代码#!/bin/bash

#Node List

PRE_LIST="192.168.56.11"

GROUP1_LIST="192.168.56.12"

ROLLBACK_LIST="192.168.56.11 192.168.56.12"

#Date/Time Variable

LOG_DATE='date "+%Y-%m-%d"'

LOG_TIME='date "+%H-%M-%S"'

CDATE=$(date "+%Y-%m-%d")

CTIME=$(date "+%H-%M-%S")

#Shell env

SHELL_NAME="/deploy1.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=$1

echo "${CDATE}${CTIME}: ${SHELL_NAME}: ${LOGINFO} " >> ${SHELL_LOG}

}

shell_lock(){

touch ${LOCK_FILE}

}

shell_unlock(){

rm -f ${LOCK_FILE}

}

code_get(){

writelog "code_get";

cd $CODE_DIR && echo "git pull";

cp -r ${CODE_DIR} ${TMP_DIR}/

API_VER="456"

}

code_build(){

echo code_build

}

code_config(){

writelog "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 $PRE_LIST;do

scp ${TMP_DIR}/${PKG_NAME}.tar.gz $node:/opt/webroot

done

for node in $GROUP1_LIST;do

scp ${TMP_DIR}/${PKG_NAME}.tar.gz $node:/opt/webroot

done

}

cluster_node_remove(){

writelog  "cluster_node_remove"

}

pre_deploy(){

writelog "remove from cluster"

ssh $PRE_LIST "cd /opt/webroot && tar zxf ${PKG_NAME}.tar.gz"

ssh $PRE_LIST "rm -rf /webroot/web-demo && ln -s /opt/webroot/${PKG_NAME} /webroot/web-demo"

}

url_test(){

URL=$1

curl -s --head $URL|grep "200 OK"

if [ $? -ne 0 ];then

shell_unlock;

writelog "test error" && exit;

fi

}

pre_test(){

url_test "http://${PRE_LIST}/index.html"

echo "add to cluster"

}

group1_deploy(){

writelog "remove from cluster"

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 -s /opt/webroot/${PKG_NAME} /webroot/web-demo"

done

scp ${CONFIG_DIR}/other/192.168.56.12.crontab.xml 192.168.56.12:/webroot/web-demo/crontab.xml

}

group1_test(){

url_test "http://192.168.56.12/index.html"

echo "add to cluster"

}

rollback_fun(){

for node in $ROLLBACK_LIST;do

ssh $node "rm -rf /webroot/web-demo && ln -s /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)

ls -l /opt/webroot/*.tar.gz

;;

*)

rollback_fun $1

esac

}

main(){

if [ -f $LOCK_FILE ];then

echo "Deploy is running" && exit;

fi

DEPLOY_METHON=$1

ROLLBACK_VER=$2

case $DEPLOY_METHON in

deploy)

shell_lock;

code_get;

code_build;

code_config;

code_tar;

code_scp;

pre_deploy;

pre_test;

group1_deploy;

group1_test;

shell_unlock;

;;

rollback)

shell_lock;

rollback $ROLLBACK_VER;

shell_unlock;

;;

*)

usage;

esac

}

main $1 $2测试方式

[www@linux-node1 ~]$ curl --head http://192.168.56.11/index.html

HTTP/1.1 200 OK

Date: Mon, 01 Aug 2016 09:42:23 GMT

Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips PHP/5.4.16 mod_wsgi/3.4 Python/2.7.5

Last-Modified: Mon, 01 Aug 2016 09:39:52 GMT

ETag: "17-538ff61ca0a00"

Accept-Ranges: bytes

Content-Length: 23

Content-Type: text/html; charset=UTF-8

[www@linux-node1 ~]$ curl -s --head http://192.168.56.11/index.html|grep "200 OK"

HTTP/1.1 200 OK

3、回滚1.列出回滚版本

2.目标服务器移除集群

3.执行回滚

4.重启和测试

5.加入集群

===========

如果是遇到重大bug

1.列出回滚版本

2.执行回滚(重启)

==========

非常紧急

1.直接回滚到上个版本(重启)

自动化部署的核心是创建软链接,同样在回滚的时候也能实现秒级回滚。

如何从git上拉取代码,请听下回分解

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值