使用 shell 脚本部署中间件部署

629 阅读3分钟

因为公司没有使用容器化,所以让我们手动为地市项目部署中间件,部署一段时间后,我写了一些脚本,用于自动部署中间件,用来减少重复操作。
用文档记录下这次开发结果,以备不时之需。

kafka

#!/bin/sh

#遇到错误终止退出
set -o errexit

# 基础目录
basePwd=$(dirname $0)
deploymentPwd=$1/kafka

# 创建目录
mkdir -p $deploymentPwd

# 解压
tar -xvzf $basePwd/kafka_2.11-2.3.0.tgz -C $deploymentPwd

# 创建目录
mkdir -p $deploymentPwd/config
mkdir -p $deploymentPwd/data

# 创建配置文件 server.properties
serverConfigPath=$deploymentPwd/config/server.properties
touch $serverConfigPath
# 写入配置信息
ipAddr=$(hostname -I | grep -o "[^ ]\+\( \+[^ ]\+\)*")
echo "broker.id=0" >>$serverConfigPath
echo "listeners=PLAINTEXT://$ipAddr:9092" >>$serverConfigPath
echo "num.network.threads=3" >>$serverConfigPath
echo "num.io.threads=8" >>$serverConfigPath
echo "socket.send.buffer.bytes=102400" >>$serverConfigPath
echo "socket.receive.buffer.bytes=102400" >>$serverConfigPath
echo "socket.request.max.bytes=104857600" >>$serverConfigPath
echo "log.dirs=$deploymentPwd/data" >>$serverConfigPath
echo "num.partitions=1" >>$serverConfigPath
echo "num.recovery.threads.per.data.dir=1" >>$serverConfigPath
echo "offsets.topic.replication.factor=1" >>$serverConfigPath
echo "transaction.state.log.replication.factor=1" >>$serverConfigPath
echo "transaction.state.log.min.isr=1" >>$serverConfigPath
echo "log.retention.hours=168" >>$serverConfigPath
echo "log.segment.bytes=1073741824" >>$serverConfigPath
echo "log.retention.check.interval.ms=300000" >>$serverConfigPath
echo "zookeeper.connect=$ipAddr:2181" >>$serverConfigPath
echo "zookeeper.connection.timeout.ms=6000" >>$serverConfigPath
echo "group.initial.rebalance.delay.ms=0" >>$serverConfigPath

# 启动 kafka
sh $deploymentPwd/kafka_2.11-2.3.0/bin/kafka-server-start.sh -daemon $serverConfigPath

# 查询进程
ps -ef | grep kafka

echo "kafka 安装完成"


nacos

#!/bin/sh

# 需要jdk1.8
# 从代码开始构筑的haul,需要maven
# 需要开放防火墙端口
#     lsof -i:8848  检查端口是否被占用
#     firewall-cmd --zone=public --add-port=8848/tcp --permanent  开启防火墙端口
#     service firewalld restart 重启防火墙
#     firewall-cmd --remove-port=8848/tcp --permanent   关闭防火墙端口
#     firewall-cmd --list-ports  查看端口列表

#遇到错误终止退出
set -o errexit

# 环境参数检查
sh checkEnvironment.sh java >checkRet.log
checkRet=$(cat checkRet.log)
if [ "$checkRet" -ne "1" ]; then
  echo "java 环境缺失,请配置后重试"
  exit 0
fi

# 基础目录
basePwd=$(dirname $0)
deploymentPwd=$1/nacos

# 创建目录
mkdir -p $deploymentPwd

# 解压
tar -zxvf $basePwd/nacos-server-1.4.2.tar.gz -C $deploymentPwd

# 配置数据库
applicationPropertiesPath=$deploymentPwd/nacos/conf/application.properties

# 需要交互写入数据库配置
echo "添加数据库配置 ?(yOrN):"
read -r yOrN
if [ "$yOrN" = "y" ]; then
  # 默认配置
  echo "spring.datasource.platform=mysql" >>$applicationPropertiesPath
  echo "db.num=1" >>$applicationPropertiesPath

  # 交互配置
  echo "请输入 db.url:"
  read -r dbUrl
  echo "db.url.0=$dbUrl &" >>$applicationPropertiesPath
  echo "请输入 db.user:"
  read -r dbUser
  echo "db.user=$dbUser" >>$applicationPropertiesPath
  echo "请输入 db.password:"
  read -r dbPassword
  echo "db.password=$dbPassword" >>$applicationPropertiesPath
fi

# 启动 nacos
sh $deploymentPwd/nacos/bin/startup.sh -m standalone

# 查询进程
ps -ef | grep nacos

# 检查防火墙端口是否开启
opend=$(netstat -anp | grep ':8848 ' | wc -l)
if [ "$opend" -le "0" ]; then
  # 配置防火墙与端口
  lsof -i:8848
  firewall-cmd --zone=public --add-port=8848/tcp --permanent
  service firewalld restart
