本脚本实现自动从git下载代码然后自动部署
用户所有的web服务,都应该使用普通用户。所有web服务都不应该监听80端口,除了负载均衡
新建www用户
useradd -u 1000 www
切换至www用户
部署机生成秘钥
ssh-keygen -t rsa
复制秘钥
cat /home/www/.ssh/id_rsa.pub
把内容复制到客户端的 ~.ssh/authorized_keys (权限必须设置为600)
chmod 600 .ssh/authorized_keys
可以通过ssh ip 直接免密码登录
自动部署脚本(本次试验部署机与客户端为同一台)
deploy.sh
#!/bin/bash
#Node List
NODE_LIST="10.13.74.222"
GROUP_LIST="10.13.74.222"
ROLLBACK_LIST="10.13.74.222"
#Date/Time Veriables
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="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]"
}
writelog(){
LOGINFO=$1
echo "${CDATE} ${CTIME}: ${SHELL_NAME}: ${LOGINFO}" >> ${SHELL_LOG}
}
shell_lock(){
touch ${LOCK_FILE}
}
shell_unlock(){
rm -f ${LOCK_FILE}
}
#切换至获取代码的目录通过git pull命令获取代码
#git设置好,设置步骤不详述
#获取代码以后拷贝至TMP目录
code_get(){
writelog "code_get";
cd $CODE_DIR && git pull
cp -r ${CODE_DIR} ${TMP_DIR}
API_VER="123"
}
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"
}
#scp至目标机
code_scp(){
writelog "code_scp"
for node in ${NODE_LIST};do
scp ${TMP_DIR}/${PKG_NAME}.tar.gz $node:/opt/webroot
done
}
cluster_node_remove(){
echo cluster_node_remove
writelog "cluster_node_remove"
}
code_deploy() {
for node in $NODE_LIST;do
ssh $node "cd /opt/webroot && tar zxf ${PKG_NAME}.tar.gz"
done
rm -rf /var/www/html && ln -s /opt/webroot/${PKG_NAME} /var/www/html
}
config_diff() {
echo config_diff
}
code_test() {
echo code_test
}
cluster_node_in(){
echo cluster_node_in
}
rollback_fun() {
for node in $ROLLBACK_LIST;do
if [ -d /opt/webroot/$1 ];then
ssh $node "rm -f /var/www/html && ln -s /opt/webroot/$1 /var/www/html"
fi
done
}
rollback() {
case $1 in
list)
for node in $ROLLBACK_LIST;do
ssh $node "ls -l /opt/webroot/*.tar.gz"
done
;;
*)
rollback_fun $1
esac
}
main() {
if [ -f $LOCK_FILE ];then
echo "Deploy is running" && exit;
fi
DEPLOY_METHOD=$1
case $DEPLOY_METHOD in
deploy)
shell_lock;
code_get;
code_build;
code_config;
code_tar;
code_scp;
cluster_node_remove;
code_deploy;
code_test;
cluster_node_in;
shell_unlock;
;;
rollback)
shell_lock;
rollback;
shell_unlock;
;;
*)
usage;
esac
}
main $1
[www@3181bf ~]$ cat deploy.sh
#!/bin/bash
#Node List
NODE_LIST="10.13.74.222"
GROUP_LIST="10.13.74.222"
ROLLBACK_LIST="10.13.74.222"
#Date/Time Veriables
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="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]"
}
writelog(){
LOGINFO=$1
echo "${CDATE} ${CTIME}: ${SHELL_NAME}: ${LOGINFO}" >> ${SHELL_LOG}
}
shell_lock(){
touch ${LOCK_FILE}
}
shell_unlock(){
rm -f ${LOCK_FILE}
}
#切换至获取代码的目录通过git pull命令获取代码
#git设置好,设置步骤不详述
#获取代码以后拷贝至TMP目录
code_get(){
writelog "code_get";
cd $CODE_DIR && git pull
cp -r ${CODE_DIR} ${TMP_DIR}
API_VER="123"
}
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"
}
#scp至目标机
code_scp(){
writelog "code_scp"
for node in ${NODE_LIST};do
scp ${TMP_DIR}/${PKG_NAME}.tar.gz $node:/opt/webroot
done
}
cluster_node_remove(){
echo cluster_node_remove
writelog "cluster_node_remove"
}
code_deploy() {
for node in $NODE_LIST;do
ssh $node "cd /opt/webroot && tar zxf ${PKG_NAME}.tar.gz"
done
rm -rf /var/www/html && ln -s /opt/webroot/${PKG_NAME} /var/www/html
}
config_diff() {
echo config_diff
}
code_test() {
echo code_test
}
cluster_node_in(){
echo cluster_node_in
}
rollback_fun() {
for node in $ROLLBACK_LIST;do
if [ -d /opt/webroot/$1 ];then
ssh $node "rm -f /var/www/html && ln -s /opt/webroot/$1 /var/www/html"
fi
done
}
rollback() {
case $1 in
list)
for node in $ROLLBACK_LIST;do
ssh $node "ls -l /opt/webroot/*.tar.gz"
done
;;
*)
rollback_fun $1
esac
}
main() {
if [ -f $LOCK_FILE ];then
echo "Deploy is running" && exit;
fi
DEPLOY_METHOD=$1
case $DEPLOY_METHOD in
deploy)
shell_lock;
code_get;
code_build;
code_config;
code_tar;
code_scp;
cluster_node_remove;
code_deploy;
code_test;
cluster_node_in;
shell_unlock;
;;
rollback)
shell_lock;
rollback;
shell_unlock;
;;
*)
usage;
esac
}
main $1
实现了自动化部署,未实现回滚,待完善