基本操作步骤

1、虚拟机最小化安装rocky9系统,安装后克隆一个系统用来编写sh 测试脚本;

2、安装 repotrack 程序,来获取rpm

3、将安装后缓存的rpm包下载下来,并打tar.gz包,并传至指定路径;

4、编写自动化安装mysql sh脚本;       

5、测试运行一键安装命令

附录(本文章最后)

        1)rpm及编写的脚本(本教程的centos7、rocky9.3)

        2)centos7 自动化 mysql、redis、nginx、jdk、rabbitMq、syslog程序的soft.sh脚本

你编写脚本可能报换行或空格错误:sh脚本报一堆空格换行错误:需将转成unix标准格式;

#切换到上传的脚本路径
dos2unix 脚本文件名.sh

你可能用到的编写sh 脚本的参考:

        1)下教程包含:1)中文字体,2)jdk  3)java依赖及时间同步器 ;4)nginx ; 5)redis

springboot vue 部署至Rocky(Centos)并能断电自启动,本文部署是若依应用-CSDN博客文章浏览阅读400次。安装中文字体(防止中文乱码)3、安装chrony(保证分布式部署时间的一致性)5、安装mysql数据,迁移目录,并授权自启动;6、安装redis,并设置自动动;7、安装nginx,并设置自启动;8、部署jar包,并设置自启动;参考教程Rocky(Centos)挂在磁盘_小云小白的博客-CSDN博客6、编辑 /etc/fstab 文件,最后添加单行。7、重启,并查看挂在磁盘是否仍在。发现/dev/vdb未挂载。2、对此系统可用磁盘。4、新建data路径。icon-default.png?t=N7T8https://blog.csdn.net/qq_26408545/article/details/132690191        2)这边centos7 安装rabbitMq参考

centos7.6安装rabbitMq3.11.10和erlang25_centos rabbitmq 3.11 安装-CSDN博客文章浏览阅读1.7k次,点赞3次,收藏6次。解压后,上传到目录/usr/lib/rabbitmq/lib/rabbitmq_server-3.11.10/plugins。此时根据信息,打开/usr/lib/rabbitmq/bin/rabbitmq-server:(根据个人实际情况)应是rabbitqmq找不到erlang的安装环境,导致启动失败。用默认的账号密码【guest/guest】登录出现权限问题。当前目录:/usr/local/software。在最后加上下面两句话,路径根据自己配置的写。访问:http://ip:15672/_centos rabbitmq 3.11 安装icon-default.png?t=N7T8https://blog.csdn.net/weixin_44142888/article/details/129549426        3)安装 syslog 参考

centos搭建简单自用syslog服务器_centos syslog-CSDN博客文章浏览阅读3.7k次,点赞5次,收藏22次。centos搭建简单自用syslog服务器_centos syslogicon-default.png?t=N7T8https://blog.csdn.net/weixin_44270742/article/details/130101096

1、虚拟机最小化安装rocky9系统

参考:vmware安装 Rocky9(自定义分区安装),并开启服务器监控-CSDN博客文章浏览阅读1.1k次,点赞3次,收藏4次。目前市面上cpu现成:基本是4~32不等;这里配置6个占一半;例如:磁盘总大小360G :1、先添加/boot:2Gib;2、再添加swap(2Gib可以4Gib交换区,超过这个一律一样大,前面没有反斜杠)3、再添加/data挂在盘300Gib;4、在添加系统跟路径:/;大小不设置会占用所有剩余空间;然后点击上面的完成按钮;磁盘分区知识:/boot 系统引导区域;swap内存交换区-跟你的内存一样大最好。_rocky9icon-default.png?t=N7T8https://blog.csdn.net/qq_26408545/article/details/133963090

1)最小化安装

2)存盘一定是标准分区(设备类型均为:标准分区。如下图);不要自动化磁盘:就4个用途路径

3)安装后克隆1台虚拟机(标准分区的可直接克隆)

2、获取rpm包

方法一:

1、安装

# 安装 repotrack
yum install yum-utils
# 查找提供的程序
yum provides repotrack

 

2、确保可用,并且获取rpm

# 再次执行确保已安装
yum install -y -q yum-utils-1.1.31-54.el7_8.noarch

# 获取某个应用到路径下 -p 后门写的是下载路径
repotrack -p /opt/rpms gcc

# 你找你已经安装的软件名
rpm -qa | grep -E 'chrony|chronyd'

方法二:

 在/etc/yum.conf  最下面添加,然后安装软件,则该软件包的rpm 会存储至该路径下

#开始缓存:0关闭,1开启
keepcache=1
#指定缓存路径
cachedir=/opt/yum/rpm

参考

使用repotrack下载指定rpm包及其全量依赖包-CSDN博客文章浏览阅读415次。1.1 使用查看提供某个命令/value的rpm包1.2 使用查看rpm包所需的全部依赖。_repotrackicon-default.png?t=N7T8https://blog.csdn.net/mnhpo_Q/article/details/131147077

3、将安装后缓存的rpm包下载下来,并打tar.gz包,并传至指定路径;

1)将缓存文件,按如图方式放置在文件夹下;

这里我是安装后,查了一下mysql 版本8.0.36:

其中:1)base放的是mysql的安装包,2)depend-rpm:防止的是其他依赖包,3)config:是mysql的配置文件(未优化过的);

不参与sh脚本的:1)base-yum不参与sh脚本,是从mysql 拿到的 yum的rpm包;2)readMe.txt:内部使用的简单说明

2)将其打成tar.gz 用于 脚本安装的依赖程序包

用的软件压缩的tar.gz :1)先压缩 tar;2)再把tar 压过 gzip,得到 tar.gz 文件

Windows如何将文件压缩成.tar.gz的格式_windows压缩tar.gz文件-CSDN博客文章浏览阅读1.9w次,点赞13次,收藏38次。我们平时使用Linux和Windows系统相互传文件的时候,使用rar或者zip的压缩文件往往不是很方便,tar.gz是Linux和Unix下面比较常用的格式,那么如何再Windows下将文件压缩成tar.gz的格式呢?这时候,我们会得到一个tar文件,容易发现,tar文件的大小并未发生明显变化,这是因为tar实际上只是对文件进行简单的打包。5.接下来我们将刚才得到的tar文件“添加到压缩包”,如下图所示,选择压缩格式下选择“gzip”格式,即可得到tar.gz的压缩文件啦。..._windows压缩tar.gz文件icon-default.png?t=N7T8https://blog.csdn.net/YSL_Lsy_/article/details/1259961523)将其上传至 /opt/soft,新建文件夹和切换路径如下:

mkdir -p /opt/soft
cd /opt/soft

将文件上传路径,如图

4、编写自动化安装mysql sh脚本; 

编写脚本:

  参考,就是将教程的 yum install 软件 换成 yum -y localinstall *.rpm

Centos(rocky) yum 安装mysql,切换路径、优化配置并设置开机自启_服务器开机自启mysql-CSDN博客文章浏览阅读2.5k次。1、安装方式介绍mysql安装共3中方式1)yum安装,最简单的方式2)rpm包安装,切记下载相应系统的 稳定版 源码包,相对较简单3)压缩包安装:自由度高,但配置相应复杂,且需要自己注册自启服务注:1,2,3无法在一台机器上共存,1,2可以通过mulit-mysql启动多个服务看,但无法实现:单机上的myql主从只有3方式支持1台安装多个mysql服务,实现mysql主从一、安装步骤1.获取最新的yum rmp包地址下载地址:MySQL :: MySQL Commu_服务器开机自启mysqlicon-default.png?t=N7T8https://blog.csdn.net/qq_26408545/article/details/124114793?spm=1001.2014.3001.5502

soft.sh 脚本内容

#!/bin/bash
# 项目部署基础路径
BASE_PATH="/usr/local"

# 压缩包名
TAR_GZ_NAME="centos9.3-rpm.tar.gz"

# 压缩包和脚本的发布路径
PUSH_SH_PATH="/opt/soft"

# 解压路径
UNZIP_TEMP_PATH="/usr/local/soft_unzip"

# 1.1 使用的账号
MYSQL_USER="root"
# 1.2 数据库密码
MYSQL_PWD="123456"
# 1.3 自动创建数据库名称
MYSQL_CREATE_DB_NAME="test_db"

# 2 开放防火墙端口
open_ports=("3306")
#-------------------往下为不建议调整参数--------------------
#参数1:操作类型
operate="$1"
#可选参数2 指定安装的软件
soft="$2"

