# 实战脚本示例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