# 实战脚本示例01

CentOS7.9 软件安装脚本

nginx

redis

rabbitmq

等等

#!/bin/bash

################################################
# 执行用户判断:
################################################
# 只允许使用root用户执行
# 判断当前用户是否为root
#################################################
user=$(env | grep USER | cut -d "=" -f 2)
if [ "$user" != "root" ]
then
	echo "请使用root用户执行该脚本。切换root命令:su - root"
	exit 0
fi
sleep 1

homepwd=/home/jysp



################################################
# 安装环境校验:
################################################
# 判断jysp用户是否存在
# 判断jysp文件夹是否存在
# 进入对应的安装文件夹内
#################################################
function filepwd-check(){
  id 'jysp' &>/dev/null
  if [ ! $? -eq 0 ]
    then
      echo "用户'jysp'不存在。"
       exit 1
  fi
  if [ ! -d "$homepwd" ]
    then
      echo "jysp文件夹不存在"
      exit 1
  fi

  mariadbfile=(boost-program-options-1.53.0-28.el7.x86_64.rpm galera-25.3.37-1.el7.centos.x86_64.rpm MariaDB-client-10.3.36-1.el7.centos.x86_64.rpm MariaDB-common-10.3.36-1.el7.centos.x86_64.rpm MariaDB-compat-10.3.36-1.el7.centos.x86_64.rpm MariaDB-server-10.3.36-1.el7.centos.x86_64.rpm expect-5.45-14.el7_1.x86_64.rpm my.cnf tcl-8.5.13-8.el7.x86_64.rpm)
  rabbitfile=(erlang-23.3.4.4-1.el7.x86_64.rpm rabbitmq-server-3.7.8-1.el7.noarch.rpm)
  redisfile=(redis.tar.gz redis.conf redis-server.service)
  influxfile=(influxdb-1.8.3.x86_64.rpm)
  vsftpfile=(vsftpd-3.0.2-29.el7_9.x86_64.rpm vsftpd.tar.gz)
  nginxfile=(ssl.tar.gz nginx.conf nginx-1.14.2-1.el7_4.ngx.x86_64.rpm)

  # case in 校验
  case $1 in
    mariadb)
     ds=("${mariadbfile[*]}")
     cd $homepwd/rpm-install/MariaDB-10.3
     echo -e "\e[31m######==========MariaDB-10.3==========######\e[0m"
     ;;
    rabbitmq)
     ds=("${rabbitfile[*]}")
     cd $homepwd/rpm-install/RabbitMQ
     echo -e "\e[31m######==========RabbitMQ==========######\e[0m"
     ;;
    redis)
      ds=("${redisfile[*]}")
      cd $homepwd/rpm-install/Redis
      echo -e "\e[31m######==========Redis==========######\e[0m"
      ;;
    influxdb)
     ds=("${influxfile[*]}")
     cd $homepwd/rpm-install/InfluxDB
     echo -e "\e[31m######==========InfluxDB==========######\e[0m"
     ;;
    vsftpd)
     ds=("${vsftpfile[*]}")
     cd $homepwd/rpm-install/VSFTPD
     echo -e "\e[31m######==========VSFTPD==========######\e[0m"
         ;;
    nginx)
      ds=("${nginxfile[*]}")
      cd $homepwd/rpm-install/Nginx
      echo -e "\e[31m######==========Nginx==========######\e[0m"
  esac

  # 循环输出文件名称到屏幕
  for value in ${ds[*]}
    do
      if [ -f "$value" ];then
        echo -e "\e[32m    $value ---OK\e[0m"
        sleep 1
      else
        echo -e "\e[31m    $value ---NO\e[0m"
        exit 0
      fi
    done
}

################################################
# 检测服务是否运行
################################################
#
#################################################
function check_server(){
  echo ""
  echo -e "\e[31m######==========$1==========######\e[0m"
  echo -e "\e[31m$1::\e[0m `systemctl show $1 --property ActiveState | awk -F "=" '{print $2}'`"
  if [ "$1" == "rabbitmq-server.service" ]
    then
      echo -e "\e[31muser/role:\e[0m `rabbitmqctl list_users | grep jysp`"
      echo -e "\e[31mvhosts:\e[0m `rabbitmqctl list_vhosts | grep jysp`"
  elif [ "$1" == "influxdb.service" ]
    then
      echo -e "\e[31mdata:\e[0m `influx -execute "show databases;" | grep ycxs`"
      echo -e "\e[31mstrategy:\n\e[0m `influx -execute "show retention policies on ycxs1000;"`"
  elif [ "$1" == "mariadb.service" ]
    then
      echo -e "\e[31mDatabase:\n\e[0m `mysql -uroot -pNari_jysp3.0 -e "show databases;" | grep -v mysql | grep -v information_schema | grep -v performance_schema | grep -v Database| grep -v test`"
  fi
  echo -e "\e[31m######==========$1==========######\e[0m"
  echo ""
}