# 发布压缩包 解压后路径(会在解压后确定)
PUSH_TEMP_PATH=""

# 检测的java_home位置的变量
JAVA_HOME=""

# 中文字体路径
FONT_PATH="/usr/share/fonts/chinese"

# 系统服务所在路径
SYS_SERVICE_PATH="/etc/systemd/system"

# 空数组:存储汇总日志
log_array=()
# 临时日志变量
LOG_TEMP_LOG=""

#使用说明,用来提示输入参数
usage() {
    echo "脚本可选通用命令:"
	echo " ● 安装 1) sh soft.sh push 参数2:可选项[mysql],无第二个参数,安装所有-需确认,all:安装所有-无需确认;"
	echo " ● 卸载 2)sh soft.sh remove 参数2:可选项[mysql],无第二个参数:卸载所有;"
	echo " ● 日志 3)sh soft.sh log 参数2:可选项[mysql],无第二个参数:查看所有;"
	
	echo " ● -- 参数 2 概述:"
	echo " ●      1、mysql:mysql-8.0.36"
    exit 1
}

#建立相关文件夹并注册自启动服务
push(){
	#解压tar包
	un_tar_gz
	
	# 如果未指定安装软件
	if [ -z "${soft}" ]; then
	
		# 1、安装 mysql
		while true; do
			# 1 提示用户输入(y or n)
			read -p "3、do you want to install mysql-8.0.36 ?(y or n) " option
			# 2、检查用户输入的选项值
			if [ "$option" = "y" ]; then
				mysql_install
				break
			elif [ "$option" = "n" ]; then
				LOG_TEMP_LOG=" ● ignore install:3、mysql-8.0.36 "
				log_array+=("$LOG_TEMP_LOG")
				echo "$LOG_TEMP_LOG"
				break
			else
				echo "no effect value,please enter(y or n)"
			fi
		done
	else
		case "$soft" in
			"mysql")
				mysql_install
				;;
			"all")
				# 1、安装 mysql
				mysql_install
				;;
		esac
	fi
	
	#删除解压的文件
	rm -rf $UNZIP_TEMP_PATH
	# 开放防火墙
	firewall_port_open
	# 调优系统配置
	sys_com_tuning
	
	# 8、打印汇总日志
	if [ -z "${soft}" ] ||[ "${soft}" = "all" ]; then
		# 打印汇总日志
		pirnt_sum_log
	fi
	
	echo " ● end: end of install exe;"
}

# 卸载服务结束
remove(){
	# 关闭防火墙(应用不在时,有警告,需在最前面)
	firewall_port_close
	
	# 1、安装 mysql
	if [ -z "${soft}" ] || [ "${soft}" = "mysql" ]; then
		mysql_remove
	fi
	
	# 2、打印汇总日志
	if [ -z "${soft}" ]; then
		# 打印汇总日志
		pirnt_sum_log
	fi
	
	echo " ● end: 卸载命令执行结束;"
}

#日志
log(){
    
	# 1、安装 mysql
	if [ -z "${soft}" ] || [ "${soft}" = "mysql" ]; then
		mysql_log
	fi
	
	# 2、 打印汇总日志
	if [ -z "${soft}" ]; then
		pirnt_sum_log
	fi
}

mysql_install(){
	# 1、安装mysql的依赖
	cd $PUSH_TEMP_PATH/mysql-8.0.36/depend-rpm
	yum -y localinstall *.rpm
	
	# 2.1 添加mysql用户组
	groupadd mysql
	#2.2 用户组添加用户
	useradd -g mysql mysql
	
	# 3 安装mysql的依赖
	cd $PUSH_TEMP_PATH/mysql-8.0.36/base
	yum -y localinstall *.rpm
	
	# 4 执行初始化并指定密码
	/usr/sbin/mysqld --initialize --user=mysql --lower-case-table-names=1
	
	# 5 备份并修改配置
	rm -rf /etc/my.cnf.bak
	cp -rf /etc/my.cnf /etc/my.cnf.bak
	# 5.1 替换mysql 配置文件
    cat $PUSH_TEMP_PATH/mysql-8.0.36/conf/my.cnf > /etc/my.cnf
	
	# 启动MySQL服务  
	echo "正在启动MySQL服务..."  
	sudo systemctl start mysqld  
	  
	# 等待MySQL服务启动完成   
	sleep 5
	
	# 获取默认密码
	DEFAULT_PASSWORD=$(sudo grep 'A temporary password' /var/log/mysqld.log | awk '{print $NF}')

	# 使用mysqladmin修改密码
	mysqladmin -u root -p"${DEFAULT_PASSWORD}" password "$MYSQL_PWD"

	# 重启MySQL服务
	sudo systemctl restart mysqld

	# 等待启动完成,导入数据(空库可以启动快)   
	sleep 5
	# 连接到MySQL数据库服务器并创建数据库 
	mysql -u"root" -p"$MYSQL_PWD" -e "CREATE DATABASE ${MYSQL_CREATE_DB_NAME}"
	
	# 开启远程访问
	mysql_open_remote
	
	echo " ● end install: mysql-8.0.36;"
	
	# 显示 mysql 状态
	mysql_log
}

mysql_remove(){
	# 1 如果未安装mysql,则退出
	mysqld_install_status=`systemctl list-unit-files | grep mysqld`
	if [ -z "${mysqld_install_status}" ]; then
		return
	fi
	
	# 停止MySQL服务  
	systemctl stop mysqld  
	  
	# 卸载MySQL软件包及其依赖项  
	yum remove -y mysql mysql-server mysql-libs mysql-client-plugins mysql-common
	  
	# 删除MySQL数据目录和配置文件(请谨慎操作)  
	rm -rf /var/lib/mysql 
	rm -rf /etc/my.cnf
	rm -rf /etc/my.cnf.bak
	rm -rf /var/log/mysqld.log
	
	mysql_log
	echo " ● end remove: mysql-8.0.36;"
}

mysql_log(){
	# 1 检测 mysql 是否自启动
	MYSQL_STATUS=$(systemctl is-active mysqld)
	if [ "${operate}" != "remove"  ]; then
		# 2.1 如果操作类型不是卸载,且 mysql 状态为:活跃的,打印成功,否则打印失败
		if [ "${MYSQL_STATUS}" = "active" ]; then
			
			LOG_TEMP_LOG=" ● success: start mysql-8.0.36"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		else
			LOG_TEMP_LOG=" ● error: start mysql-8.0.36"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		fi
	else
		#3 如果操作类型是卸载,且识别 mysql 状态为不存在 或者失败
		if [ "${MYSQL_STATUS}" = "unknown" ] || [ "${MYSQL_STATUS}" = "failed" ]; then
		
			LOG_TEMP_LOG=" ● success:remove mysql-8.0.36"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		else
			LOG_TEMP_LOG=" ● error:remove mysql-8.0.36"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		fi
	fi
	
	# 4 如果单独安装 mysql,或者查看指定查看 mysql 日志,则显示日志
	if [ "${soft}" = "mysql" ] && { [ "${operate}" = "log" ] || [ "${operate}" = "push"  ]; }; then
		tail -f -n 20 /var/log/mysqld.log
	fi
}

mysql_imp_sql(){
	SQL_FILE="${PUSH_TEMP_PATH}/mysql-8.0.36/conf/initDb.sql"
	if [ -e "$SQL_FILE" ]; then
		mysql -u"${MYSQL_USER}" -p"${MYSQL_PWD}" $MYSQL_CREATE_DB_NAME < "$SQL_FILE"
		log_array+=(" ● 执行 mysql 数据数据化。")
		echo " ● 执行 mysql 数据数据化。" 
	else
		log_array+=(" ● 发布包不含 mysql 数据库初始化脚本。")
		echo " ● 发布包不含 mysql 数据库初始化脚本。" 
	fi
}

# mysql 开放远程访问
# 防火墙还未开放(在防火墙内操作)
mysql_open_remote(){
	echo " ● 配置mysql 可以远程访问"
	# 开放远程访问
	mysql -u"${MYSQL_USER}" -p"${MYSQL_PWD}" -e "CREATE USER '${MYSQL_USER}'@'%' IDENTIFIED BY '${MYSQL_PWD}'"
	mysql -u"${MYSQL_USER}" -p"${MYSQL_PWD}" -e "GRANT ALL PRIVILEGES ON *.* TO '${MYSQL_USER}'@'%' WITH GRANT OPTION"
	mysql -u"${MYSQL_USER}" -p"${MYSQL_PWD}" -e "FLUSH PRIVILEGES;"
}