fi

echo "nacos 安装完成"

redis

#!/bin/sh

# 注意:
# 1.需要 yum
# 2.需要 GCC,,命令: yum -y install gcc

# 其他命令:
# 1.redis-server redis_6379.conf   #启动redis服务
# 3.redis-cli -h 192.168.1.19 -p 6379 shutdown    #停止redis服务
#   卸载: rm -f /usr/local/bin/redis*
#         rm -rf redis
# 4.systemctl restart redis.service #重新启动服务
# 5.systemctl status redis.service  #查看服务当前状态
# 6.systemctl enable redis.service  #设置开机自启动
# 7.systemctl disable redis.service #停止开机自启动
# 8.redis 重新编译:
#   make distclean
#   make && make install

#遇到错误终止退出
set -o errexit

# 环境参数检查
sh checkEnvironment.sh gcc >checkRet.log
checkRet=$(cat checkRet.log)
if [ "$checkRet" -ne "1" ]; then
  echo "gcc 环境缺失,请配置后重试"
  exit 0
fi

# 基础目录
basePwd=$(dirname $0)
deploymentPwd=$1/redis

# 创建数据目录
redisData6379=$deploymentPwd/data/redis_cluster/redis_6379
mkdir -p $redisData6379

# 创建 redis 安装目录
redisCluster6379=$deploymentPwd/redis_cluster/redis_6379
mkdir -p $redisCluster6379/{conf,pid,logs,bin}

# 解压 redis
tar -zxvf $basePwd/redis-5.0.10.tar.gz -C $deploymentPwd/redis_cluster/

# 创建软连接
ln -s $deploymentPwd/redis_cluster/redis-5.0.10 $deploymentPwd/redis_cluster/redis

# 跳转到 redis 目录
cd $deploymentPwd/redis_cluster/redis

# 编译
make && make PREFIX=$redisCluster6379 install

# 创建配置文件
redisConfPath=$redisCluster6379/conf/redis_6379.conf
touch ${redisConfPath}
# 写入redis配置
echo "# 以守护进程模式启动" >>$redisConfPath
echo "daemonize yes" >>$redisConfPath
echo "# 绑定的主机地址" >>$redisConfPath
echo "bind $(hostname -I)" >>$redisConfPath
echo "# 监听端口" >>$redisConfPath
echo "port 6379" >>$redisConfPath
echo "# pid文件和log文件的保存地址" >>$redisConfPath
echo "pidfile $redisCluster6379/pid/redis_6379.pid" >>$redisConfPath
echo "logfile $redisCluster6379/logs/redis_6379.log" >>$redisConfPath
echo "# 设置数据库的数量,默认数据库为0" >>$redisConfPath
echo "databases 16" >>$redisConfPath
echo "# 指定本地持久化文件的文件名,默认是dump.rdb" >>$redisConfPath
echo "dbfilename redis_6379.rdb" >>$redisConfPath
echo "# 本地数据的目录" >>$redisConfPath
echo "dir $deploymentPwd/data/redis_cluster/redis_6379" >>$redisConfPath
echo "" >>$redisConfPath
echo "# RDB" >>$redisConfPath
echo "save 900 1" >>$redisConfPath
echo "save 300 10" >>$redisConfPath
echo "save 60 10000" >>$redisConfPath
echo "" >>$redisConfPath
echo "# AOF" >>$redisConfPath
echo "appendonly yes" >>$redisConfPath
echo "appendfsync everysec" >>$redisConfPath
echo "appendfilename \"appendonly.aof\"" >>$redisConfPath

# 启动 redis
cd $redisCluster6379/bin
./redis-server $redisCluster6379/conf/redis_6379.conf

# 服务检查
# 检查 redis 进程是否存在
ps -ef | grep redis

echo "redis 安装完成"

rocketmq

#!/bin/sh

# 需要jdk1.8

#遇到错误终止退出
set -o errexit

# 基础目录
basePwd=$(dirname $0)
deploymentPwd=$1/rocketmq

# 环境参数检查
sh checkEnvironment.sh java >checkRet.log
checkRet=$(cat checkRet.log)
if [ "$checkRet" -ne "1" ]; then
  echo "java 环境缺失,请配置后重试"
  exit 0
fi

# 创建目录
mkdir -p $deploymentPwd

# 解压
unzip $basePwd/rocketmq-all-4.5.1-bin-release.zip -d $deploymentPwd

# 交互,修改启动参数
binPath="$deploymentPwd/rocketmq-all-4.5.1-bin-release/bin"

echo "修改 server jvm ?(yOrN):"
read -r yOrN

