最近在写一个自动化部署脚本,因为产品涉及到十几个模块,每个模块都需要部署,纯手动部署太繁琐了,同时也很容易出问题,所需急需通过脚本来实现自动化部署,
主要需求:
需要通过bat脚本自动化从svn、ftp库中取出各模块包、数据、授权文件等,生成完整的安装部署包,减少人工取包带来的差异性导致的各种问题;
同时需要通过shell脚本在linux服务器上自动化部署各模块,包括tomcat、war包部署,现场配置修改,数据库备份、更新等,降低部署的复杂度,减少人为漏改错改配置等引发的问题
因为自己之前基本没咋写过bat脚本和shell脚本,linux也仅会一些系统的常规操作命令,所以只能紧急的边学边用,摸石头过河,所幸经过努力后不负所托,基本实现了功能需求,
现将最近这段时间自己边学边用的bat脚本和shell脚本两部分用到的主要功能和实现方案整理记录,供自己后续查阅,有需要的同学也可以参考
shell脚本判断解压成功与否
unzip -o $src -d $des >/dev/null
if [ $? -eq 0 ]; then
printAndWrite "info: unzip $src successfully!!"
else
printAndWrite "error : unzip $src failed , the storage limited ?"
#exit
fi
unzip -o $src -d d e s 解 压 时 相 同 文 件 直 接 覆 盖 , > / d e v / n u l l 则 是 通 过 重 定 向 屏 蔽 了 屏 幕 输 出 内 容 , des解压时相同文件直接覆盖,>/dev/null则是通过重定向屏蔽了屏幕输出内容, des解压时相同文件直接覆盖,>/dev/null则是通过重定向屏蔽了屏幕输出内容,?是获取上条命令执行的退出状态,0表示没有错误,其他任何值表明有错误。
定义函数:实现同时在屏幕输出和输出到文件
time=$(date "+%Y%m%d%H%M%S")
#print $info in screen and write in file
function printAndWrite(){
info=$1
echo $info
echo $info >> deploy_log_package_$time.txt
}
主要是用来记录部署过程中的部署情况,>>是重定向符号,将输出信息转移以追加的方式输出到指定的文件了,如果该文件不存在则会自动创建,>也是重定向符号,区别是覆盖原文件已有内容的方式输出到指定的文件了
shell脚本ftp获取,实现自动从ftp上取资源
wget -r -nH -nd -q ftp://ftpip:21/xxx/ xxx/xxx/--ftp-user=ftpusername --ftp-password=ftppassword
shell脚本删除目标文件夹下所有的文件和文件夹(慎重使用,建议备份后操作)
rm -rf $TARGET_DIR/*
shell脚本移动目录文件
mv $TARGET_DIR/$module_name $bak_dir
扩展:目标目录与原目录一致,指定了新文件名,效果就是仅仅重命名。
mv /xxx/x.txt /xxx/y.txt
目标目录与原目录不一致,没有指定新文件名,效果就是仅仅移动。
mv /xxx/x.txt /xxx/yyy/
目标目录与原目录一致, 指定了新文件名,效果就是:移动 + 重命名。
mv /xxx/x.txt /xxx/yyy/y.txt
shell脚本复制目录文件
cp xxx/test.war $TARGET_DIR/xxx/
shell脚本判断文件夹是或否存在、创建软链接
if [ ! -d $TARGET_DIR/tomcat-9.0.16 ];
then
ln -s $TARGET_DIR/tomcat-9.0.16 $TARGET_DIR/tomcat
printAndWrite "create link $TARGET_DIR/xxxln successfully"
fi
软链接的好处:其他操作可以基于软链接来执行,后续如源文件因版本升级等原因需变更,则只需要修改软链接即可,其他基于软链接的可以不动
shell脚本层级创建目录
mkdir -p xxx/xxx
shell脚本判断文件是否存在
if [ -a xxx/xxx.war ];
then
printAndWrite "xxx war is exist"
fi
shell脚本判断文件夹是否为空
data_files=`ls $DIR/xxx`
if [ ! -z "$data_files" ];
then
printAndWrite "xxx data is exist"
fi
shell脚本for循环
for i in $DIR/xxx/*.zip;
do
unzip -o $i -d $TARGET_DIR/xxx;
done
shell脚本解压tar包到指定目录
tar zvxf $DIR/xxx/xxx.tar.gz -C $TARGET_DIR/xxx/
shell脚本读取文件中的值
MYSQL_USER=`sed '/^MYSQL_USER=/!d;s/.*=//' $DIR/file.txt`
shell脚本替换ip和端口
sed -ri "s/(http:\/\/)([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+)/\1$TESTIP:8899/g" $data_xml
查找mysql安装目录
MYSQL_DIR="$( ps -aux | grep mysqld | awk '{print$11}'| grep mysqld | sed 's/\/mysqld//' )"
shell脚本备份数据库、执行sql语句
$MYSQL_DIR/mysqldump -u$MYSQL_USER -p$MYSQL_PWD -h 127.0.0.1 test_db > /xxx/bk.sql
$MYSQL_DIR/mysql -u$MYSQL_USER -p$MYSQL_PWD -h 127.0.0.1 -e 'create database if not exists test_db_bkb'
$MYSQL_DIR/mysql -u$MYSQL_USER -p$MYSQL_PWD -h 127.0.0.1 test_db_bkb < /xxx/bk.sql
shell脚本查找文件并获取查找结果,实现同时在屏幕输出和输出到文件
return_str=`grep -n "ERROR" log.txt`
if [ ! -z "$return_str" ]
then
printAndWrite "$return_str"
fi
注意语句被·· 包含,这个字符不是常用的单引号,在 Esc 键下边。
shell脚本开机自启动,在该脚本加上下面的语句,该脚本即可开机自启动
chmod +x $0
chmod +x /etc/rc.d/rc.local
filename=$(basename ${0})
inlocal=$(cat /etc/rc.d/rc.local | grep $filename)
if [ ! -n "$inlocal" ]; then
echo "$cur_path/$filename > /tmp/$filename.log" >> /etc/rc.d/rc.local
echo "success add $(basename ${0}) to rc.local"
else
echo 'success inited'
fi
exit 0
shell脚本根据端口判断进程是或否启动成功
function port_is_started(){
port=$1
COUNT=0
while [ $COUNT -lt 1 ]; do
echo -e ".\c"
sleep 1
COUNT=`netstat -anp|grep $port | grep LISTEN | awk '{print $7}' | wc -l`
if [ $COUNT -gt 0 ]; then
break
fi
done
echo "$port is started!"
}
shell脚本根据端口后杀进程
function stop_by_port(){
port=$1
pid=$(netstat -nlp | grep :$port | awk '{print $7}' | awk -F"/" '{ print $1 }');
if [ -n "$pid" ]; then
kill -9 $pid;
sleep 2
fi
}
shell脚本定时执行任务,如定时执行清理大文件或者其他操作
交互式,适用于所有用户
crontab -e
然后输入i即可进入编辑模式,增加命令:
22 * * * * sh /xxx/clear.sh >> /xxx/clear.sh
自动化,直接修改/etc/crontab文件,仅适用于root用户
22 * * * * sh /xxx/clear.sh >> /xxx/clear.sh
shell脚本大日志文件自动拆分,避免系统长时间运行后部分日志文件过大塞满空间导致系统异常
在etc/logrotate.d目录下放置配置文件
tomcat_catalina
/xxx/tomcat-9.0.16/logs/catalina.out {
daily
rotate 7
missingok
dateext
compress
notifempty
copytruncate
}