FunctionCase
通过function(定义函数) 和 case 配合,在执行脚本时,传入指定参数即可执行指定代码。 简单版 将以下代码写入to 文件
command=$1
case $command in
git)
ssh [email protected]
;;
gitlab)
ssh [email protected]
;;
log)
ssh [email protected]
;;
*)
echo "未指定$1部分时输出提示信息"
esac为该文件添加可执行权限,放入用户环境变量
pwd
/home/ituser
chmod +x to
mkdir bin
mv to bin/将$HOME/bin加入当前用户的环境变量
cat << EOF >> .bashrc
PATH=$PATH:$HOME/.local/bin:$HOME/bin
export PATH
EOF使加入的配置生效
source .bashrc通过以下命令来验证脚本是否生效
to git # 会进入192.168.160.60服务器
to log # 会进入192.168.160.242服务器function 用来定义函数,在case中可以直接调用函数而不需要再输入命令 命令格式:
function 函数名 {
content #内容
}或者
函数名() {
content #内容
}例如:将如下内容写入go脚本
command=$1
function to_ser1() {
ssh [email protected]
}
function to_ser2() {
ssh [email protected]
}
case command in
ser1)
to_ser1
;;
ser2)
to_ser2
;;
esac执行脚本
go ser1 #即可调用ssh [email protected]命令例如:将以下脚本保存为 service.sh 执行时分别传入release|restart|rollback会分别实现项目的发布、重启、回滚操作
service.sh release
service.sh restart
service.sh rollback
vi service.sh
#! /bin/bash
# 1、定义项目工作目录,项目ROOT目录,项目容器名称,war包名称,服务端口以及项目备份目录名称;
# 2、切换至项目工作目录,并判断该目录是否存在,如不存在,直接结束脚本,并提示检查设置的项目工作目录
# 3、检查项目ROOT目录是否存在,如不存在,则创建
# 4、删除旧容器,创建备份目录,移动正在运行的项目文件至备份目录
# 5、复制新的war包至ROOT目录并解压,解压完成后删除原war文件
# 6、启动容器
# 7、检查备份目录份数,如果小于或等于三份,则跳过;否则按时间顺序,保留最新的三个备份
# 请先依次设置 WORK_DIR、ROOT_DIR、CONTAINER_NAME、WAR_NAME、SERVICE_PORT变量的值
# 工作目录,项目存放位置
WORK_DIR=
# 项目的ROOT目录
ROOT_DIR=
# 配置Docker容器名称,该名称唯一不可同其它容器重复
CONTAINER_NAME=
# .war包名称,不包含.war后缀
WAR_NAME=
# 设置服务端口;设置端口号时请注意不要与其它服务冲突,否则会导致服务无法启动,linux检查指定端口(例如8080)是否被使用命令: ss -anpt | grep 8080
SERVICE_PORT=
# 备份目录
BACKUP_DIR=`date +%F-%H-%M-%S`
# 过滤出本机IP,适用于单物理网卡服务器,
ETH_NAME=`ls -l /etc/sysconfig/network-scripts/ | grep ifcfg-e | awk -F ' ' ' {print $NF}' | awk -F '-' '{print $NF}'`
IP_ADDR=`ip ad | grep $ETH_NAME$ | awk -F ' ' '{print $2}' | awk -F '/' '{print $1}'`
#过滤出多物理网卡IP,只作参考
#ETH_NAME=`ls -l /etc/sysconfig/network-scripts/ | grep ifcfg-e | awk -F ' ' ' {print $NF}' | awk -F '-' '{print $NF}'`
#IP_ADDR=`ip ad | grep $ETH_NAME$ | grep '^ ' | awk -F ' ' '{print $2}' | awk -F '/' '{print $1}'`
command=$1
# 发布新包
function release() {
cd $WORK_DIR >/dev/null 2>&1
if [ $? -eq 0 ];
then
ls $ROOT_DIR
if [ $? -eq 0 ];
then
docker rm -f $CONTAINER_NAME >/dev/null 2>&1
mkdir $BACKUP_DIR
/usr/bin/mv $ROOT_DIR/* $BACKUP_DIR/
cp -r $WORK_DIR/$WAR_NAME.war $ROOT_DIR/
cd $ROOT_DIR/
jar xf $WAR_NAME.war
/usr/bin/rm -rf $WAR_NAME.war
docker run -d -p $SERVICE_PORT:8080 -v $ROOT_DIR:/opt/tomcat/webapps/ROOT -v /etc/localtime:/etc/localtime:ro --name $CONTAINER_NAME tomcat8/jdk8:v9
else
mkdir -p $ROOT_DIR
docker rm -f $CONTAINER_NAME >/dev/null 2>&1
mkdir $BACKUP_DIR
/usr/bin/mv $ROOT_DIR/* $BACKUP_DIR/
cp -r $WORK_DIR/$WAR_NAME.war $ROOT_DIR/
cd $ROOT_DIR/
jar xf $WAR_NAME.war
/usr/bin/rm -rf $WORK_DIR/$WAR_NAME.war
docker run -d -p $SERVICE_PORT:8080 -v $ROOT_DIR:/opt/tomcat/webapps/ROOT -v /etc/localtime:/etc/localtime:ro --name $CONTAINER_NAME tomcat8/jdk8:v9
fi
cd $WORK_DIR
if [ `ls -ltr | awk -F ' ' ' {print $NF}' | grep ^2019 | wc -l` -gt 3 ];
then
ls -lt | awk -F ' ' ' {print $NF}' | grep ^2019 | tail -n +4 | xargs /usr/bin/rm -rf
fi
echo "项目已启动!"
echo "请通过 http://$IP_ADDR:$SERVICE_PORT 来访问项目"
else
echo "请检查项目目录是否设置正确"
fi
}重新创建容器,不替换war包内容。例如直接修改了ROOT目录中的文件,不需要重新部署war包,直接重建容器、重新加载所有文件
function restart() {
docker rm -f $CONTAINER_NAME >/dev/null 2>&1 && docker run -d -p $SERVICE_PORT:8080 -v $ROOT_DIR:/opt/tomcat/webapps/ROOT -v /etc/localtime:/etc/localtime:ro --name $CONTAINER_NAME tomcat8/jdk8:v9
}
# 回滚至上一版。例如,发布最新版出现问题,需要回退到上一版
function rollback() {
cd $WORK_DIR
/usr/bin/rm -rf $ROOT_DIR/*
cp -r $WORK_DIR/$BACKUP_DIR/* $ROOT_DIR/
docker rm -f $CONTAINER_NAME >/dev/null 2>&1 && docker run -d -p $SERVICE_PORT:8080 -v $ROOT_DIR:/opt/tomcat/webapps/ROOT -v /etc/localtime:/etc/localtime:ro --name $CONTAINER_NAME tomcat8/jdk8:v9
}
case $command in
release)
release
;;
restart)
restart
;;
rollback)
rollback
;;
esac最后更新于