为减轻Linux运维工作中重复执行的工作量,降低出错概率;同时保证脚本能应用在不同的场合以及其灵活性,特地编写此脚本,仅供参考!
?
#!/bin/bash
#
#Author: fanfubin
#QQ: 502422514
#Date: 2019-03-19
#FileName: redis.sh
#Description: The deploy redis script
#Copyright (C): 2019 All rights reserved
#
source /etc/init.d/functions
BLACK_COLOR=‘\E[1;30m‘
RED_COLOR=‘\E[1;31m‘
GREEN_COLOR=‘\E[1;32m‘
YELLOW_COLOR=‘\E[1;33m‘
BLUE_COLOR=‘\E[1;34m‘
PINK_COLOR=‘\E[1;35m‘ #紫色
SKYBLUE_COLOR=‘\E[1;36m‘ #天蓝色
WHITE_COLOR=‘\E[1;37m‘ #白色
SHAN=‘\E[31;5m‘ #字体闪烁
RES=‘\E[0m‘
cpu_count=`lscpu|awk -F ‘ +‘ ‘/^CPU\(s\):/{print $2}‘`
if [ $cpu_count -le 2 ];then
export cpu_num="1"
else
let cpu_num=`lscpu|awk -F ‘ +‘ ‘/^CPU\(s\):/{print $2}‘`-1
export cpu_num
fi
export httpd_user="nginx"
export httpd_group="nginx"
export httpd_id="2000"
export redis_×××tall_ver="redis-4.0.14.tar.gz"
export master_default_passwd="123456"
export ruby_×××tall_ver="ruby-2.5.5.tar.gz"
export redis_gem_×××tall_ver="redis-4.1.2.gem"
f_main_title() {
f_color green "`echo -e "\t服务器监控系统"`"
}
f_color() {
case "$1" in
black)
echo -e "${PINK_COLOR}$2 ${RES}"
;;
red)
echo -e "${RED_COLOR}$2 ${RES}"
;;
green)
echo -e "${GREEN_COLOR}$2 ${RES}"
;;
yellow)
echo -e "${YELLOW_COLOR}$2 ${RES}"
;;
blue)
echo -e "${BLUE_COLOR}$2 ${RES}"
;;
skyblue)
echo -e "${PINK_COLOR}$2 ${RES}"
;;
pink)
echo -e "${PINK_COLOR}$2 ${RES}"
;;
white)
echo -e "${PINK_COLOR}$2 ${RES}"
;;
shan)
echo -e "${SHAN}$2 ${RES}"
;;
*)
exit
;;
esac
}
##创建通用的用户名和id(user:nginx id:2000)
id $httpd_user
if [ `echo $?` -ne 0 ];then
useradd -s /sbin/nologin -M -u $httpd_id $httpd_user
else
test_httpd_id=`id $httpd_user | awk -F ‘[=(]‘ ‘{print $2}‘`
test_httpd_gid=`id $httpd_user | awk -F ‘[=(]‘ ‘{print $4}‘`
if [ $test_httpd_id -ne $httpd_id -o $test_httpd_gid -ne $httpd_id ];then
userdel -r $httpd_id
useradd -s /sbin/nologin -M -u $httpd_id $httpd_user
fi
fi
f_menu_×××tall_server_redis_list() {
local path
local redis_×××tall_dir
local num
local choose_num
local passwd_choose_num
local locate_server_num
local find_server_num
local new_master_passwd
local master_passwd
local redis_gem_×××tall_dir
local gem_passwd
echo
f_main_title
echo "=================================="
cat <<-EOF
【1. 】 Show ×××tall redis version
【2. 】 Source ×××tall redis && cluster
【3. 】 Show ×××tall ruby && gem version
【4. 】 Source ×××tall ruby && gem
【0. 】 Exit
EOF
echo "=================================="
read -p "Pls input a num:" num
f_is_num $num
[ $? -eq 1 ] || { action "Pls input valid num!" false ; f_menu_×××tall_server_redis_list;}
case "$num" in
1)
echo
echo -e "\t$redis_×××tall_ver"
f_menu_×××tall_server_redis_list
;;
###################################################### ×××tall redis && cluster
2)
echo
#redis .tar. is exist?
yum -y ×××tall mlocate &> /dev/null
updatedb &> /dev/null
locate_server_num=`locate ${redis_×××tall_ver}| wc -l`
if [ ! -e $redis_×××tall_ver ];then
if [ $locate_server_num -eq 1 ];then
\cp `locate ${redis_×××tall_ver}` . -a
elif [ $locate_server_num -ge 2 ];then
\cp `locate ${redis_×××tall_ver} | head -n1` . -a
else
find_server_num=`find / -name ${redis_×××tall_ver}| wc -l`
if [ $find_server_num -eq 1 ];then
\cp `find / -name ${redis_×××tall_ver}` . -a
elif [ $find_server_num -ge 2 ];then
\cp `find / -name ${redis_×××tall_ver} | head -n1` . -a
else
f_color red "`echo "${redis_×××tall_ver} is not exist!"`"
f_menu_×××tall_server_redis_list
fi
fi
fi
redis_×××tall_dir=`echo $redis_×××tall_ver | awk -F ‘.tar.‘ ‘{print $1}‘`
read -p "Pls input 1-×××tall or 2-quit : " choose_num
f_is_num $choose_num
[ $? -eq 1 ] || { action "Pls input valid num!" false ; f_menu_×××tall_server_redis_list;}
case "$choose_num" in
1)
echo
yum -y ×××tall gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel zlib-devel &> /dev/null
read -p "Whether use default masterauth=requirepass 1-yes or 2-no : " passwd_choose_num
f_is_num $passwd_choose_num
[ $? -eq 1 ] || { action "Pls input valid num!" false ; f_menu_×××tall_server_redis_list;}
case $passwd_choose_num in
1)
new_master_passwd=$master_default_passwd
f_color shan "`echo "Default masterauth=password is: $new_master_passwd "`"
;;
2)
while true
do
read -p "Pls input masterauth=requirepass password: " master_passwd
if [ -z "$master_passwd" ];then
f_color red "`echo "password can not be empty !"`"
else
new_master_passwd=$master_passwd
f_color shan "`echo "Masterauth=requirepass password is: $new_master_passwd "`"
break
fi
done
;;
*)
f_menu_×××tall_server_redis_list
esac
read -p "Pls input ×××tall Path or null: " path
if [ -z "$path" ];then
\rm -rf $redis_×××tall_dir
tar xf $redis_×××tall_ver
cd $redis_×××tall_dir
make PREFIX=/apps/$redis_×××tall_dir ×××tall
mkdir -p /apps/$redis_×××tall_dir/{etc,logs,data,run}
\cp redis.conf /apps/$redis_×××tall_dir/etc
\cp src/redis-trib.rb /usr/bin/
sed -ri ‘s/bind 127.0.0.1/bind 0.0.0.0/‘ /apps/$redis_×××tall_dir/etc/redis.conf
sed -ri ‘s/daemonize no/daemonize yes/‘ /apps/$redis_×××tall_dir/etc/redis.conf
sed -ri ‘s/supervised no/supervised systemd/‘ /apps/$redis_×××tall_dir/etc/redis.conf
sed -ri ‘s#/var/run/redis_6379.pid#/apps/‘$redis_×××tall_dir‘/run/redis_6379.pid#‘ /apps/$redis_×××tall_dir/etc/redis.conf
sleep 0.5
sed -ri ‘s#logfile ""#logfile "/apps/‘$redis_×××tall_dir‘/logs/redis_6379.log"#‘ /apps/$redis_×××tall_dir/etc/redis.conf
sed -ri ‘s/stop-writes-on-bgsave-error yes/stop-writes-on-bgsave-error no/‘ /apps/$redis_×××tall_dir/etc/redis.conf
sed -ri ‘s#dbfilename dump.rdb#dbfilename dump_6379.rdb#‘ /apps/$redis_×××tall_dir/etc/redis.conf
sed -ri ‘s#dir \./#dir /apps/‘$redis_×××tall_dir‘/data#‘ /apps/$redis_×××tall_dir/etc/redis.conf
sed -ri ‘s/# masterauth <master-password>/masterauth "‘$new_master_passwd‘"/‘ /apps/$redis_×××tall_dir/etc/redis.conf
sleep 0.5
sed -ri ‘s/# requirepass foobared/requirepass ‘$new_master_passwd‘/‘ /apps/$redis_×××tall_dir/etc/redis.conf
sed -ri ‘s/# maxclients 10000/maxclients 65536/‘ /apps/$redis_×××tall_dir/etc/redis.conf
sed -ri ‘s/appendonly no/appendonly yes/‘ /apps/$redis_×××tall_dir/etc/redis.conf
sed -ri ‘s/appendfilename "appendonly.aof"/appendfilename "appendonly_6379.aof"/‘ /apps/$redis_×××tall_dir/etc/redis.conf
sleep 0.5
##cluster
sed -ri ‘s/# cluster-enabled yes/ cluster-enabled yes/‘ /apps/$redis_×××tall_dir/etc/redis.conf
sed -ri ‘s/# cluster-config-file nodes-6379.conf/ cluster-config-file nodes-6379.conf/‘ /apps/$redis_×××tall_dir/etc/redis.conf
total_mem=`free -m | grep ‘Mem‘ |awk ‘{print $2}‘`
let mem_result=$total_mem/2*1024*1024
sed -ri ‘s/# maxmemory <bytes>/maxmemory ‘$mem_result‘/‘ /apps/$redis_×××tall_dir/etc/redis.conf
ln -s /apps/$redis_×××tall_dir/bin/* /usr/bin/
sleep 1
cat >/usr/lib/systemd/system/redis.service<<-EOF
[Unit]
Description=Redis persistent key-value database
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=/apps/$redis_×××tall_dir/bin/redis-server /apps/$redis_×××tall_dir/etc/redis.conf --supervised systemd
ExecReload=/bin/kill -s HUP \$MAINPID
ExecStop=/bin/kill -s QUIT \$MAINPID
Type=notify
#User=$httpd_user
#Group=$httpd_user
User=root
Group=root
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
EOF
#chown -R ${httpd_user}.${httpd_user} /apps/$redis_×××tall_dir
cat >>/etc/sysctl.conf<<-EOF
net.core.somaxconn = 512
vm.overcommit_memory = 1
EOF
sysctl -p
sleep 1
cat >>/etc/rc.d/rc.local<<-EOF
echo never > /sys/kernel/mm/transparent_hugepage/enabled
EOF
chmod a+x /etc/rc.d/rc.local
systemctl daemon-reload
sleep 1
systemctl start redis
cd -
f_color shan "`echo "redis ×××tall path is: /apps/${redis_×××tall_dir}"`"
else
\rm -rf $redis_×××tall_dir
tar xf $redis_×××tall_ver
cd $redis_×××tall_dir
make PREFIX=$path ×××tall
mkdir -p ${path}/{etc,logs,data,run}
\cp redis.conf ${path}/etc
\cp src/redis-trib.rb /usr/bin/
sed -ri ‘s/bind 127.0.0.1/bind 0.0.0.0/‘ $path/etc/redis.conf
sed -ri ‘s/daemonize no/daemonize yes/‘ $path/etc/redis.conf
sed -ri ‘s/supervised no/supervised systemd/‘ $path/etc/redis.conf
sed -ri ‘s#/var/run/redis_6379.pid#/apps/‘$redis_×××tall_dir‘/run/redis_6379.pid#‘ $path/etc/redis.conf
sleep 0.5
sed -ri ‘s#logfile ""#logfile "/apps/‘$redis_×××tall_dir‘/logs/redis_6379.log"#‘ $path/etc/redis.conf
sed -ri ‘s/stop-writes-on-bgsave-error yes/stop-writes-on-bgsave-error no/‘ $path/etc/redis.conf
sed -ri ‘s#dbfilename dump.rdb#dbfilename dump_6379.rdb#‘ $path/etc/redis.conf
sed -ri ‘s#dir \./#dir /apps/‘$redis_×××tall_dir‘/data#‘ $path/etc/redis.conf
sed -ri ‘s/# masterauth <master-password>/masterauth "‘$new_master_passwd‘"/‘ $path/etc/redis.conf
sleep 0.5
sed -ri ‘s/# requirepass foobared/# requirepass ‘$new_master_passwd‘/‘ $path/etc/redis.conf
sed -ri ‘s/# maxclients 10000/maxclients 65536/‘ $path/etc/redis.conf
sed -ri ‘s/appendonly no/appendonly yes/‘ $path/etc/redis.conf
sed -ri ‘s/appendfilename "appendonly.aof"/appendfilename "appendonly_6379.aof"/‘ $path/etc/redis.conf
sleep 0.5
##cluster
sed -ri ‘s/# cluster-enabled yes/ cluster-enabled yes/‘ $path/etc/redis.conf
sed -ri ‘s/# cluster-config-file nodes-6379.conf/ cluster-config-file nodes-6379.conf/‘ $path/etc/redis.conf
total_mem=`free -m | grep ‘Mem‘ |awk ‘{print $2}‘`
let mem_result=$total_mem/2*1024*1024
sed -ri ‘s/# maxmemory <bytes>/maxmemory ‘$mem_result‘/‘ $path/etc/redis.conf
ln -s ${path}/bin/* /usr/bin/
sleep 1
cat >/usr/lib/systemd/system/redis.service<<-EOF
[Unit]
Description=Redis persistent key-value database
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=${path}/bin/redis-server ${path}/etc/redis.conf --supervised systemd
ExecReload=/bin/kill -s HUP \$MAINPID
ExecStop=/bin/kill -s QUIT \$MAINPID
Type=notify
#User=$httpd_user
#Group=$httpd_user
User=root
Group=root
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
EOF
#chown -R ${httpd_user}.${httpd_user} $path
cat >>/etc/sysctl.conf<<-EOF
net.core.somaxconn = 512
vm.overcommit_memory = 1
EOF
sysctl -p
sleep 1
cat >>/etc/rc.d/rc.local<<-EOF
echo never > /sys/kernel/mm/transparent_hugepage/enabled
EOF
chmod a+x /etc/rc.d/rc.local
systemctl daemon-reload
sleep 1
systemctl start redis
cd -
f_color shan "`echo "redis ×××tall path is: ${path}"`"
sleep 1
fi
f_menu_×××tall_server_redis_list
;;
2)
f_menu_×××tall_server_redis_list
;;
*)
f_menu_×××tall_server_redis_list
;;
esac
;;
#################################################### show ruby && redis_gem version
3)
echo
echo -e "\t$ruby_×××tall_ver"
echo -e "\t$redis_gem_×××tall_ver"
f_menu_×××tall_server_redis_list
;;
##################################################### ×××tal ruby && redis_gem
4)
echo
read -p "Pls input 1-×××tall or 2-quit : " choose_num
f_is_num $choose_num
[ $? -eq 1 ] || { action "Pls input valid num!" false ; f_menu_×××tall_server_redis_list;}
yum -y ×××tall gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel zlib-devel &> /dev/null
read -p "Whether use default masterauth=requirepass 1-yes or 2-no : " passwd_choose_num
f_is_num $passwd_choose_num
[ $? -eq 1 ] || { action "Pls input valid num!" false ; f_menu_×××tall_server_redis_list;}
case $passwd_choose_num in
1)
new_master_passwd=$master_default_passwd
f_color shan "`echo "Default masterauth=requirepass is: $new_master_passwd "`"
;;
2)
f_color shan "`echo "You input passwd must be -eq redis cluster requirepass, or else create cluster error!!! "`"
read -p "You affirm chooge passwd ? 1-yes or 2-no :" $gem_choose_num
case $gem_choose_num in
1)
while true
do
read -p "Pls input gem password: " gem_passwd
if [ -z "$gem_passwd" ];then
f_color red "`echo "password can not be empty !"`"
else
new_master_passwd=$gem_passwd
f_color shan "`echo "Gem password is: $new_master_passwd "`"
break
fi
done
;;
2)
f_menu_×××tall_server_redis_list
;;
*)
f_menu_×××tall_server_redis_list
esac
;;
*)
f_menu_×××tall_server_redis_list
esac
# ruby .tar. is exist?
yum -y ×××tall mlocate &> /dev/null
updatedb &> /dev/null
locate_server_num=`locate ${ruby_×××tall_ver}| wc -l`
if [ ! -e $ruby_×××tall_ver ];then
if [ $locate_server_num -eq 1 ];then
\cp `find / -name ${ruby_×××tall_ver}` . -a
elif [ $locate_server_num -ge 2 ];then
\cp `find / -name ${ruby_×××tall_ver} | head -n1` . -a
else
find_server_num=`find / -name ${ruby_×××tall_ver}| wc -l`
if [ $find_server_num -eq 1 ];then
\cp `find / -name ${ruby_×××tall_ver}` . -a
elif [ $find_server_num -ge 2 ];then
\cp `find / -name ${ruby_×××tall_ver} | head -n1` . -a
else
f_color red "`echo "${ruby_×××tall_ver} is not exist!"`"
f_menu_×××tall_server_redis_list
fi
fi
fi
# redis_gem exist?
locate_server_num=`locate ${redis_gem_×××tall_ver}| wc -l`
if [ ! -e $redis_gem_×××tall_ver ];then
if [ $locate_server_num -eq 1 ];then
\cp `find / -name ${redis_gem_×××tall_ver}` . -a
elif [ $locate_server_num -ge 2 ];then
\cp `find / -name ${redis_gem_×××tall_ver} | head -n1` . -a
else
find_server_num=`find / -name ${redis_gem_×××tall_ver}| wc -l`
if [ $find_server_num -eq 1 ];then
\cp `find / -name ${redis_gem_×××tall_ver}` . -a
elif [ $find_server_num -ge 2 ];then
\cp `find / -name ${redis_gem_×××tall_ver} | head -n1` . -a
else
f_color red "`echo "${redis_gem_×××tall_ver} is not exist!"`"
f_menu_×××tall_server_redis_list
fi
fi
fi
ruby_×××tall_dir=`echo $ruby_×××tall_ver | awk -F ‘.tar.‘ ‘{print $1}‘`
redis_gem_×××tall_dir=`echo $redis_gem_×××tall_ver | awk -F ‘.gem‘ ‘{print $1}‘`
\rm -rf $ruby_×××tall_dir
tar xvf $ruby_×××tall_ver
cd $ruby_×××tall_dir
./configure
make -j $cpu_num
make ×××tall
sleep 1
cd -
/usr/local/bin/gem ×××tall -l $redis_gem_×××tall_ver
sed -ri s‘/password => nil/password => ‘$new_master_passwd‘/g‘ /usr/local/lib/ruby/gems/2.5.0/gems/$redis_gem_×××tall_dir/lib/redis/client.rb
f_menu_×××tall_server_redis_list
;;
0)
exit 1
;;
*)
echo
f_menu_×××tall_server_redis_list
esac
unset path
unset redis_×××tall_dir
unset num
unset choose_num
unset locate_server_num
unset passwd_choose_num
unset find_server_num
unset new_master_passwd
unset master_passwd
unset redis_gem_×××tall_dir
unset gem_passwd
}
Flag=true
while $Flag
do
f_menu_×××tall_server_redis_list
if [ $? -eq 0 ];then
Flag=false
fi
done
最后需要手动登陆集群中任意主机,进行创建集群,命令示例如下:
redis-trib.rb create --replicas 1 172.18.200.101:6379 172.18.200.102:6379 172.18.200.103:6379 172.18.200.104:6379 172.18.200.105:6379 172.18.200.106:6379
原文地址:https://blog.51cto.com/13560168/2409657
时间: 2024-11-05 20:45:22