目 录CONTENT

文章目录

Linux各个组件一键化安装shell脚本,可拓展

筱晶哥哥
2023-03-12 / 0 评论 / 0 点赞 / 55 阅读 / 23764 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2024-03-23,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
#!/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
0

评论区