# mysql 关闭远程远程访问
# 防火墙还未开放(在防火墙内操作)
mysql_close_remote(){
	#关闭防火墙
	echo " ● 配置mysql 关闭远程访问;"
	# 开放远程访问
	mysql -u"${MYSQL_USER}" -p"${MYSQL_PWD}" -e "REVOKE ALL PRIVILEGES ON *.* FROM '${MYSQL_USER}'@'%';"
	mysql -u"${MYSQL_USER}" -p"${MYSQL_PWD}" -e "DROP USER '${MYSQL_USER}'@'%'"
	mysql -u"${MYSQL_USER}" -p"${MYSQL_PWD}" -e "FLUSH PRIVILEGES;"
}

#解压tar包
un_tar_gz(){
	#1 删除可能存在的解压不全的临时文件
	rm -rf $UNZIP_TEMP_PATH
	
	#2 创建加压的文件夹
	mkdir -p $UNZIP_TEMP_PATH

	#2 进行解压操作
	tar -zxvf $PUSH_SH_PATH/$TAR_GZ_NAME -C $UNZIP_TEMP_PATH 
	
	#3 获取加压后的文件路径
	#UNZIP_DIR_NAME=$(echo "$UNZIP_TEMP_PATH"/* | awk '{print $1}' | xargs basename)
	UNZIP_DIR_NAME=$(tar -tzf "$PUSH_SH_PATH"/"$TAR_GZ_NAME" | head -1 | cut -d '/' -f 1)
	
	#4 获取到解压后的真实路径
	PUSH_TEMP_PATH=$UNZIP_TEMP_PATH/$UNZIP_DIR_NAME
}

#打印中途记录的在log_array内的内容
pirnt_sum_log(){
	# 打印数组的每个元素
	echo "-----------------------summary-log-start------------------------------"
	for element in "${log_array[@]}"; do
		echo "$element"
	done
	echo "-----------------------summary-log-end ------------------------------"
}

#防火墙开放端口
firewall_port_open(){

	# 定义要检查的端口号
	PORT=88
	# 检查指定端口是否已经开放
	if sudo firewall-cmd --list-ports | grep -q "\<$PORT\/tcp\>"; then
		LOG_TEMP_LOG=" ● 端口 $PORT 已经开放,跳过"
		log_array+=("$LOG_TEMP_LOG")
		echo "$LOG_TEMP_LOG"
		return;
	fi

	echo "调整 firewall 防火墙:"
	firewall-cmd --zone=public --add-port=88/tcp --permanent
	firewall-cmd --zone=public --add-port=3306/tcp --permanent
	
	firewall-cmd --reload
	
	# 防火墙日志
	firewall_port_log
}

#防火墙开放端口
firewall_port_open(){
	# 检查端口是否已经开放
	PORT=$open_ports[0]
	# 检查指定端口是否已经开放
	if sudo firewall-cmd --list-ports | grep -q "\<$PORT\/tcp\>"; then
		LOG_TEMP_LOG=" ● 端口 $PORT 已经开放,跳过"
		log_array+=("$LOG_TEMP_LOG")
		echo "$LOG_TEMP_LOG"
		return;
	fi
	
	#循环开放端口
	for open_port in "${open_ports[@]}"
	do
		echo "开放firewall 防火墙-端口:${open_port}"
		firewall-cmd --zone=public --add-port=${open_port}/tcp --permanent
	done
	firewall-cmd --reload
	# 防火墙日志
	firewall_port_log
}

#防火墙关闭端口
firewall_port_close(){
	for open_port in "${open_ports[@]}"
	do
		echo "关闭firewall 防火墙-端口:${open_port}"
		firewall-cmd --zone=public --remove-port=${open_port}/tcp --permanent
	done
	firewall-cmd --reload
	# 防火墙日志
	firewall_port_log
}

#防火墙日志
firewall_port_log(){
	open_ports=$(firewall-cmd --list-ports)
	LOG_TEMP_LOG=" ● firewall-cmd open port:${open_ports}"
	log_array+=("$LOG_TEMP_LOG")
	echo "$LOG_TEMP_LOG"
}

# 系统调优(RedHat系列linux)
sys_com_tuning(){
	
	# 搜索文件中是否包含指定文本
   if grep -q "# 全局的打开文件数" "/etc/systemd/system.conf"; then
		LOG_TEMP_LOG=" ● 系统配置 已调优(适配 RedHat系列linux),跳过"
		log_array+=("$LOG_TEMP_LOG")
		echo "$LOG_TEMP_LOG"
        return
    fi

	# 1 调整systemctl管理的 servie 资源限制
	echo "# 全局的打开文件数" >> /etc/systemd/system.conf
	echo "DefaultLimitNOFILE=1048576" >> /etc/systemd/system.conf
	echo "# 全局打开进程数" >> /etc/systemd/system.conf
	echo "DefaultLimitNPROC=65535" >> /etc/systemd/system.conf
	
	# 2 调整系统内核参数
	echo "# 全局:端口最大的监听队列的长度,可为:32768" >> /etc/sysctl.conf
	echo "net.core.somaxconn=32768" >> /etc/sysctl.conf
	echo "# 内存分配模式:1为不限制" >> /etc/sysctl.conf
	echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
	echo "# 单进程打开文件句柄数" >> /etc/sysctl.conf
	echo "fs.nr_open = 2097152" >> /etc/sysctl.conf
	echo "# 系统打开文件句柄数" >> /etc/sysctl.conf
	echo "fs.file-max = 102400" >> /etc/sysctl.conf
	
	# 2.1 刷新内核参数,立即生效
	/sbin/sysctl -p
	
	# 3 调整用户组资源限制
	echo "# 用户会话的 打开文件句柄数" >> /etc/security/limits.conf
	echo "* soft nofile 1048576" >> /etc/security/limits.conf
	echo "* hard nofile 1048576" >> /etc/security/limits.conf
	echo "# 用户会话的 打开进程数限制" >> /etc/security/limits.conf
	echo "* soft nproc 65535" >> /etc/security/limits.conf
	echo "* hard nproc 65535" >> /etc/security/limits.conf
	
	LOG_TEMP_LOG=" ● 系统配置 调优完成(适配 RedHat系列linux)"
	log_array+=("$LOG_TEMP_LOG")
	echo "$LOG_TEMP_LOG"
}

#根据输入参数,选择执行对应方法,不输入则执行使用说明 
case "$1" in
	"push") 
        push 
        ;;
	"remove") 
        remove 
        ;;
    "log") 
        log 
        ;;
    *)
usage 
;; 
esac

5、测试运行一键安装命令

1)将文件上传至另一台机器上,进程测试,并纠正sh脚本;

#授予执行权限
chmod +x soft.sh
#测试安装
sh soft.sh push

2) 成功安装的效果图

 卸载脚本,重新测试

cd /opt/soft
sh soft.sh remove

新的脚本,比之centos7 多了默认开放远程访问数据,安装后可连接测试

附录:

1)测试用的rpm及相关文件:

链接:https://pan.baidu.com/s/1NSB8VqDjNgaj2tzOY9uT6w 
提取码:blib 

2)centos7 自动化 mysql、redis、nginx、jdk、rabbitMq、syslog程序的soft.sh 脚本

centos7 的yum 文件修改 如图

soft.sh 脚本:

注:centos7已经快停止维护了,仅做参考

#!/bin/bash
# 项目部署基础路径
BASE_PATH="/usr/local"

# 压缩包名
TAR_GZ_NAME="centos7-rpm.tar.gz"

# 压缩包和脚本的发布路径
PUSH_SH_PATH="/opt/push"

# 解压路径
UNZIP_TEMP_PATH="/usr/local/soft_unzip"

# 1.1 数据库密码
MYSQL_PWD="123456"
# 1.2 自动创建数据库名称
MYSQL_CREATE_DB_NAME="test_db"

# 2 安装到的JavaPath路径
JAVA_HOME_PATH="/usr/local/jdk17-TencentKona"

# 2 rabbitMq 账号和密码
RABBITMQ_USER="admin"
RABBITMQ_PWD="123456"
#-------------------往下为不建议调整参数--------------------
#参数1:操作类型
operate="$1"
#可选参数2 指定安装的软件
soft="$2"

# 发布压缩包 解压后路径(会在解压后确定)
PUSH_TEMP_PATH=""

# 检测的java_home位置的变量
JAVA_HOME=""

# 中文字体路径
FONT_PATH="/usr/share/fonts/chinese"