################################################
# 2、MariaDB安装脚本
################################################
# cd /home/jysp/rpm-install/MariaDB-10.3
# 安装rpm包依赖
# 创建 /var/log/mariadb 目录
# 拷贝 my.cnf 到 /etc/ 下
# 执行交互命令
#
#################################################
function mysql-install(){
  cd $homepwd/rpm-install/MariaDB-10.3
  sh -xc "yum localinstall -y --nogpgcheck boost-program-options-1.53.0-28.el7.x86_64.rpm galera-25.3.37-1.el7.centos.x86_64.rpm MariaDB-client-10.3.36-1.el7.centos.x86_64.rpm MariaDB-common-10.3.36-1.el7.centos.x86_64.rpm MariaDB-compat-10.3.36-1.el7.centos.x86_64.rpm MariaDB-server-10.3.36-1.el7.centos.x86_64.rpm expect-5.45-14.el7_1.x86_64.rpm tcl-8.5.13-8.el7.x86_64.rpm"
  if [ "$?" != 0 ]
    then
      echo -e "\e[31m MariaDB 安装失败,请检查!!!\e[0m"
      exit 0
  fi
  sh -xc "mkdir /var/log/mariadb"
  sh -xc "chown mysql:mysql /var/log/mariadb"
  sh -xc "systemctl enable mariadb.service"
  cp -f my.cnf /etc/
  sh -xc "systemctl start mariadb.service"
  sleep 3
  mysqpid=`cat /var/lib/mysql/mariadb.pid`
  if [ X"$mysqpid" == "X" ]
    then
      echo -e "\e[31m mariadb 未运行,请排查!!!\e[0m"
      exit 0
  fi

/usr/bin/expect <<-EOF
spawn mysql
expect "MariaDB \[(none)\]>"
send "update mysql.user set password=password('Nari_jysp3.0') where user='root';\r"
send "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Nari_jysp3.0' WITH GRANT OPTION;\r"
send "update mysql.user set plugin = 'mysql_native_password' where User='root';\r"
send "FLUSH PRIVILEGES;\r"
send "create database nacos DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;\r"
send "create database nari_jysp DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;\r"
send "create database ycxs1000 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;\r"
send "FLUSH PRIVILEGES;\r"
send "quit;\r"
expect eof
EOF
  if [ "$?" != 0 ];then
    echo -e "\e[31m MariaDB设置失败,请检查!!! \e[0m"
    exit 0
  fi
}

################################################
# 3、RabbitMQ安装脚本
################################################
# cd /home/jysp/rpm-install/RabbitMQ
# 启动
# 配置rabbitmq:插件、虚拟机、用户
# 配置用户权限
#################################################
function rabbitmq-install(){
  cd $homepwd/rpm-install/RabbitMQ
  sh -xc "yum localinstall -y --nogpgcheck erlang-23.3.4.4-1.el7.x86_64.rpm rabbitmq-server-3.7.8-1.el7.noarch.rpm socat-1.7.3.2-2.el7.x86_64.rpm"
  if [ "$?" != 0 ];then
    echo -e "\e[31m rabbitmq 安装失败,请检查!!!\e[0m"
  exit 0
  fi
  sh -xc "systemctl start rabbitmq-server.service"
  rastatus=`systemctl status rabbitmq-server.service | grep "active (running) "`
  if [ "X$rastatus" == "X" ]
  then
     echo -e "\e[31m rabbitmq.servert 未运行,请排查!!!\e[0m"
   exit 0
  fi
  sh -xc "systemctl enable rabbitmq-server.service"
  rabbitset=("rabbitmq-plugins enable rabbitmq_management" "rabbitmqctl add_vhost jysp_vhost" "rabbitmqctl add_user jysp Nari_jysp3.0" "rabbitmqctl set_user_tags jysp administrator")
  for((i=0;i<4;i++))
  do
    ${rabbitset[i]}
    if [ "$?" != 0 ];then
      echo -e "\e[31m ${rabbitset[i]} 设置失败,请检查!!! \e[0m"
      exit 0
    fi
    sleep 2
  done
  rabbitmqctl set_permissions -p "jysp_vhost" jysp ".*" ".*" ".*"
  if [ "$?" != 0 ];then
    echo -e "\e[31m ${influxset[i]} 设置失败,请检查!!! \e[0m"
    exit 0
  fi
}

