部署脚本1

#!/bin/bash

#function: 自动发布项目脚本
#filename: deploy.sh
#author:xxxxx
#date: 2017-04-24

source /etc/profile

echo -e "本次执行传入参数为:$#"

#首次检查参数个数是否正确
if [ $# -ne "6" ];then

echo "Usage : sh $0 { 项目编码 | 单元编码 | 环境类型(SIT|UAT|PRD) | 制品库路径 | Json文件 | 版本号 }"
exit 1
fi

Prodir="/nfs/articles"
SCODE=$1
ENV=$2
DENV=$3
DIR=$4
DESC=$5
VER=$6
mysql_host=10.89.0.66
mysql_user=deploydata
mysql_passwd=bmb
HOST=$(mysql -h ${mysql_host} -u ${mysql_user} -p${mysql_passwd} -Ne "select server_ip from deploy_management.deploy_management_tab where system_code='${SCODE}' and env_code='${ENV}' and env_type='${DENV}' and server_status=1";)

function check(){

#判断项目主机是否存在
echo " 1) 检测项目名称是否合法。。。。。。"
if [ "$HOST" = "" ];then
echo "主机不存在,请确认项目名称是否正确认!"
exit 1
else
echo -e "项目主机:\n${HOST}\n"
fi

#判断DENV变量是否为{SIT|UAT|PRD}其中之一
echo " 2) 检测环境变量是否合法。。。。。。"
if [ $DENV = "SIT" -o $DENV = "UAT" -o $DENV = "PRD" ];then
echo -e "DENV变量合法: 检测完成!\n"
else
echo "DENV变量输入错误,请检查并重新输入 "
echo "Usage : 环境类型(sit|uat|prd)"
exit 1
fi

#判断制品库目录是否存在
echo " 3) 检测制品库目录是否存在。。。。。。"
if [ -d ${Prodir}/${DIR} ];then
echo -e "制品库目录存在,检测完成!\n"
else
echo "制品库目录不存在,请检查输入信息."
exit 1
fi

#判定Json文件是否存在
echo " 4) 检测JSON文件是否存在。。。。。。"
if [ -f ${Prodir}/${DIR}/${DESC} ];then
echo -e "JSON文件存在,检测完成!\n"
else
echo "JSON文件不存在,请检查输入信息."
exit 1
fi

#判断项目版本号文件
echo " 5) 检测项目版本号。。。。。。"
val_dir=$(echo ${DESC%.*})
val=$(echo ${val_dir##*/})
if [ ${val} = ${VER} ];then
echo -e "版本号正确,检测完成!\n"
else
echo "版本号不正确,请检查输入信息."
exit 1
fi
}

#展示JsoN文件内容
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo -e "${Prodir}/${DIR}/${DESC}"
cat "${Prodir}/${DIR}/${DESC}"
echo

echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

function deploy(){
Store=${Prodir}/${DIR}
Backdir=${Prodir}
Projson=${Prodir}/${DIR}/${DESC}

Confval=$(/usr/bin/jq -r 'has("configs")' ${Projson})
[ "$Confval" = "true" ] && Sconf=$(/usr/bin/jq -r '.configs[].destfilename' ${Projson})

Mysqlval=$(/usr/bin/jq -r 'has("sqls")' ${Projson})
[ "$Mysqlval" = "true" ] && Ssql=$(/usr/bin/jq -r '.sqls.mysql[]' ${Projson})

Fileval=$(/usr/bin/jq -r 'has("files")' ${Projson})
[ "$Fileval" = "true" ] && Dfile=$(/usr/bin/jq -r '.files[].destfilename' ${Projson})

#拷贝发布包到目标主机
num=1
for host in ${HOST};
do

#num=$NUM

mysql_app_path=$(mysql -h ${mysql_host} -u ${mysql_user} -p${mysql_passwd} -Ne "select server_app_path from deploy_management.deploy_management_tab where system_code='${SCODE}' and env_code='${ENV}' and env_type='${DENV}' and server_status=1" |awk 'NR=='$num' {print}')
if [ "${mysql_app_path}" = "" ];then
ProAPP="/appssystem/${SCODE}-deploy-management"
else
ProAPP=${mysql_app_path}
fi


mysql_config_path=$(mysql -h ${mysql_host} -u ${mysql_user} -p${mysql_passwd} -Ne "select server_config_path from deploy_management.deploy_management_tab where system_code='${SCODE}' and env_code='${ENV}' and env_type='${DENV}' and server_status=1" |awk 'NR=='$num' {print}')
if [ "${mysql_config_path}" = "" ];then
ProCONF="/appssystem/${SCODE}-deploy-management"
else
ProCONF=${mysql_config_path}
fi

mysql_start_path=$(mysql -h ${mysql_host} -u ${mysql_user} -p${mysql_passwd} -Ne "select server_start_path from deploy_management.deploy_management_tab where system_code='${SCODE}' and env_code='${ENV}' and env_type='${DENV}' and server_status=1" |awk 'NR=='$num' {print}')
if [ "${mysql_start_path}" = "" ];then
Probin=/tomcat/bin
else
Probin=${mysql_start_path}
fi

mysql_do_deploy_user=$(mysql -h ${mysql_host} -u ${mysql_user} -p${mysql_passwd} -Ne "select do_deploy_user from deploy_management.deploy_management_tab where system_code='${SCODE}' and env_code='${ENV}' and env_type='${DENV}' and server_status=1" |awk 'NR=='$num' {print}')
if [ "${mysql_do_deploy_user}" = "" ];then
Do_deploy_user="deployop"
else
Do_deploy_user=${mysql_do_deploy_user}
fi


mysql_deploy_user=$(mysql -h ${mysql_host} -u ${mysql_user} -p${mysql_passwd} -Ne "select deploy_user from deploy_management.deploy_management_tab where system_code='${SCODE}' and env_code='${ENV}' and env_type='${DENV}' and server_status=1" |awk 'NR=='$num' {print}')
if [ "${mysql_deploy_user}" = "" ];then
Deploy_user="tomcat"
else
Deploy_user=${mysql_deploy_user}
fi

mysql_server_log_path=$(mysql -h ${mysql_host} -u ${mysql_user} -p${mysql_passwd} -Ne "select server_log_path from deploy_management.deploy_management_tab where system_code='${SCODE}' and env_code='${ENV}' and env_type='${DENV}' and server_status=1" |awk 'NR=='$num' {print}')
if [ "${mysql_server_log_path}" = "" ];then
Server_log="/tomcat/logs"
else
Server_log=${mysql_server_log_path}
fi

mysql_server_port=$(mysql -h ${mysql_host} -u ${mysql_user} -p${mysql_passwd} -Ne "select port from deploy_management.deploy_management_tab where system_code='${SCODE}' and env_code='${ENV}' and env_type='${DENV}' and server_status=1" |awk 'NR=='$num' {print}')
if [ "${mysql_server_port}" = "" ];then
Server_port="22"
else
Server_port=${mysql_server_port}
fi


DirTomcat=$(echo ${Probin%/*})
TomcatCache="${DirTomcat}/work/*"
Tomcatapps="${DirTomcat}/webapps/*"
#TomcatWork="${DirTomcat}/work"
#TomcatWeb="${DirTomcat}/webapps"

 

echo "*****************************************************************"
##停服务
ssh -p${Server_port} ${Deploy_user}@${host} "source /etc/profile ;PID_tomcat=\$( ps -ef |grep $Probin |awk '\$3==1 {print \$2}');if [[ -z \${PID_tomcat} ]];then echo "service not run" ;else kill -9 \${PID_tomcat};echo -e "Service Num \${PID_tomcat}: stoped";fi;rm -rf ${TomcatCache} ${Tomcatapps}"

echo "*****************************************************************"

##拷贝WAR到目标主机
for file in ${Dfile};
do
scp -P${Server_port} ${Store}/${file} ${Do_deploy_user}@${host}:${ProAPP}/${file}
if [ $? -eq 0 ];then
echo "${host}: Pass ${file} file to ${ProAPP}/${file} successfully!"
else
echo "${file} Copy failed, please verify host and file information!"
fi
done

num=$((${num}+1))
done

echo "====================================================================="

#判断文件configs序列是否存在

if [ "$Confval" = "false" ];then
echo "This update does not need to modify the configuration file!"
else
##修改项目配置文件
for host in ${HOST};
do
i=0
for conf in ${Sconf};
do
Action=$(/usr/bin/jq '.configs['${i}'].action' ${Projson})
Pro_filename=$(/usr/bin/jq -r '.configs['$i'].destfilename' ${Projson})
config_key=$(/usr/bin/jq -r '.configs['$i'].key' ${Projson})
config_val=$(/usr/bin/jq -r '.configs['$i'].value.'${DENV}'' ${Projson})

ssh -p${Server_port} ${Do_deploy_user}@${host} "source /etc/profile; [ ! -f "${ProCONF}/${Pro_filename}" ] && touch ${ProCONF}/${Pro_filename}"

if [ "$Action" = '"add"' ];then
ssh -p${Server_port} ${Do_deploy_user}@${host} "source /etc/profile;keys=\$(sed -n "/${config_key}/p" ${ProCONF}/${Pro_filename}) ;keys_update=\$(sed -i "s/^${config_key}.*$/${config_key}=${config_val}/" ${ProCONF}/${Pro_filename});if [ \$keys ];then \${keys_update} && echo "KEY updte: ${config_key}" ;else echo '"${config_key}=${config_val}"' >> "${ProCONF}/${Pro_filename}" && echo "$host: Add KEY: ${config_key}" ;fi"
elif [ "$Action" = '"update"' ];then

ssh -p${Server_port} ${Do_deploy_user}@${host} "source /etc/profile; mod_file=\$(sed -i "s/^${config_key}.*$/${config_key}=${config_val}/" ${ProCONF}/${Pro_filename}); \${mod_file}"
echo "$host: Modify KEY: ${config_key}"
elif [ "$Action" = '"delete"' ];then
ssh -p${Server_port} ${Do_deploy_user}@${host} "source /etc/profile;del_keys=\$(sed -i "/^${config_key}.*$/d" ${ProCONF}/${Pro_filename}); \${del_keys};echo "$host: DEL KEY: ${config_key}""
else
echo "ERROR: Please check the action key!!!"
fi

i=$((${i}+1))
done

done


fi

##执行mysql语句
if [ "$Mysqlval" = "false" ];then
echo -e "This update does not need to upgrade the database!"
else
j=0
for sql in ${Ssql};
do
sql_file=$(/usr/bin/jq -r '.sqls.mysql['${j}']' ${Projson})
transfer_path=$(echo ${sql_file} |awk -F"/" '{print $2}')
DATA_BASE=$(mysql -h ${mysql_host} -u ${mysql_user} -p${mysql_passwd} -Ne "select db_sid from deploy_management.deploy_db_info where system_code='${SCODE}' and env_code='${ENV}' and env_type='${DENV}' and db_transfer_path='${transfer_path}'")
SQL_FILE_MD5=$(md5sum ${Store}/${sql_file} |cut -d " " -f1)
DATE_TIME=$(date "+%F %T")
UUID=$(cat /proc/sys/kernel/random/uuid |sed 's/-//g')

DATA_HOST=$(mysql -h ${mysql_host} -u ${mysql_user} -p${mysql_passwd} -Ne "select db_host from deploy_management.deploy_db_info where system_code='${SCODE}' and env_code='${ENV}' and env_type='${DENV}' and db_transfer_path='${transfer_path}'")
DATA_USER=$(mysql -h ${mysql_host} -u ${mysql_user} -p${mysql_passwd} -Ne "select db_user_name from deploy_management.deploy_db_info where system_code='${SCODE}' and env_code='${ENV}' and env_type='${DENV}' and db_transfer_path='${transfer_path}'")
DATA_PASSWD=$(mysql -h ${mysql_host} -u ${mysql_user} -p${mysql_passwd} -Ne "select db_password from deploy_management.deploy_db_info where system_code='${SCODE}' and env_code='${ENV}' and env_type='${DENV}' and db_transfer_path='${transfer_path}'")
DATA_PORT=$(mysql -h ${mysql_host} -u ${mysql_user} -p${mysql_passwd} -Ne "select db_port from deploy_management.deploy_db_info where system_code='${SCODE}' and env_code='${ENV}' and env_type='${DENV}' and db_transfer_path='${transfer_path}'")
DATA_MD5=$(mysql -h ${mysql_host} -u ${mysql_user} -p${mysql_passwd} -Ne "select sql_md5 from deploy_management.deploy_db_log where system_code='${SCODE}' and env_code='${ENV}' and env_type='${DENV}' and sql_name='${sql_file}'")
DATA_SQL_FILE=$(mysql -h ${mysql_host} -u ${mysql_user} -p${mysql_passwd} -Ne "select sql_name from deploy_management.deploy_db_log where system_code='${SCODE}' and env_code='${ENV}' and env_type='${DENV}' and sql_name='${sql_file}'")


if [[ "${DATA_MD5}" == "${SQL_FILE_MD5}" ]];then
echo "This SQL file has been updated , no longer need to be updated again ! "
else
mysql -h ${DATA_HOST} -P${DATA_PORT} -u ${DATA_USER} -p${DATA_PASSWD} -D${DATA_BASE} -e "source ${Store}/${sql_file}"
if [ $? -eq 0 ];then
mysql -h ${DATA_HOST} -P${DATA_PORT} -u ${DATA_USER} -p${DATA_PASSWD} -e "insert into deploy_management.deploy_db_log (id_deploy_db_log,env_type,env_code,version,system_code,sql_md5,exe_date,sql_name) values ('$UUID','$DENV','$ENV','$VER','$SCODE','${SQL_FILE_MD5}','${DATE_TIME}','${sql_file}');"
echo "SQL update is successful"
else
echo "SQL statement execution failed, please check"
exit 1
fi
fi
j=$((${j}+1))
done
fi

 


StartTomcat=${Probin}/startup.sh
LogTomcat=${Server_log}/catalina.out
TomcatFile="/tmp/tomcat_log.txt"

##应用服务启动并验证启动状态
for host in ${HOST};
do
# ssh -p${Server_port} ${Deploy_user}@${host} "source /etc/profile; PID_tomcat=\$( ps -ef |grep $Probin |awk '\$3==1 {print \$2}');if [[ -z \${PID_tomcat} ]];then sh ${StartTomcat} ;else kill -9 \${PID_tomcat};sh ${StartTomcat};fi"

scp -P${Server_port} /nfs/tools/deployop/start_status.sh ${Deploy_user}@${host}:/tmp
ssh -p${Server_port} ${Deploy_user}@${host} "source /etc/profile; PID_tomcat=\$( ps -ef |grep $Probin |awk '\$3==1 {print \$2}');if [[ -z \${PID_tomcat} ]];then sh ${StartTomcat} ;else kill -9 \${PID_tomcat};sh ${StartTomcat};fi;sh /tmp/start_status.sh ${LogTomcat}; rm -f /tmp/start_status.sh /tmp/logs.txt"


done

}

check
deploy

 

posted @ 2018-05-31 09:22  xiao_pai_pai  阅读(162)  评论(0编辑  收藏  举报