# 系统服务所在路径
SYS_SERVICE_PATH="/etc/systemd/system"

# 空数组:存储汇总日志
log_array=()
# 临时日志变量
LOG_TEMP_LOG=""

#使用说明,用来提示输入参数
usage() {
    echo "脚本可选通用命令:"
	echo " ● 安装 1) sh soft.sh push 参数2:可选项[font|jdk|mysql|nginx|redis|rabbitmq|syslog|all],无第二个参数,安装所有-需确认,all:安装所有-无需确认;"
	echo " ● 卸载 2)sh soft.sh remove 参数2:可选项[font|jdk|mysql|nginx|redis|rabbitmq|syslog],无第二个参数:卸载所有;"
	echo " ● 日志 3)sh soft.sh log 参数2:可选项[font|jdk|mysql|nginx|redis|rabbitmq|syslog],无第二个参数:查看所有;"
	
	echo " ● -- 参数 2 概述:"
	echo " ●      1、font:中文字体,2、jdk :java运行依赖,及jdk-17-TencentKona;"
	echo " ●      3、mysql:mysql-8.0.36,4、nginx:nginx-1.24.0,5、redis:redis-7.2.4"
	echo " ●      6、rabbitmq:rabbitmq-3.11.28,7、syslog:syslog-8.24.0"
    exit 1
}

#建立相关文件夹并注册自启动服务
push(){
	#解压tar包
	un_tar_gz
	
	# 如果未指定安装软件
	if [ -z "${soft}" ]; then
		# 1、安装 中文字体
		while true; do
			# 1 提示用户输入(y or n)
			read -p "1、do you want to install chinese font?(y or n) " option
			# 2、检查用户输入的选项值
			if [ "$option" = "y" ]; then
				font_install
				break
			elif [ "$option" = "n" ]; then
				LOG_TEMP_LOG=" ● ignore install:1、chinese font "
				log_array+=("$LOG_TEMP_LOG")
				echo "$LOG_TEMP_LOG"
				break
			else
				echo "no effect value,please enter(y or n)"
			fi
		done
		
		# 2、安装 jdk
		while true; do
			# 1 提示用户输入(y or n)
			read -p "2、do you want to install jdk17_TencentKona?(y or n) " option
			# 2、检查用户输入的选项值
			if [ "$option" = "y" ]; then
				jdk17_TencentKona_install
				break
			elif [ "$option" = "n" ]; then
				LOG_TEMP_LOG=" ● ignore install:2、jdk17_TencentKona "
				log_array+=("$LOG_TEMP_LOG")
				echo "$LOG_TEMP_LOG"
				break
			else
				echo "no effect value,please enter(y or n)"
			fi
		done
		
		# 3、安装 mysql
		while true; do
			# 1 提示用户输入(y or n)
			read -p "3、do you want to install mysql-8.0.36 ?(y or n) " option
			# 2、检查用户输入的选项值
			if [ "$option" = "y" ]; then
				mysql_install
				break
			elif [ "$option" = "n" ]; then
				LOG_TEMP_LOG=" ● ignore install:3、mysql-8.0.36 "
				log_array+=("$LOG_TEMP_LOG")
				echo "$LOG_TEMP_LOG"
				break
			else
				echo "no effect value,please enter(y or n)"
			fi
		done
		
		# 4、安装 nginx
		while true; do
			# 1 提示用户输入(y or n)
			read -p "4、do you want to install nginx-1.24.0 ?(y or n) " option
			# 2、检查用户输入的选项值
			if [ "$option" = "y" ]; then
				nginx_install
				break
			elif [ "$option" = "n" ]; then
				LOG_TEMP_LOG=" ● ignore install:4、nginx-1.24.0 "
				log_array+=("$LOG_TEMP_LOG")
				echo "$LOG_TEMP_LOG"
				break
			else
				echo "no effect value,please enter(y or n)"
			fi
		done
		
		# 5、安装 redis
		while true; do
			# 1 提示用户输入(y or n)
			read -p "5、do you want to install redis-7.2.4 ?(y or n) " option
			# 2、检查用户输入的选项值
			if [ "$option" = "y" ]; then
				redis_install
				break
			elif [ "$option" = "n" ]; then
				LOG_TEMP_LOG=" ● ignore install:5、redis-7.2.4 "
				log_array+=("$LOG_TEMP_LOG")
				echo "$LOG_TEMP_LOG"
				break
			else
				echo "no effect value,please enter(y or n)"
			fi
		done
		
		# 6、安装 rabbitmq
		while true; do
			# 1 提示用户输入(y or n)
			read -p "6、do you want to install rabbitmq-3.11.28 ?(y or n) " option
			# 2、检查用户输入的选项值
			if [ "$option" = "y" ]; then
				rabbitmq_install
				break
			elif [ "$option" = "n" ]; then
				LOG_TEMP_LOG=" ● ignore install:6、rabbitmq-3.11.28 "
				log_array+=("$LOG_TEMP_LOG")
				echo "$LOG_TEMP_LOG"
				break
			else
				echo "no effect value,please enter(y or n)"
			fi
		done
		
		# 7、安装 syslog
		while true; do
			# 1 提示用户输入(y or n)
			read -p "7、do you want to install rsyslog-8.24.0 ?(y or n) " option
			# 2、检查用户输入的选项值
			if [ "$option" = "y" ]; then
				syslog_install
				break
			elif [ "$option" = "n" ]; then
				LOG_TEMP_LOG=" ● ignore install:7、rsyslog-8.24.0 "
				log_array+=("$LOG_TEMP_LOG")
				echo "$LOG_TEMP_LOG"
				break
			else
				echo "no effect value,please enter(y or n)"
			fi
		done
	else
		case "$soft" in
			"font")
				font_install
				;;
			"jdk")
			   jdk17_TencentKona_install
				;;
			"mysql")
				mysql_install
				;;
			"nginx")
				nginx_install
				;;
			"redis")
				redis_install
				;;
			"rabbitmq")
				rabbitmq_install
				;;
			"syslog")
				syslog_install
				;;
			"all")
			    #1、安装 中文字体
				font_install
				# 2、安装 jdk
				jdk17_TencentKona_install
				# 3、安装 mysql
				mysql_install
				# 4、安装 nginx
				nginx_install
				# 5、安装 redis
				redis_install
				# 6、安装 rabbitmq
				rabbitmq_install
				# 7、安装 syslog
				syslog_install
				;;
		esac
	fi
	
	#删除解压的文件
	rm -rf $UNZIP_TEMP_PATH
	# 开放防火墙
	firewall_port_open
	# 调优系统配置
	sys_com_tuning
	
	# 8、打印汇总日志
	if [ -z "${soft}" ] ||[ "${soft}" = "all" ]; then
		# 打印汇总日志
		pirnt_sum_log
	fi
	
	echo " ● end: end of install exe;"
}

# 卸载服务结束
remove(){
	# 关闭防火墙(应用不在时,有警告,需在最前面)
	firewall_port_close
	
	# 1、中文字体
	if [ -z "${soft}" ] || [ "${soft}" = "font" ]; then
		font_remove
	fi
	
	# 2、安装jdk
	if [ -z "${soft}" ] || [ "${soft}" = "jdk" ]; then
		jdk17_TencentKona_remove
	fi
	
	# 3、安装 mysql
	if [ -z "${soft}" ] || [ "${soft}" = "mysql" ]; then
		mysql_remove
	fi
	
	# 4、安装 nginx
	if [ -z "${soft}" ] || [ "${soft}" = "nginx" ]; then
		nginx_remove
	fi
	
	# 5、安装 redis
	if [ -z "${soft}" ] || [ "${soft}" = "redis" ]; then
		redis_remove
	fi
	
	# 6、安装 rabbitmq
	if [ -z "${soft}" ] || [ "${soft}" = "rabbitmq" ]; then
		rabbitmq_remove
	fi
	
	# 7、安装 syslog
	if [ -z "${soft}" ] || [ "${soft}" = "syslog" ]; then
		syslog_remove
	fi
	
	# 8、打印汇总日志
	if [ -z "${soft}" ]; then
		# 打印汇总日志
		pirnt_sum_log
	fi
	
	echo " ● end: 卸载命令执行结束;"
}