################################################
# 4、redis安装脚本
################################################
# cd /home/jysp/rpm-install/Redis
# 添加redis用户组
# 添加redis用户:
#    redis 用户名
#    -g redis 用户组
#    -d /var/lib/redis 用户家目录
#    -s nologin 不允许登录
# /etc/redis
# /var/log/redis
#
#################################################
function redis-install(){
  cd $homepwd/rpm-install/Redis
  sh -xc "groupadd redis"
  sh -xc "useradd -g redis -d /var/lib/redis -s /usr/sbin/nologin redis"
  mkdir /etc/redis
  mkdir /var/log/redis
  chown redis:redis /var/log/redis
  tar -zxvf redis.tar.gz
  mv -f bin/* /usr/bin/
  cp redis.conf /etc/redis/redis.conf
  cp redis-server.service /lib/systemd/system/
  sh -xc "systemctl daemon-reload"
  sh -xc "systemctl start redis-server.service"
  restatus=`systemctl status redis-server.service | grep "active (running) "`
  if [ "X$restatus" == "X" ]
  then
     echo -e "\e[31m redis.service 未运行,请排查!!!\e[0m"
   exit 0
  fi
  sh -xc "systemctl enable redis-server.service"
}


################################################
# 5、influxdb安装脚本
################################################
#
#################################################
function influxdb-install(){
  cd $homepwd/rpm-install/InfluxDB
  sh -xc "yum localinstall -y --nogpgcheck influxdb-1.8.3.x86_64.rpm"
  sh -xc "systemctl start influxdb"
  instatus=`systemctl status influxdb.service | grep "active (running) "`
  if [ "X$instatus" == "X" ]
  then
     echo -e "\e[31m influxdb.service 未运行,请排查!!!\e[0m"
   exit 0
  fi
  sh -xc "systemctl enable influxdb.service"
  sleep 5
  influx -execute "create user "root" with password 'Nari_jysp3.0' with all privileges;"
  if [ "$?" != 0 ];then
    echo -e "\e[31m ${influxset[i]} 设置失败,请检查!!! \e[0m"
  exit 0
  fi
  influx -execute "create database ycxs1000;"
  if [ "$?" != 0 ];then
    echo -e "\e[31m ${influxset[i]} 设置失败,请检查!!! \e[0m"
  exit 0
  fi
  influx -execute "CREATE RETENTION POLICY "rp_rt_his_real" ON "ycxs1000" DURATION 370d REPLICATION 1;"
  if [ "$?" != 0 ];then
    echo -e "\e[31m ${influxset[i]} 设置失败,请检查!!! \e[0m"
  exit 0
  fi
}


################################################
# 6、vsftpd安装脚本
################################################
# cd /home/jysp/rpm-install/VSFTPD
# 安装 vsftpd-3.0.2-29.el7_9.x86_64.rpm
# 解压 vsftpd.tar.gz
# 删除 /etc/vsftpd 目录
# 移动 vsftpd 目录到 /etc/
# 创建 /home/jysp/ftps
# 创建 /var/log/vsftpd
#
#################################################
function vsftpd-install()
{
 cd $homepwd/rpm-install/VSFTPD
 sh -xc "yum localinstall -y --nogpgcheck vsftpd-3.0.2-29.el7_9.x86_64.rpm"
 tar -zxvf vsftpd.tar.gz >> /dev/null
 sh -xc "rm -rf /etc/vsftpd"
 sh -xc "mv vsftpd /etc/"
 sh -xc "mkdir /home/jysp/ftps"
 sh -xc "chown jysp:jysp /home/jysp/ftps"
 sh -xc "chmod 777 /home/jysp/ftps"
 sh -xc "mkdir /var/log/vsftpd"
 ip=$(ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|grep -v 192.168.122.1|awk '{print $2}'|tr -d "addr:")
 sed -i 's/\(pasv_address=\).*/\1'"$ip"'/g' /etc/vsftpd/vsftpd.conf
 sh -xc "systemctl restart vsftpd.service"
 vsstatus=`systemctl status vsftpd.service | grep "active (running) "`
 if [ "X$vsstatus" == "X" ]
 then
     echo -e "\e[31m vsftpd.service 未运行,请排查!!!\e[0m"
	 exit 0
 fi
 sh -xc "systemctl enable vsftpd.service"
}


