自动化部署之shell篇

前言

最近在写一个自动化部署脚本,因为产品涉及到十几个模块,每个模块都需要部署,纯手动部署太繁琐了,同时也很容易出问题,所需急需通过脚本来实现自动化部署,
主要需求:
需要通过bat脚本自动化从svn、ftp库中取出各模块包、数据、授权文件等,生成完整的安装部署包,减少人工取包带来的差异性导致的各种问题;
同时需要通过shell脚本在linux服务器上自动化部署各模块,包括tomcat、war包部署,现场配置修改,数据库备份、更新等,降低部署的复杂度,减少人为漏改错改配置等引发的问题

因为自己之前基本没咋写过bat脚本和shell脚本,linux也仅会一些系统的常规操作命令,所以只能紧急的边学边用,摸石头过河,所幸经过努力后不负所托,基本实现了功能需求,
现将最近这段时间自己边学边用的bat脚本和shell脚本两部分用到的主要功能和实现方案整理记录,供自己后续查阅,有需要的同学也可以参考

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
}

你可能感兴趣的:(Linux)