#日志
log(){
    # 1、中文字体
	if [ -z "${soft}" ] || [ "${soft}" = "font" ]; then
		font_log
	fi
	
	# 2、安装jdk
	if [ -z "${soft}" ] || [ "${soft}" = "jdk" ]; then
		jdk17_TencentKona_log
	fi
	
	# 3、安装 mysql
	if [ -z "${soft}" ] || [ "${soft}" = "mysql" ]; then
		mysql_log
	fi
	
	# 4、安装 nginx
	if [ -z "${soft}" ] || [ "${soft}" = "nginx" ]; then
		nginx_log
	fi
	
	# 5、安装 redis
	if [ -z "${soft}" ] || [ "${soft}" = "redis" ]; then
		redis_log
	fi
	
	# 6、安装 rabbitmq
	if [ -z "${soft}" ] || [ "${soft}" = "rabbitmq" ]; then
		rabbitmq_log
	fi
	
	# 7、安装 syslog
	if [ -z "${soft}" ] || [ "${soft}" = "syslog" ]; then
		syslog_log
	fi
	
	# 8、 打印汇总日志
	if [ -z "${soft}" ]; then
		pirnt_sum_log
	fi
}

#安装中文字体
font_install(){
	# 1 如果安装的字体软件都存在,则不安装
	font_state=`rpm -qa | grep font-config`
	font_cache_state=`rpm -qa | grep ttmkfdir`
	if [ -n "${font_state}" ] && [ -n "${font_cache_state}" ]; then
		return
	fi
	
	# 2 安装字体
	cd $PUSH_TEMP_PATH/font/base
	yum -y localinstall *.rpm
	
	# 3 将字体考到指定文件夹
	rm -rf $FONT_PATH
	mkdir -p $FONT_PATH
	cp -rf $PUSH_TEMP_PATH/font/chinese-font/* $FONT_PATH
	chmod -R 755 $FONT_PATH
	
	# 4 汇总生成fonts.scale文件
	ttmkfdir -e /usr/share/X11/fonts/encodings/encodings.dir
	
	# 5 替换字体配置
    cat $PUSH_TEMP_PATH/font/conf/fonts.conf > /etc/fonts/fonts.conf
	
	# 刷新内存中的字体缓存
	fc-cache
	
	echo " ● end install: chinese font;"
	#打印日志
	font_log
}

#删除安装的中文字体
font_remove(){
	#卸载字体软件
	yum remove -y fontconfig
	yum remove -y ttmkfdir
	
	#删除上传的中文字体
	rm -rf $FONT_PATH
	
	#打印日志
	font_log
	echo " ● end remove: chinese font;"
}

# 刷新字体配置(手工添加字体,可以执行下列命令)
font_reload(){
	# 刷新内存中的字体缓存
	fc-cache
	# 查看字体安装情况
	font_log
}

# 查看 中文字体 安装情况
font_log(){
	#检查 中文字体 是否安装成功
	font_log_status=`fc-list | grep chinese`
	if [ "${operate}" != "remove"  ]; then
		# 2.1 如果操作不是卸载,且检索 中文字体 存在,打印成功,否则打印失败
		if [ -n "${font_log_status}" ]; then
			LOG_TEMP_LOG=" ● success:install chinese font"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
			
			echo " ${font_log_status}"
		else
			LOG_TEMP_LOG=" ● error:install chinese font"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		fi
	else
		# 2.1 如果操作是卸载,且检索 中文字体 不存在,打印成功,否则打印失败
		if [ -z "${font_log_status}" ]; then
			LOG_TEMP_LOG=" ● success:remove chinese font"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		else
			LOG_TEMP_LOG=" ● error:remove chinese font"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
			
			echo " ${font_log_status}"
		fi
	fi
}

#chrony :分布式保持时间一致性
chrony_install(){
	#启动开机自启
	systemctl start chronyd
	systemctl enable chronyd
	
	#设置时区位上海
	timedatectl set-timezone Asia/Shanghai
	
	#强制时间同步
	chronyc -a makestep
	
	echo " ● chronyd: 设置上海时区并自启 end;"
	chrony_log
}

#chrony :查看日志
chrony_log(){
	
	#检查字体是否安装成功
	chrony_log_status=`chronyc sources –v`
	if [ -n "${chrony_log_status}" ]; then
		
		LOG_TEMP_LOG=" ● sucdess:install chrony , use Time synchronizer;"
		log_array+=("$LOG_TEMP_LOG")
		echo "$LOG_TEMP_LOG"
	else
		LOG_TEMP_LOG=" ● error:install chrony , use Time synchronizer;"
		log_array+=("$LOG_TEMP_LOG")
		echo "$LOG_TEMP_LOG"
	fi
}

# jdk17_TencentKona 及运行环境安装
jdk17_TencentKona_install(){
	#1、安装分布式时间同步器
	chrony_install
	
	#2、安装相关依赖 netstat、lsof、unzip、zip、dos2unix、nohup
	cd $PUSH_TEMP_PATH/jdk-17-TencentKona/depend-rpm
	yum -y localinstall *.rpm
	
	# 3 获取JAVA_HOME
	get_java_home
	# 3.1 如果JAVA_HOME 不为空,则退出
	if [ -n "${JAVA_HOME}" ]; then
		return
	fi
	
	JDK_TAR_GZ_NAME="TencentKona-17.0.9.b1-jdk_linux-x86_64.tar.gz"
	#4、安装解压并配置java_home
	cp -rf $PUSH_TEMP_PATH/jdk-17-TencentKona/base/$JDK_TAR_GZ_NAME $BASE_PATH
	cd $BASE_PATH
	
	#加压和获取加压后的文件夹
	tar -zxvf $JDK_TAR_GZ_NAME
	JDK_UN_TAR_NAME=$(tar -tzf "$PUSH_TEMP_PATH"/jdk-17-TencentKona/base/"$JDK_TAR_GZ_NAME" | head -1 | cut -d '/' -f 1)
	
	# 4.1 重命名解压目录和删除压缩包
	# 一定打开压缩吧确认一下解压后的文件夹
	rm -rf $BASE_PATH/jdk17-TencentKona
	mv $JDK_UN_TAR_NAME jdk17-TencentKona
	rm -rf $BASE_PATH/$JDK_TAR_GZ_NAME

	# echo -e "\n"才能解析成换行符
	echo "# set java environment" >> /etc/profile
	echo "export JAVA_HOME=$JAVA_HOME_PATH" >> /etc/profile
	echo "export PATH=\$PATH:\$JAVA_HOME/bin" >> /etc/profile
	echo "export CLASSPATH=.:\$JAVA_HOME/lib" >> /etc/profile
	
	# 5 刷新配置
	source /etc/profile
	sleep 2
	
	echo " ● end install: jdk-TencentKona-17.0.9;"
	
	# 6 显示安装结果
	jdk17_TencentKona_log
}

# jdk17_TencentKona 删除
jdk17_TencentKona_remove(){

	# 1 删除环境变量
	sudo sed -i '/# set java environment/d' /etc/profile
	#用 #替换分隔符/,因为$JAVA_HOME_PATH存在/
	sudo sed -i "\#export JAVA_HOME=$JAVA_HOME_PATH#d" /etc/profile
	sudo sed -i "/export PATH=\$PATH:\$JAVA_HOME\/bin/d" /etc/profile
	sudo sed -i "/export CLASSPATH=.:\$JAVA_HOME\/lib/d" /etc/profile
	
	# 2 刷新配置
	source /etc/profile
	sleep 2
	
	# 3 删除解压后的文件
	rm -rf $JAVA_HOME_PATH
	
	jdk17_TencentKona_log
	echo " ● end remove: jdk-TencentKona-17.0.9;"
}

# jdk17_TencentKona 删除
jdk17_TencentKona_log(){
	# 1 获取JAVA_HOME
	get_java_home
	if [ "${operate}" != "remove"  ]; then
		# 2.1 如果操作不是卸载,且 JAVA_HOME 不为空,打印成功,否则打印失败
		if [ -n "${JAVA_HOME}" ]; then
			
			LOG_TEMP_LOG=" ● success: install jdk-TencentKona-17.0.9"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		else
			LOG_TEMP_LOG=" ● error: install jdk-TencentKona-17.0.9"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		fi
	else
		# 2.1 如果操作是卸载,且 JAVA_HOME 为空,打印成功,否则打印失败
		if [ -z "${JAVA_HOME}" ]; then
			LOG_TEMP_LOG=" ● success:remove jdk-TencentKona-17.0.9"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		else
			LOG_TEMP_LOG=" ● error:remove jdk-TencentKona-17.0.9"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		fi
	fi
}

mysql_install(){
	# 1、安装mysql的依赖
	cd $PUSH_TEMP_PATH/mysql-8.0.36/depend-rpm
	yum -y localinstall *.rpm
	
	# 2.1 添加mysql用户组
	groupadd mysql
	#2.2 用户组添加用户
	useradd -g mysql mysql
	
	# 3 安装mysql的依赖
	cd $PUSH_TEMP_PATH/mysql-8.0.36/base
	yum -y localinstall *.rpm
	
	# 4 执行初始化并指定密码
	/usr/sbin/mysqld --initialize --user=mysql --lower-case-table-names=1
	
	# 5 备份并修改配置
	rm -rf /etc/my.cnf.bak
	cp -rf /etc/my.cnf /etc/my.cnf.bak
	# 5.1 替换mysql 配置文件
    cat $PUSH_TEMP_PATH/mysql-8.0.36/conf/my.cnf > /etc/my.cnf
	
	# 启动MySQL服务  
	echo "正在启动MySQL服务..."  
	sudo systemctl start mysqld  
	  
	# 等待MySQL服务启动完成   
	sleep 5
	
	# 获取默认密码
	DEFAULT_PASSWORD=$(sudo grep 'A temporary password' /var/log/mysqld.log | awk '{print $NF}')

	# 使用mysqladmin修改密码为12345678
	mysqladmin -u root -p"${DEFAULT_PASSWORD}" password "$MYSQL_PWD"

	# 重启MySQL服务
	sudo systemctl restart mysqld

	# 等待启动完成,导入数据(空库可以启动快)   
	sleep 5
	# 连接到MySQL数据库服务器并创建数据库 
	mysql -u"root" -p"$MYSQL_PWD" -e "CREATE DATABASE ${MYSQL_CREATE_DB_NAME}"
	
	echo " ● end install: mysql-8.0.36;"
	
	# 显示 mysql 状态
	mysql_log
}

mysql_remove(){
	# 1 如果未安装mysql,则退出
	mysqld_install_status=`systemctl list-unit-files | grep mysqld`
	if [ -z "${mysqld_install_status}" ]; then
		return
	fi
	
	# 停止MySQL服务  
	systemctl stop mysqld  
	  
	# 卸载MySQL软件包及其依赖项  
	yum remove -y mysql mysql-server mysql-libs mysql-client-plugins mysql-common
	  
	# 删除MySQL数据目录和配置文件(请谨慎操作)  
	rm -rf /var/lib/mysql 
	rm -rf /etc/my.cnf
	rm -rf /etc/my.cnf.bak
	rm -rf /var/log/mysqld.log
	
	mysql_log
	echo " ● end remove: mysql-8.0.36;"
}

mysql_log(){
	# 1 检测 mysql 是否自启动
	MYSQL_STATUS=$(systemctl is-active mysqld)
	if [ "${operate}" != "remove"  ]; then
		# 2.1 如果操作类型不是卸载,且 mysql 状态为:活跃的,打印成功,否则打印失败
		if [ "${MYSQL_STATUS}" = "active" ]; then
			
			LOG_TEMP_LOG=" ● success: start mysql-8.0.36"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		else
			LOG_TEMP_LOG=" ● error: start mysql-8.0.36"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		fi
	else
		#3 如果操作类型是卸载,且识别 mysql 状态为不存在 或者失败
		if [ "${MYSQL_STATUS}" = "unknown" ] || [ "${MYSQL_STATUS}" = "failed" ]; then
		
			LOG_TEMP_LOG=" ● success:remove mysql-8.0.36"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		else
			LOG_TEMP_LOG=" ● error:remove mysql-8.0.36"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		fi
	fi
	
	# 4 如果单独安装 mysql,或者查看指定查看 mysql 日志,则显示日志
	if [ "${soft}" = "mysql" ] && { [ "${operate}" = "log" ] || [ "${operate}" = "push"  ]; }; then
		tail -f -n 20 /var/log/mysqld.log
	fi
}

mysql_imp_sql(){
	SQL_FILE="${PUSH_TEMP_PATH}/mysql-8.0.36/conf/initDb.sql"
	if [ -e "$SQL_FILE" ]; then
		mysql -u"root" -p"12345678" $MYSQL_CREATE_DB_NAME < "$SQL_FILE"
		log_array+=(" ● 执行 mysql 数据数据化。")
		echo " ● 执行 mysql 数据数据化。" 
	else
		log_array+=(" ● 发布包不含 mysql 数据库初始化脚本。")
		echo " ● 发布包不含 mysql 数据库初始化脚本。" 
	fi
}

# nginx 安装
nginx_install(){
	# 1 安装相关依赖
	cd $PUSH_TEMP_PATH/nginx-1.24.0/depend-rpm
	yum -y localinstall *.rpm
	
	# 2 解压相关依赖
	NGINX_TAR_GZ_NAME="nginx-1.24.0.tar.gz"
	# 3 解压
	cp -rf $PUSH_TEMP_PATH/nginx-1.24.0/base/$NGINX_TAR_GZ_NAME $BASE_PATH
	cd $BASE_PATH
	
	# 3.1 解压并获取路径
	tar -zxvf $NGINX_TAR_GZ_NAME
	NGINX_UN_TAR_NAME=$(tar -tzf "$PUSH_TEMP_PATH"/nginx-1.24.0/base/"$NGINX_TAR_GZ_NAME" | head -1 | cut -d '/' -f 1)
	
	# 4.1 进入nginx安装路径
	cd $BASE_PATH/$NGINX_UN_TAR_NAME
	
	# 4.2 配置nginx
	./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_ssl_module
	
	# 4.3 执行安装
	make install
	
	# 5 准备使用的 www 用户
	groupadd -f www
	useradd -g www www
	
	cd $BASE_PATH
	# 6 替换nginx 配置
	cat $PUSH_TEMP_PATH/nginx-1.24.0/conf/nginx.conf > /usr/local/nginx/conf/nginx.conf
	
	# 7 注册nginx 服务
	rm -rf $SYS_SERVICE_PATH/nginx.service
	cp -rf $PUSH_TEMP_PATH/nginx-1.24.0/service/nginx.service $SYS_SERVICE_PATH/
	
	# 8.1 设置开机自启动
	#刷新服务配置
	systemctl daemon-reload
	
	# 8.2 开机自启
	systemctl enable nginx.service
	
	# 8.3 启动nginx
	systemctl start nginx.service
	
	# 6.1 删除复制后的 tar.gz 包
	rm -rf $BASE_PATH/nginx-1.24.0
	rm -rf $BASE_PATH/$NGINX_TAR_GZ_NAME
	
	echo " ● end install: nginx-1.24.0;"
	
	# 6.2 等待几秒检测 nginx 状态
	sleep 2
	nginx_log
}

# nginx 删除
nginx_remove(){
	# 1.1 停止服务
    systemctl stop nginx.service
	
	# 1.2 关闭开机自启动
	systemctl disable nginx.service

	echo "  ▶ 已关停相关服务... "
    #停顿 2s 后
    /bin/sleep 2

	# 删除所有的发布文件
	rm -rf $BASE_PATH/nginx

    # 删除发布的自启服务脚本
	rm -rf $SYS_SERVICE_PATH/nginx.service
	#刷新服务配置
	systemctl daemon-reload
	
	nginx_log
	echo " ● end remove: nginx-1.24.0;"
}

# 检测 nginx 日志
nginx_log(){
	# 1 检测 nginx 是否自启动
	NGINX_STATUS=$(systemctl is-active nginx)
	if [ "${operate}" != "remove"  ]; then
		# 2.1 如果操作类型不是卸载,且 nginx 状态为:活跃的,打印成功,否则打印失败
		if [ "${NGINX_STATUS}" = "active" ]; then
			
			LOG_TEMP_LOG=" ● success: start nginx-1.24.0"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		else
			LOG_TEMP_LOG=" ● error: start nginx-1.24.0"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		fi
	else
		#3 如果操作类型是卸载,且识别 nginx 状态为不存在 或者失败
		if [ "${NGINX_STATUS}" = "unknown" ] || [ "${NGINX_STATUS}" = "failed" ]; then
		
			LOG_TEMP_LOG=" ● success:remove nginx-1.24.0"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		else
			LOG_TEMP_LOG=" ● error:remove nginx-1.24.0"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		fi
	fi
	
	# 4 如果单独安装 nginx,或者查看指定查看 nginx 日志,则显示日志
	if [ "${soft}" = "nginx" ] && { [ "${operate}" = "log" ] || [ "${operate}" = "push"  ]; }; then
		tail -f -n 20 $BASE_PATH/nginx/logs/error.log
	fi
}

# redis 安装
redis_install(){
	# 1 安装相关依赖
	cd $PUSH_TEMP_PATH/redis-7.2.4/depend-rpm
	yum -y localinstall *.rpm
	
	# 2 解压相关依赖
	REDIS_TAR_GZ_NAME="redis-7.2.4.tar.gz"
	# 3 解压
	cp -rf $PUSH_TEMP_PATH/redis-7.2.4/base/$REDIS_TAR_GZ_NAME $BASE_PATH
	cd $BASE_PATH
	tar -zxvf $REDIS_TAR_GZ_NAME
	
	# 4.1 重命名解压目录和删除压缩包
	mv redis-7.2.4 redis
	cd $BASE_PATH/redis
	
	# 4.2 编译和安装
	make && make PREFIX=$BASE_PATH/redis/ install
	
	# 6 替换nginx 配置
	cat $PUSH_TEMP_PATH/redis-7.2.4/conf/redis.conf > /usr/local/redis/redis.conf
	
	rm -rf $SYS_SERVICE_PATH/redis.service
	cp -rf $PUSH_TEMP_PATH/redis-7.2.4/service/redis.service $SYS_SERVICE_PATH/
	
	# 5.1 设置开机自启动
	#刷新服务配置
	systemctl daemon-reload
	
	# 5.3 开机自启
	systemctl enable redis.service
	
	# 5.3 启动 redis
	systemctl start redis.service
	
	# 6.1 删除复制后的 tar.gz 包
	rm -rf $BASE_PATH/$REDIS_TAR_GZ_NAME
	
	echo " ● end install: redis-7.2.4;"
	
	# 6.2 等待几秒检测redis状态
	sleep 2
	redis_log
}

# redis 删除
redis_remove(){
	# 1.1 停止服务
    systemctl stop redis.service
	
	# 1.2 关闭开机自启动
	systemctl disable redis.service

	echo "  ▶ 已关停相关服务... "
    #停顿 2s 后
    /bin/sleep 2

	# 删除所有的发布文件
	rm -rf $BASE_PATH/redis

    # 删除发布的自启服务脚本
	rm -rf $SYS_SERVICE_PATH/redis.service
	#刷新服务配置
	systemctl daemon-reload
	
	redis_log
	echo " ● end remove: redis-7.2.4;"
}

# 检测redis 日志
redis_log(){
	#1.1 检测 redis 是否自启动
	REDIS_STATUS=$(systemctl is-active redis)
	if [ "${operate}" != "remove"  ]; then
		# 2.1 如果操作类型不是卸载,且 redis 状态为:活跃的,打印成功,否则打印失败
		if [ "${REDIS_STATUS}" = "active" ]; then
			
			LOG_TEMP_LOG=" ● success: start redis-7.2.4"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		else
			LOG_TEMP_LOG=" ● error: start redis-7.2.4"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		fi
	else
		#3 如果操作类型是卸载,且识别 redis 状态为不存在 或者失败
		if [ "${REDIS_STATUS}" = "unknown" ] || [ "${REDIS_STATUS}" = "failed" ]; then
		
			LOG_TEMP_LOG=" ● success:remove redis-7.2.4"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		else
			LOG_TEMP_LOG=" ● error:remove redis-7.2.4"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		fi
	fi
	
	# 4 如果单独安装 redis,或者查看指定查看 redis 日志,则显示日志
	if [ "${soft}" = "redis" ] && { [ "${operate}" = "log" ] || [ "${operate}" = "push"  ]; }; then
		tail -f -n 20 $BASE_PATH/redis/redis.log
	fi
}

# rabbitmq 安装
rabbitmq_install(){
	
	# 1 安装相关依赖
	cd $PUSH_TEMP_PATH/rabbitmq-3.11.28/depend-rpm
	yum -y localinstall *.rpm
	
	# 2 解压erlang
	ERLANG_TAR_GZ_NAME="otp_src_25.3.2.8.tar.gz"
	# 3 解压
	cp -rf $PUSH_TEMP_PATH/rabbitmq-3.11.28/base/$ERLANG_TAR_GZ_NAME $BASE_PATH
	cd $BASE_PATH
	tar -zxvf $ERLANG_TAR_GZ_NAME
	
	# 4.1 进入erlang 安装包
	cd $BASE_PATH/otp_src_25.3.2.8
	
	# 4.2 配置
	./configure  --prefix=/usr/local/erlang --without-javac
	
	# 4.2 编译和安装
	make && make install
	
	# 5 写入系统配置
	echo "export ERLANG_HOME=/usr/local/erlang " >> /etc/profile
	echo "export PATH=\$ERLANG_HOME/bin:\$PATH" >> /etc/profile
	
	# 刷新配置
	source /etc/profile
	
	# 5 强制安装rabbitmq rpm
	rpm -ivh --nodeps $PUSH_TEMP_PATH/rabbitmq-3.11.28/base/rabbitmq-server-3.11.28-1.el8.noarch.rpm
	
	# 6 替换rebbit 配置文件
    cat $PUSH_TEMP_PATH/rabbitmq-3.11.28/sh/rabbitmq-server > /usr/lib/rabbitmq/bin/rabbitmq-server
	
	# 5.1 强制修改hostname
	hostname localhost.localdomain
	#启动服务
	systemctl start rabbitmq-server
	
	# 5.3 开机自启
	chkconfig rabbitmq-server on
	
	echo " ● end install: rabbitmq-3.11.28;"
	# 6.2 等待几秒查看日志
	sleep 5
	rabbitmq_log
	
	# 6 开启web 管理端
	rabbitmq-plugins enable rabbitmq_management
	
	# 6. 初始化账号密码
	# 6.1 创建账号
	rabbitmqctl add_user "${RABBITMQ_USER}" "${RABBITMQ_PWD}"
	# 6.2 设置用户角色
	rabbitmqctl set_user_tags "${RABBITMQ_USER}" administrator
	#6.4 设置用户权限
	# set_permissions [-p <vhostpath>] <user> <conf> <write> <read>
	rabbitmqctl set_permissions -p "/" "${RABBITMQ_USER}" ".*" ".*" ".*"
	#7 用户 user_admin 具有/vhost1 这个 virtual host 中所有资源的配置、写、读权限
	##查看当前用户和角色
	rabbitmqctl list_users
}

# rabbitmq 删除
rabbitmq_remove(){

	# 1 关闭服务
	chkconfig rabbitmq-server off
	
	# 2 停止服务
	systemctl stop rabbitmq-server
	
	# 6.2 等待几秒查看
	sleep 5
	
	# 7.1 卸载程序
	rpm -e rabbitmq-server-3.11.28-1.el8.noarch
	
	# 7.2 删除环境变量
	sudo sed -i "/export ERLANG_HOME=\/usr\/local\/erlang/d" /etc/profile
	sudo sed -i "/export PATH=\$ERLANG_HOME\/bin:\$PATH/d" /etc/profile
	
	# 3 删除erlang
	rm -rf /usr/local/erlang
	
	rabbitmq_log
	echo " ● end remove: rabbitmq-3.11.28;"
}

# 检测redis 日志
rabbitmq_log(){
	#1.1 检测 rabbitmq 是否自启动
	RABBITMQ_STATUS=$(systemctl is-active rabbitmq-server)
	if [ "${operate}" != "remove"  ]; then
		# 2.1 如果操作类型不是卸载,且 rabbitmq 状态为:活跃的,打印成功,否则打印失败
		if [ "${RABBITMQ_STATUS}" = "active" ]; then
			
			LOG_TEMP_LOG=" ● success: start rabbitmq-3.11.28"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		else
			LOG_TEMP_LOG=" ● error: start rabbitmq-3.11.28"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		fi
	else
		#3 如果操作类型是卸载,且识别 rabbitmq 状态为不存在 或者失败
		if [ "${RABBITMQ_STATUS}" = "unknown" ] || [ "${RABBITMQ_STATUS}" = "failed" ]; then
		
			LOG_TEMP_LOG=" ● success:remove rabbitmq-3.11.28"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		else
			LOG_TEMP_LOG=" ● error:remove rabbitmq-3.11.28"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		fi
	fi
	
	# 4 如果单独安装 rabbitmq,或者查看指定查看 rabbitmq 日志,则显示日志
	if [ "${soft}" = "rabbitmq" ] && { [ "${operate}" = "log" ] || [ "${operate}" = "push"  ]; }; then
		# tail -f -n 20 /var/log/rabbitmq/rabbit@*.log
		tail -f -n 20 /var/log/rabbitmq/rabbit@$(hostname).log
	fi
}

# syslog 安装
syslog_install(){
	
	# 1 安装 syslog
	yum -y localinstall $PUSH_TEMP_PATH/syslog-8.24.0/base/rsyslog-8.24.0-57.el7_9.3.x86_64.rpm
	
	# 2 替换syslog 配置
	cat $PUSH_TEMP_PATH/syslog-8.24.0/conf/rsyslog.conf > /etc/rsyslog.conf
	
	# 4.1 刷新服务
	systemctl daemon-reload
	# 4.2 重新启动
	systemctl restart rsyslog
	# 4.3 开机自启
	systemctl enable rsyslog
	
	echo " ● end install: syslog-8.24.0;"
	
	# 5 等待几秒检测 syslog 状态
	sleep 2
	syslog_log
}

# syslog 删除
syslog_remove(){

	# 1 关闭开机自启动
	systemctl disable rsyslog

	# 2 停止服务
	systemctl stop rsyslog
	
	# 3 卸载程序
	rpm -e rsyslog-8.24.0-57.el7_9.3.x86_64
	
	sleep 2
	
	syslog_log
	echo " ● end remove: rsyslog-8.24.0;"
}

# 检测 syslog 日志
syslog_log(){
	#1.1 检测 syslog 是否自启动
	SYSLOG_STATUS=$(systemctl is-active rsyslog)
	if [ "${operate}" != "remove"  ]; then
		# 2.1 如果操作类型不是卸载,且 syslog 状态为:活跃的,打印成功,否则打印失败
		if [ "${SYSLOG_STATUS}" = "active" ]; then
			
			LOG_TEMP_LOG=" ● success: start rsyslog-8.24.0"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		else
			LOG_TEMP_LOG=" ● error: start rsyslog-8.24.0"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		fi
	else
		#3 如果操作类型是卸载,且识别 syslog 状态为不存在 或者失败
		if [ "${SYSLOG_STATUS}" = "unknown" ] || [ "${SYSLOG_STATUS}" = "failed" ]; then
		
			LOG_TEMP_LOG=" ● success:remove rsyslog-8.24.0"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		else
			LOG_TEMP_LOG=" ● error:remove rsyslog-8.24.0"
			log_array+=("$LOG_TEMP_LOG")
			echo "$LOG_TEMP_LOG"
		fi
	fi
	
	# 4 如果单独安装 syslog,或者查看指定查看 syslog 日志,则显示日志
	if [ "${soft}" = "syslog" ] && { [ "${operate}" = "log" ] || [ "${operate}" = "push"  ]; }; then
		tail -f -n 20 /var/log/messages
	fi
}

#解压tar包
un_tar_gz(){
	#1 删除可能存在的解压不全的临时文件
	rm -rf $UNZIP_TEMP_PATH
	
	#2 创建加压的文件夹
	mkdir -p $UNZIP_TEMP_PATH

	#2 进行解压操作
	tar -zxvf $PUSH_SH_PATH/$TAR_GZ_NAME -C $UNZIP_TEMP_PATH 
	
	#3 获取加压后的文件路径
	#UNZIP_DIR_NAME=$(echo "$UNZIP_TEMP_PATH"/* | awk '{print $1}' | xargs basename)
	UNZIP_DIR_NAME=$(tar -tzf "$PUSH_SH_PATH"/"$TAR_GZ_NAME" | head -1 | cut -d '/' -f 1)
	
	#4 获取到解压后的真实路径
	PUSH_TEMP_PATH=$UNZIP_TEMP_PATH/$UNZIP_DIR_NAME
}

# 获取JAVA_HOME
get_java_home(){
    # 1、如果JAVA_HOME 不为空,则退出
	if [ -n "${JAVA_HOME}" ]; then
		return
	fi
	
	#2、通过java程序查找(如果是子shell 可能读不到)
	JAVA_PATH=$(which java)
	if [ -n "${JAVA_PATH}" ]; then
		# 获取java的上2级作为JAVA_HOME
		JAVA_HOME=$(dirname "$(dirname "$JAVA_PATH")")
	else
		#3、读取不到,则读取配置文件
		JAVA_HOME=$(grep -m 1 'JAVA_HOME=' /etc/profile | awk -F= '{print $2}' | tr -d ' ')
	fi
}

#打印中途记录的在log_array内的内容
pirnt_sum_log(){
	# 打印数组的每个元素
	echo "-----------------------summary-log-start------------------------------"
	for element in "${log_array[@]}"; do
		echo "$element"
	done
	echo "-----------------------summary-log-end ------------------------------"
}

#防火墙开放端口
firewall_port_open(){

	# 定义要检查的端口号
	PORT=88
	# 检查指定端口是否已经开放
	if sudo firewall-cmd --list-ports | grep -q "\<$PORT\/tcp\>"; then
		LOG_TEMP_LOG=" ● 端口 $PORT 已经开放,跳过"
		log_array+=("$LOG_TEMP_LOG")
		echo "$LOG_TEMP_LOG"
		return;
	fi

	echo "调整 firewall 防火墙:"
	firewall-cmd --zone=public --add-port=88/tcp --permanent
	firewall-cmd --zone=public --add-port=3306/tcp --permanent
	
	firewall-cmd --reload
	
	# 防火墙日志
	firewall_port_log
}

#防火墙关闭端口
firewall_port_close(){
	echo "调整 firewall 防火墙:"
	
	firewall-cmd --zone=public --remove-port=88/tcp --permanent
	firewall-cmd --zone=public --remove-port=3306/tcp --permanent
	
	firewall-cmd --reload
	
	# 防火墙日志
	firewall_port_log
}

#防火墙日志
firewall_port_log(){
	open_ports=$(firewall-cmd --list-ports)
	LOG_TEMP_LOG=" ● firewall-cmd open port:${open_ports}"
	log_array+=("$LOG_TEMP_LOG")
	echo "$LOG_TEMP_LOG"
}

# 系统调优(RedHat系列linux)
sys_com_tuning(){
	
	# 搜索文件中是否包含指定文本
   if grep -q "# 全局的打开文件数" "/etc/systemd/system.conf"; then
		LOG_TEMP_LOG=" ● 系统配置 已调优(适配 RedHat系列linux),跳过"
		log_array+=("$LOG_TEMP_LOG")
		echo "$LOG_TEMP_LOG"
        return
    fi

	# 1 调整systemctl管理的 servie 资源限制
	echo "# 全局的打开文件数" >> /etc/systemd/system.conf
	echo "DefaultLimitNOFILE=1048576" >> /etc/systemd/system.conf
	echo "# 全局打开进程数" >> /etc/systemd/system.conf
	echo "DefaultLimitNPROC=65535" >> /etc/systemd/system.conf
	
	# 2 调整系统内核参数
	echo "# 全局:端口最大的监听队列的长度,可为:32768" >> /etc/sysctl.conf
	echo "net.core.somaxconn=32768" >> /etc/sysctl.conf
	echo "# 内存分配模式:1为不限制" >> /etc/sysctl.conf
	echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
	echo "# 单进程打开文件句柄数" >> /etc/sysctl.conf
	echo "fs.nr_open = 2097152" >> /etc/sysctl.conf
	echo "# 系统打开文件句柄数" >> /etc/sysctl.conf
	echo "fs.file-max = 102400" >> /etc/sysctl.conf
	
	# 2.1 刷新内核参数,立即生效
	/sbin/sysctl -p
	
	# 3 调整用户组资源限制
	echo "# 用户会话的 打开文件句柄数" >> /etc/security/limits.conf
	echo "* soft nofile 1048576" >> /etc/security/limits.conf
	echo "* hard nofile 1048576" >> /etc/security/limits.conf
	echo "# 用户会话的 打开进程数限制" >> /etc/security/limits.conf
	echo "* soft nproc 65535" >> /etc/security/limits.conf
	echo "* hard nproc 65535" >> /etc/security/limits.conf
	
	LOG_TEMP_LOG=" ● 系统配置 调优完成(适配 RedHat系列linux)"
	log_array+=("$LOG_TEMP_LOG")
	echo "$LOG_TEMP_LOG"
}

#根据输入参数,选择执行对应方法,不输入则执行使用说明 
case "$1" in
	"push") 
        push 
        ;;
	"remove") 
        remove 
        ;;
    "log") 
        log 
        ;;
    *)
usage 
;; 
esac

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