################################################
# 7、nginx安装脚本
################################################
# cd /home/jysp/rpm-install/Nginx
# 安装 nginx-1.14.2-1.el7_4.ngx.x86_64.rpm
# 解压 ssl文件
# 移动 ssl文件到 /etc/nginx 目录下
# 拷贝 nginx.conf 文件到 /etc/nginx 目录下
#
#################################################
function nginx-install(){
  cd $homepwd/rpm-install/Nginx
  sh -xc "yum localinstall -y --nogpgcheck nginx-1.14.2-1.el7_4.ngx.x86_64.rpm"
  tar -zxvf ssl.tar.gz >> /dev/null
  mv -f ssl /etc/nginx
  cp -rf nginx.conf /etc/nginx
  # sh -xc "groupadd www-data"
  # sh -xc "useradd -d /var/www -s /usr/sbin/nologin -g www-data www-data"
  sh -xc "systemctl restart nginx.service"
  ngstatus=`systemctl status nginx.service | grep "active (running) "`
  if [ "X$ngstatus" == "X" ]
  then
     echo -e "\e[31m nginx.service 未运行,请排查!!!\e[0m"
   exit 0
  fi
  sh -xc "systemctl enable nginx.service"
}



################################################
# setTable:
################################################
# \e[:颜色开始
# \e[0m:颜色结束
# 31m:红色
#################################################
function setTable(){
  # 使用 column 按照“#”进行对齐 column -s "#" -t
  # 利用awk命令替换掉以 +开头的行,并替换空格为 -
  echo -e "\e[31m"$1"\e[0m"|column -s "#" -t|awk '{if($0 ~ /^+/){gsub(" ","-",$0);print $0}else{print $0}}'
}

function setTableRow(){
  # 所有参数
  local value=$*
  # 获取参数个个数
  local varCount=$#
  # 计算表格边缘长度
  local num=$(( $varCount * 2 + 1 ))

  split=$(seq -s '+#' $num | sed 's/[0-9]//g')+
  if [ -z $table ]
    then
      # 上边框
      table="\n${split}\n"
      # 内容框
      local tableRow
      for k in "$@"
        do
          tableRow=$tableRow"#$k#|"
        done
      table="${table}|$tableRow\n"
      # 下边框
      table="${table}${split}\n"
      # 上一个边框记录
      lastTabCount=$varCount
    else
      #  判断是否需要增加边框
      if [ $varCount -gt $lastTabCount ]
        then
          # 增加边框
          local difCount=$(( $varCount - $lastTabCount ))
          local difNum=$(( $difCount * 2 + 1 ))
          difSplit=$(seq -s '+#' $difNum | sed 's/[0-9]//g')+
          # 删除原有后缀,增加长度
          table="${table%+\\n}"
          table="${table}${difSplit}\n"
      fi
      # 内容框
      local tableRow
      for k in "$@"
        do
          tableRow=$tableRow"#$k#|"
        done
      table="${table}|$tableRow\n"
      # 下边框
      table="${table}${split}\n"
  fi
}





################################################
# 安装提示:
################################################
# \e[:颜色开始
# \e[0m:颜色结束
# 31m:红色
#################################################
echo -e "\e[31m#######################开始安装######################\e[0m"
echo -e "\e[31m######\e[0m    该脚本程序只适用于规定的镜像,       \e[31m######\e[0m"
echo -e "\e[31m######\e[0m    如果用于其他,请自行修改适配,       \e[31m######\e[0m"
echo -e "\e[31m######\e[0m    且该脚本安装的软件已下载固定,       \e[31m######\e[0m"
echo -e "\e[31m######\e[0m    如需修改,请自行修改或手动安装,     \e[31m######\e[0m"
echo -e "\e[31m######\e[0m   ISO:CentOS-7-x86_64-DVD-2009.iso      \e[31m######\e[0m"
echo -e "\e[31m#####################################################\e[0m"
echo -e "\n"
echo -e "\e[31m#######################版本说明######################\e[0m"