if [ "$yOrN" = "y" ]; then
  defServerJvm="-Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
  echo "请输入 jvm 参数:格式:$defServerJvm"
  read -r newServerJvm
  sed -i "s/JAVA_OPT=\"\${JAVA_OPT} -server $defServerJvm\"/JAVA_OPT=\"\${JAVA_OPT} -server $newServerJvm\"/g" $binPath/runserver.sh
  echo "newServerJvm 修改成功: $newServerJvm"
fi

echo "修改 broker jvm ?(yOrN):"
read -r yOrN
if [ "$yOrN" = "y" ]; then
  defBrokerJvm="-Xms8g -Xmx8g -Xmn4g"
  echo "请输入 jvm 参数:格式:$defBrokerJvm"
  read -r newBrokerJvm
  sed -i "s/JAVA_OPT=\"\${JAVA_OPT} -server $defBrokerJvm\"/JAVA_OPT=\"\${JAVA_OPT} $newBrokerJvm\"/g" $binPath/runbroker.sh
  echo "newBrokerJvm 修改成功: $newBrokerJvm"
fi

# 创建日志目录
logPath=$deploymentPwd/rocketmq-all-4.5.1-bin-release/logs
mkdir -p $logPath

# 启动 nacos
nohup sh $deploymentPwd/rocketmq-all-4.5.1-bin-release/bin/mqnamesrv >$logPath/mqnamesrv.log 2>&1 &
nohup sh $deploymentPwd/rocketmq-all-4.5.1-bin-release/bin/mqbroker -n monchickey:9876 >$logPath/mqbroker.log 2>&1 &

# 查询进程
ps -ef | grep rocketmq

echo "rocketmq 安装完成"

zookepper

#!/bin/sh

#1. 启动ZK服务: bin/zkServer.sh start
#2. 查看ZK服务状态: bin/zkServer.sh status
#3. 停止ZK服务: bin/zkServer.sh stop
#4. 重启ZK服务: bin/zkServer.sh restart
#5. 连接服务器: zkCli.sh -server 127.0.0.1:2181

#遇到错误终止退出
set -o errexit

# 环境参数检查
sh checkEnvironment.sh java >checkRet.log
checkRet=$(cat checkRet.log)
if [ "$checkRet" -ne "1" ]; then
  echo "java 环境缺失,请配置后重试"
  exit 0
fi

# 基础目录
basePwd=$(dirname $0)
deploymentPwd=$1/zookepper

# 创建目录
mkdir -p $deploymentPwd

# 解压
tar -zxvf $basePwd/zookeeper-3.4.14.tar.gz -C $deploymentPwd

# 创建 zoo.cfg 文件
zooCfgPath=$deploymentPwd/zookeeper-3.4.14/conf/zoo.cfg
touch $zooCfgPath
# 写入配置信息
echo "tickTime=2000" >>$zooCfgPath
echo "initLimit=10" >>$zooCfgPath
echo "syncLimit=5" >>$zooCfgPath
echo "dataDir=$deploymentPwd/data" >>$zooCfgPath
echo "clientPort=2181" >>$zooCfgPath

# 启动 zk
sh $deploymentPwd/zookeeper-3.4.14/bin/zkServer.sh start $deploymentPwd/zookeeper-3.4.14/conf/zoo.cfg

# 查询进程
ps -ef | grep zookeeper

echo "zookeeper 安装完成"

环境检查脚本


#!/bin/sh

# checkEnvironment.sh

error_exit() {
  echo "ERROR: $1 !!"
  exit 1
}

if command -v "$1" >/dev/null 2>&1; then
  echo "1"
else
  echo "0"
fi

exit 0

统一调用脚本

#!/bin/sh

#遇到错误终止退出
set -o errexit
# 交互
# 部署路径
while true; do
  echo "请输入中间件安装目录:"
  read -r deploymentPath
  if [ -z "$deploymentPath" ]; then
    continue
  fi
  break
done
# 选择要安装的中间件
while true; do
  echo "请选择要安装的中间件:"
  echo "  1.Kafka"
  echo "  2.Nacos"
  echo "  3.Redis"
  echo "  4.Rocketmq"
  echo "  5.Zookeeper"
  echo "退出请按:e"
  read -r selected

  if [ "$selected" = "1" ]; then
    sh kafka/kafkaDeployment.sh $deploymentPath
  fi
  if [ "$selected" = "2" ]; then
    sh nacos/nacosDeployment.sh $deploymentPath
  fi
  if [ "$selected" = "3" ]; then
    sh redis/redisDeployment.sh $deploymentPath
  fi
  if [ "$selected" = "4" ]; then
    sh rocketmq/rocketmqDeployment.sh $deploymentPath
  fi
  if [ "$selected" = "5" ]; then
    sh zookepper/zookeeperDeployment.sh $deploymentPath
  fi
  if [ "$selected" = "e" ]; then
    break
  fi
done