#!/bin/bash
# author lijing
# date 2023/3/9
# TODO 此脚本可以根据需要自主拓展
#-------------------------------------------------------------------------------------------------------------------
#| Some people die at the age of 25 and don't bury themselves in the earth until they are 75 |#
#|------------------------------------------------------------------------------------------------------------------#
#| |#
#| __ ______ _____ ______ __ __ ____ |#
#| /\ \ /\__ _\ /\___ \/\__ _\ /\ \/\ \/\ _`\ |#
#| \ \ \ \/_/\ \/ \/__/\ \/_/\ \/ \ \ `\\ \ \ \L\_\ |#
#| \ \ \ __\ \ \ _\ \ \ \ \ \ \ \ , ` \ \ \L_L |#
#| \ \ \L\ \\_\ \__ /\ \_\ \ \_\ \__\ \ \`\ \ \ \/, \ |#
#| \ \____//\_____\ \ \____/ /\_____\\ \_\ \_\ \____/ |#
#| \/___/ \/_____/ \/___/ \/_____/ \/_/\/_/\/___/ |#
#| |#
#-------------------------------------------------------------------------------------------------------------------#
# 当前目录
CURRENT_DIR=$(cd `dirname $0`; pwd)
# 二进制安装包所在目录
INSTALL_PACKAGE_DIR=/software
# MySQL 版本
MYSQL_VERSION=8.0.32-1
# MySQL rpm 文件下载位置
MYSQL_UNPACK_DIR=${INSTALL_PACKAGE_DIR}/mysql_rpm-files/${MYSQL_VERSION}
# MySQL 密码,由于 MySQL 默认密码强度比较高,所以密码得符合密码规范,否则报错
# 如果想改为弱密码策略,后期改即可,使用命令行
MYSQL_NEW_PWD=Lijing123456.
# 下载地址:https://download.redis.io/releases/redis-6.2.3.tar.gz
REDIS_INSTALL_HOME=/usr/local/redis
REDIS_PACKAGE_NAME=redis-6.2.3.tar.gz
REDIS_VERSION=redis-6.2.3
# 前置检查
pre_check(){
# 是否为root用户
if [[ "$(whoami)" != "root" ]]; then
print_info "please run this script as root" >&2
exit 0
fi
}
# 检查是否安装了wget
check_wget(){
wget_rpm_list=`rpm -qa | grep wget`
if [ -n "$wget_rpm_list" ];then
print_info "wget检查结果:系统已安装wget,跳过安装wget!"
else
print_info "系统未安装wget,开始安装..."
yum install -y wget
fi
}
# 打印信息使用
print_info(){
echo -e "\033[31m$1\033[0m"
}
# 使用说明,用来提示输入参数,可以自己拓展
usage() {
print_info "Usage: $0 [jdk|mysql|redis|nacos|docker]"
print_info "jdk:安装jdk"
print_info "mysql:安装mysql"
print_info "redis:安装redis"
print_info "nacos:安装nacos"
print_info "docker:安装docker"
exit 0
}
# 安装 jdk
# jdk安装好了以后,最好再次手动执行 source /etc/profile
# 因为有子shell问题,造成当前会话没生效,或者退出当前会话,重新进
install_jdk() {
# 是否安装jdk
read -p "是否开始安装jdk?(Y/N):" choose_if_install_jdk
if [ "$choose_if_install_jdk" == 'Y' ] || [ "$choose_if_install_jdk" == 'y' ] ;then
# 检查是否安装wget
check_wget
print_info "jdk安装中......"
wget -P ${INSTALL_PACKAGE_DIR} https://dragonwell.oss-cn-shanghai.aliyuncs.com/8.14.15/Alibaba_Dragonwell_Standard_8.14.15_x64_linux.tar.gz
tar -zxvf $INSTALL_PACKAGE_DIR/Alibaba_Dragonwell_Standard_8.14.15_x64_linux.tar.gz -C $INSTALL_PACKAGE_DIR
cat >> /etc/profile << EOF
export JAVA_HOME=$INSTALL_PACKAGE_DIR/dragonwell-8.14.15
export CLASSPATH=.:\$JAVA_HOME/lib/rt.jar:\$JAVA_HOME/lib/tools.jar:\$JAVA_HOME/lib/dt.jar
export PATH=\$JAVA_HOME/bin:\$JAVA_HOME/jre/bin:\$PATH
EOF
source /etc/profile
java -version
print_info "jdk安装成功!!!"
else
exit 0
fi
}
# 安装 Redis
install_mysql() {
# 是否安装mysql
read -p "是否开始安装MySQL?(Y/N):" choose_if_install_mysql
if [ "$choose_if_install_mysql" == 'Y' ] || [ "$choose_if_install_mysql" == 'y' ] ;then
print_info "mysql安装中......"
# 检查mariadb
check_mariadb
# 检查libaio
check_libaio
# 检查net-tools
check_net_tools
# 检查MySQL
check_mysql
# 检查可能的MySQL残留文件
check_mysql_file
# 安装mysql服务
install_mysql_server
# 修改数据库密码
change_mysql_password
# 开启远程访问权限
change_mysql_access
# 迁移目录
migration_mysql_dir
# mysql是否安装成功
if_mysql_success
print_info "mysql安装成功!!!"
else
exit 0 # 退出程序
fi
}
# 检查mariadb
function check_mariadb(){
mariadb_rpm_list=`rpm -qa | grep mariadb`
if [ -n "$mariadb_rpm_list" ];then
print_info "mariadb检查结果:系统已安装mariadb,需先卸载"
read -p "是否卸载mariadb?(Y/N):" choose_Unmariadb
if [ "$choose_Unmariadb" == 'Y' ] || [ "$choose_Unmariadb" == 'y' ] ;then
print_info "开始卸载mariadb..."
rpm -qa |grep mariadb |xargs rpm -e --nodeps
sleep 2
print_info "mariadb卸载完成!"
else
exit 0
fi
else
print_info "mariadb检查结果:系统未安装mariadb."
fi
}
# 检查libaio,我安装的时候,提示我缺少libaio,所以这里我写了个检查的函数
# 如果系统中没有libaio,则下载安装
function check_libaio(){
libaio_rpm_list=`rpm -qa | grep libaio`
if [ -n "$libaio_rpm_list" ];then
print_info "libaio检查结果:系统已安装libaio,跳过安装libaio!"
else
print_info "libaio检查结果:系统未安装libaio,开始安装libaio..."
yum install libaio -y
print_info "libaio安装成功!"
fi
}
# 检查net-tools,如果没有安装net-tools则使用离线包安装
function check_net_tools(){
net_tools_rpm_list=`rpm -qa | grep net-tools`
if [ -n "$net_tools_rpm_list" ];then
print_info "net-tools检查结果:系统已安装net-tools,跳过安装net-tools!"
else
print_info "net-tools检查结果:系统未安装net-tools,开始安装net-tools..."
yum install net-tools -y
print_info "net-tools安装成功!"
fi
}
# 检查MySQL
function check_mysql(){
mysql_rpm_list=`rpm -qa | grep mysql`
if [ -n "$mysql_rpm_list" ]; then
print_info "mysql检查结果:系统已安装mysql,需先卸载,已安装的MySQL如下:"
rpm -qa | grep mysql | tee
read -p "是否卸载已安装的MySQL?(Y/N):" choose_UnMySQL
if [ "$choose_UnMySQL" == 'Y' ] || [ "$choose_UnMySQL" == 'y' ];then
print_info "开始卸载MySQL..."
rpm -qa |grep mysql | xargs rpm -e --nodeps > /dev/null 2>&1
sleep 2
print_info "MySQL卸载完成!"
else
exit 0
fi
else
print_info "mysql检查结果:系统未安装MySQL."
fi
}
# 检查可能的MySQL残留文件
function check_mysql_file(){
mysqlFile=`find / -name mysql`
if [ -n "$mysqlFile" ]; then
print_info "检测到服务器可能存在MySQL残留文件,文件列表如下:"
find / -name mysql |xargs du --max-depth=0 -h # 打印可能的MySQL残留文件及大小
read -p "您要对这些文件怎么处理?(0:正常文件,不处理;1:我要手动删除;del:全部删除):" choose_delmysqlFile
if [ "$choose_delmysqlFile" == 0 ] ;then
print_info "您选择了不处理MySQL残留文件!"
elif [ "$choose_delmysqlFile" == 1 ] ;then
exit 0
elif [ "$choose_delmysqlFile" == 'del' ] ;then
print_info "开始清理MySQL残留文件..."
# 清理冗余文件
find / -name mysql |xargs rm -rf
sleep 3
rm -f /var/log/mysqld.log
print_info "MySQL残留文件清理成功!"
else
print_info "输入错误,请选择0、1、del."
print_info "你只能输入0、1、del这些指令"
exit 0
fi
else
rm -f /var/log/mysqld.log
print_info "mysql残留文件检查结果:不存在MySQL残留文件"
fi
}
# 安装mysql服务
function install_mysql_server(){
print_info "临时关闭SELinux..."
setenforce 0 > /dev/null
# 检查是否安装wget
check_wget
print_info "开始安装MySQL源"
if [ -d ${MYSQL_UNPACK_DIR} ];then
print_info "MySQL源已存在,无需再次下载,直接安装!"
else
wget -P ${MYSQL_UNPACK_DIR} https://repo.mysql.com/yum/mysql-8.0-community/el/7/x86_64/mysql-community-client-${MYSQL_VERSION}.el7.x86_64.rpm
wget -P ${MYSQL_UNPACK_DIR} https://repo.mysql.com/yum/mysql-8.0-community/el/7/x86_64/mysql-community-client-plugins-${MYSQL_VERSION}.el7.x86_64.rpm
wget -P ${MYSQL_UNPACK_DIR} https://repo.mysql.com/yum/mysql-8.0-community/el/7/x86_64/mysql-community-common-${MYSQL_VERSION}.el7.x86_64.rpm
wget -P ${MYSQL_UNPACK_DIR} https://repo.mysql.com/yum/mysql-8.0-community/el/7/x86_64/mysql-community-icu-data-files-${MYSQL_VERSION}.el7.x86_64.rpm
wget -P ${MYSQL_UNPACK_DIR} https://repo.mysql.com/yum/mysql-8.0-community/el/7/x86_64/mysql-community-libs-${MYSQL_VERSION}.el7.x86_64.rpm
wget -P ${MYSQL_UNPACK_DIR} https://repo.mysql.com/yum/mysql-8.0-community/el/7/x86_64/mysql-community-libs-compat-${MYSQL_VERSION}.el7.x86_64.rpm
wget -P ${MYSQL_UNPACK_DIR} https://repo.mysql.com/yum/mysql-8.0-community/el/7/x86_64/mysql-community-server-${MYSQL_VERSION}.el7.x86_64.rpm
fi
print _info "开始安装MySQL..."
yum -y localinstall ${MYSQL_UNPACK_DIR}/mysql-community-*.rpm
print_info "MySQL安装成功,开始启动MySQL..."
systemctl start mysqld.service
if [ $? -eq 0 ] ;then
print_info "MySQL启动成功!"
else
print_info "MySQL启动失败,请检查日志/var/log/mysqld.log"
exit 0
fi
}
# 修改数据库密码
function change_mysql_password(){
initpasswd=`cat /var/log/mysqld.log |grep root@localhost |awk '{print $NF}'` # 初始密码
print_info "MySQL的初始密码是:$initpasswd"
# read -p "请输入您要设置MySQL的root用户密码:" passwd
# mysqladmin -uroot -p$initpasswd password $passwd > /dev/null
# print_info "您在脚本中配置的密码为:$MYSQL_NEW_PWD"
mysqladmin -uroot -p$initpasswd password $MYSQL_NEW_PWD > /dev/null
if [ $? -eq 0 ] ;then
print_info "修改数据库密码成功!"
else
print_info "修改数据库密码失败,执行过程中可能出现错误,请排查后再来执行此脚本!"
print_info "卸载MYSQL时,请确保MYSQL卸载干净!"
exit 0
fi
}
# 修改MySQL权限
function change_mysql_access(){
mysql -uroot -p$MYSQL_NEW_PWD <<EOF
use mysql;
update user set Host="%" where User="root";
flush privileges;
quit
EOF
systemctl restart mysqld
print_info "MySQL权限修改成功!"
}
# 迁移数据目录
function migration_mysql_dir(){
read -p "是否需要迁移MySQL数据目录?(Y/N):" choose_isMigration
if [ "$choose_isMigration" == 'Y' ] || [ "$choose_isMigration" == 'y' ] ;then
read -p "请输入您要迁移至的路径(如:/opt/data):" newPath
print_info "开始准备迁移目录..."
systemctl stop mysqld.service
mkdir -p $newPath # 新建数据目录
cp -r /var/lib/mysql $newPath
chmod -R 755 $newPath
chown -R mysql:mysql $newPath
# 修改my.cnf
# 将迁移的路径进行转义处理,方便使用sed进行替换修改
newPathe=`echo $newPath |sed 's#\/#\\\/#g'`
sed -i "s/\/var\/lib/$newPathe/g" /etc/my.cnf
# 插入配置
sed -i "1i\socket=$newPath/mysql/mysql.sock" /etc/my.cnf
sed -i "1i\[client]" /etc/my.cnf
systemctl start mysqld.service
print_info "MySQL目录迁移成功!"
fi
}
# 检查mysql安装结果
function if_mysql_success(){
netstat -ntl | grep 3306
if [ $? -eq 0 ] ;then
print_info "MySQL安装成功,现在可以开始正式使用啦!"
else
print_info "MySQL安装或启动失败,请查看日志:/var/log/mysqld.log"
fi
}
# 安装Redis
function install_redis(){
# 是否安装redis
read -p "是否开始安装redis?(Y/N):" choose_if_install_redis
if [ "$choose_if_install_redis" == 'Y' ] || [ "$choose_if_install_redis" == 'y' ] ;then
print_info "开始安装redis...."
# 创建Redis安装目录
create_redis_install_dir
# 检查是否安装了gcc-c++
check_gcc
# 安装Redis服务
install_redis_server
else
exit 0 # 退出程序
fi
}
# 检查是否安装gcc-c++
function check_gcc(){
gcc_rpm_list=`rpm -qa | grep gcc-c++`
if [ -n "$gcc_rpm_list" ];then
gcc -v
print_info "gcc-c++检查结果:系统已安装gcc-c++,跳过安装gcc-c++!"
else
print_info "gcc-c++检查结果:系统未安装gcc-c++,开始安装gcc-c++..."
yum install -y gcc-c++
gcc -v
print_info "gcc-c++安装成功!"
fi
}
# 创建Redis安装目录
function create_redis_install_dir(){
# 判断安装目录是否已经存在,存在提示是否删除,是则删除,否则结束脚本
if [ -d $REDIS_INSTALL_HOME ] ;then
read -t 60 -p "目录$REDIS_INSTALL_HOME已经存在,是否删除?(Y/N):" delete_confirm
case $delete_confirm in
y | Y)
if rm -rf "$REDIS_INSTALL_HOME"
then
print_info "删除$redis_home目录成功"
fi;;
n | N)
print_info "安装目录$REDIS_INSTALL_HOME存在,脚本运行结束!"
exit;;
*)
print_info "输入错误或60s未确认,脚本运行结束!"
exit;;
esac
fi
# 如果安装脚本目录不存在,则创建安装脚本目录
if [ ! -d $REDIS_INSTALL_HOME ] ;then
print_info "安装目录$REDIS_INSTALL_HOME不存在,开始创建$REDIS_INSTALL_HOME"
mkdir -p $REDIS_INSTALL_HOME
fi
}
# 安装Redis服务
function install_redis_server(){
# 检查是否安装wget
check_wget
# 下载安装包
if [ ! -f "$INSTALL_PACKAGE_DIR/$REDIS_PACKAGE_NAME" ] ;then
wget -P $INSTALL_PACKAGE_DIR https://download.redis.io/releases/$REDIS_PACKAGE_NAME
fi
# 解压压缩包REDIS_INSTALL_HOME
tar -zxvf $INSTALL_PACKAGE_DIR/$REDIS_PACKAGE_NAME -C $REDIS_INSTALL_HOME
# 进入解压目录,进行编译
if cd "$REDIS_INSTALL_HOME/$REDIS_VERSION"
then
if make
then
if make install PREFIX=$REDIS_INSTALL_HOME
then
cp redis.conf ../bin/redis.conf
print_info ""
print_info ""
print_info ""
print_info "========================================================================="
print_info "========================================================================="
print_info "Redis安装完成,启动脚本目录$REDIS_INSTALL_HOME/bin"
print_info "配置文件已复制到$REDIS_INSTALL_HOME/bin目录下"
print_info "自行修改redis.conf配置文件配置,开放对应端口"
print_info "若外部需要连接 redis ,在 redis.conf 里面将 bind 127.0.0.1 注释掉,否则连不上"
print_info "启动命令:$REDIS_INSTALL_HOME/bin/redis-server $REDIS_INSTALL_HOME/bin/redis.conf"
print_info "如果想要指定redis后台启动,则在 redis.conf 中将 daemonize 改为 yes,或者在启动的命令后面加上 &,表示后台启动"
print_info "如果需要持久化,则在 redis.conf 中将 appendonly 改为 yes,指定持久化方式为aof"
print_info "查看是否启动:ps -ef|grep redis,若需要停止redis服务,kill -9 前面的进程号"
print_info "默认端口6379,默认不需要密码,若需要密码,请在 redis.conf 中配置 requirepass 123456 "
print_info "卸载:停止程序,删除$REDIS_INSTALL_HOME,rm -rf $REDIS_INSTALL_HOME========="
print_info "========================================================================="
print_info "========================================================================="
print_info ""
print_info ""
print_info ""
fi >> $REDIS_INSTALL_HOME/install.log
else
print_info "==========make命令执行异常=========="
exit
fi
else
print_info "=========解压文件名称不是$REDIS_VERSION,修改脚本部分代码重试========="
fi
print_info ""
print_info ""
print_info ""
print_info "========================================================================="
print_info "========================================================================="
print_info "Redis安装完成,启动脚本目录$REDIS_INSTALL_HOME/bin"
print_info "配置文件已复制到$REDIS_INSTALL_HOME/bin目录下"
print_info "自行修改redis.conf配置文件配置,开放对应端口"
print_info "若外部需要连接 redis ,在 redis.conf 里面将 bind 127.0.0.1 注释掉,否则连不上"
print_info "启动命令:$REDIS_INSTALL_HOME/bin/redis-server $REDIS_INSTALL_HOME/bin/redis.conf"
print_info "如果想要指定redis后台启动,则在 redis.conf 中将 daemonize 改为 yes,或者在启动的命令后面加上 &,表示后台启动"
print_info "如果需要持久化,则在 redis.conf 中将 appendonly 改为 yes,指定持久化方式为aof"
print_info "查看是否启动:ps -ef|grep redis,若需要停止redis服务,kill -9 前面的进程号"
print_info "默认端口6379,默认不需要密码,若需要密码,请在 redis.conf 中配置 requirepass 123456 "
print_info "卸载:停止程序,删除$REDIS_INSTALL_HOME,rm -rf $REDIS_INSTALL_HOME========="
print_info "========================================================================="
print_info "========================================================================="
print_info ""
print_info "===========Redis安装完成,安装日志查看$REDIS_INSTALL_HOME/install.log=========="
print_info ""
print_info ""
}
# 安装 nacos
install_nacos() {
read -p "是否开始安装nacos?(Y/N):" choose_if_install_nacos
if [ "$choose_if_install_nacos" == 'Y' ] || [ "$choose_if_install_nacos" == 'y' ] ;then
print_info "nacos安装中......"
# 检查是否安装wget
check_wget
# 下载安装包
if [ ! -f "$INSTALL_PACKAGE_DIR/nacos-server-2.2.0.tar.gz" ] ;then
wget -P $INSTALL_PACKAGE_DIR https://github.com/alibaba/nacos/releases/download/2.2.0/nacos-server-2.2.0.tar.gz
fi
# 解压压缩包
tar -zxvf $INSTALL_PACKAGE_DIR/nacos-server-2.2.0.tar.gz -C $INSTALL_PACKAGE_DIR
#
else
exit 0 # 退出程序
fi
}
# 安装 docker
install_docker() {
read -p "是否开始安装docker?(Y/N):" choose_if_install_docker
if [ "$choose_if_install_docker" == 'Y' ] || [ "$choose_if_install_docker" == 'y' ] ;then
print_info "docker安装中......"
# 1、卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 2、需要的安装包
yum install -y yum-utils
# 3、设置镜像的仓库
# 推荐使用国内的,比如阿里云镜像,十分快
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#更新yum软件包索引
yum makecache fast
# 4、安装docker相关的 docker-ce 社区版 而ee是企业版
# 查看yum源支持的docker版本
# yum list docker-ce --showduplicates | sort -r
# 安装docker 这里我们使用社区版即可
yum install -y docker-ce docker-ce-cli containerd.io
# 如果要安装指定版本,执行如下语句,后面跟的是版本号
# yum install -y docker-ce-20.10.7-3.el7 docker-ce-cli-20.10.7-3.el7 containerd.io
# 5、启动docker
systemctl start docker
# 6、使用docker version查看是否安装成功
docker version
# 7、阿里云镜像加速
# 创建一个目录
sudo mkdir -p /etc/docker
# 编写配置文件
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://n2zg5mlq.mirror.aliyuncs.com"]
}
EOF
# 重启服务
sudo systemctl daemon-reload
sudo systemctl restart docker
# 设置开机自启
systemctl enable docker.service
# 8、安装docker-compose
# 下载docker-compose二进制文件
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 授权
chmod +x /usr/local/bin/docker-compose
# 查看版本
docker-compose version
print_info "docker安装成功!!!"
else
exit 0 # 退出程序
fi
}
param=$1
function main(){
pre_check
# 根据输入参数,选择执行对应方法,不输入则执行使用说明,可以自己拓展
case $param in
"jdk")
install_jdk
;;
"mysql")
install_mysql
;;
"redis")
install_redis
;;
"nacos")
install_nacos
;;
"docker")
install_docker
;;
*)
usage
;;
esac
}
main
评论区