################################################
# 表格方法:生成原理解析
################################################
# 1、生成如下字符序列,作为表格边界
# \n+#+#+#+#+\n 如果是两列就生成4个占位符
#
# 2、字段行,已 "|#内容#|" 的格式来预处理
# \n+#+#+#+#+\n|#软件#|#版本#|\n
#
# 3、使用 column 按照“#”进行对齐 column -s "#" -t
# +  +     +  +     +
# |  软件  |  版本  |
#
# 4、利用awk命令替换掉以 + 开头的行,并替换空格为 -
# awk '{if($0 ~ /^+/){gsub(" ","-",$0);print $0}else{print $0}}'
# +--+-----+--+-----+
# |  软件  |  版本  |
#################################################

table=""
setTableRow "软件" "版本"
setTableRow "MySQL版本" "MariaDB-10.3.36" "版本"
setTableRow "erlang版本" "erlang-23.3.4.4"
setTableRow "RabbitMQ版本" "RabbitMQ-3.7.8"
setTableRow "Redis版本" "Redis-5.0.3"
setTableRow "InfluxDB版本版本" "InfluxDB-1.8.3"
setTableRow "VSFTPD版本" "VSFTPD-3.0.2"
setTableRow "Nginx版本" "Nginx-1.14.2"
setTable ${table}

#echo -e "1:安装全部组件\n2:安装Mariadb\n3: 安装Rabbitmq\n4: 安装redis\n5: 安装influxdb\n6: 安装vsftpd"
echo -e "\e[31m#########################安装选择####################\e[0m"
table=""
setTableRow "序号" "说明"
setTableRow "1" "安装全部组件"
setTableRow "2" "安装MariaDB"
setTableRow "3" "安装RabbitMQ"
setTableRow "4" "安装Redis"
setTableRow "5" "安装InfluxDB"
setTableRow "6" "安装VSFTPD"
setTableRow "7" "安装Nginx"
setTable ${table}



################################################
# 安装菜单显示:
################################################
# while死循环,选择数字后跳出循环
#################################################
while true
do
  read -p "请输入序号[1-7],选择需安装的组件序号:" serv
  if [ "$serv" == "1" \
    -o "$serv" == "2" \
    -o "$serv" == "3" \
    -o "$serv" == "4" \
    -o "$serv" == "5" \
    -o "$serv" == "6" \
    -o "$serv" == "7" \
    -o "$serv" == "8" \
    -o "$serv" == "9" ]
    then
        break
    fi
  echo -e "\e[31m请正确输入序号[1-7]!!!\e[0m"
done

################################################
# 选项判断:
################################################
# 1、安装全部
# 2、安装MariaDB
# 3、安装Rabbitmq
# 4、安装Redis
# 5、安装influxdb
# 6、安装vsftpd
#################################################
case $serv in
  1)
    # 校验文件类型
    dir=(mariadb rabbitmq redis influxdb vsftpd nginx)
    for((num=0;num<${#dir[*]};num++))
    do
      filepwd-check ${dir[num]}
    done
    echo -e "\e[31m######==========END==========######\e[0m"

    # 安装
    mysql-install
    rabbitmq-install
    redis-install
    influxdb-install
    vsftpd-install
    nginx-install

    # 检验服务状态
    ser=(mariadb.service rabbitmq-server.service redis-server.service influxdb.service vsftpd.service nginx.service)
        for((i=0;i<${#ser[*]};i++))
        do
          check_server ${ser[i]}
        done
    ;;
  2)
    filepwd-check mariadb
    echo -e "\e[31m######==========END==========######\e[0m"
    mysql-install
    check_server mariadb.service
    ;;
  3)
    filepwd-check rabbitmq
    echo -e "\e[31m######==========END==========######\e[0m"
    rabbitmq-install
    check_server rabbitmq-server.service
    ;;
  4)
    #  安装前检查
    filepwd-check redis
    # 提示符
    echo -e "\e[31m######==========END==========######\e[0m"
    # 执行安装
    redis-install
    # 检测是否启动
    check_server redis-server.service
    ;;
  5)
    filepwd-check influxdb
    echo -e "\e[31m######==========END==========######\e[0m"
    influxdb-install
    check_server influxdb.service
    ;;
  6)
    filepwd-check vsftpd
    echo -e "\e[31m######==========END==========######\e[0m"
    vsftpd-install
    check_server vsftpd.service
    ;;
  7)
    filepwd-check nginx
    echo -e "\e[31m######==========END==========######\e[0m"
    nginx-install
    check_server nginx.service
    ;;
esac
更新时间: 2023年12月27日星期三晚上11点30分