#!/bin/bash ############################################################## # File Name: /sources/redis-cluster.sh # Version: V1.0 # Author: sanshi # Organization: https://www.9133w.cn/sources/ # Created Time : 2021-03-04 10:31:49 # Description: ############################################################## [ $EUID -ne 0 ] && echo 'root privileges need!' && exit 0 #--------basic env-------# rpm -q ansible pssh sshpass |\ grep -oP '(?<=package )\S+' |\ xargs -r yum install -y read -p "input version of redis: (default:latest) " redis_version read -p "input redis listen port: " redis_port : ${redis_version:=latest} : ${redis_port:=6379} #-------single-mode--------# single_redis() { if ! command -v docker; then curl -sSL https://9133w.cn/sources/docker_install.sh | /bin/bash fi sleep 2 docker images | grep -q redis || docker pull redis:$redis_version wget http://download.redis.io/redis-stable/redis.conf -P /data/ if [ $? -ne 0 ] then echo 'redis confie file download failure, use default file' wget https://9133w.cn/sources/redis.conf -P /data/ else pushd /data && \ sed -i 's@^protected-mode no@protected-mode yes@' redis.conf && \ sed -i 's@^appendonly no@appendonly yes@' redis.conf && popd fi docker run -p $redis_port:6379 \ --name redis \ -v redis.conf:/etc/redis/redis.conf \ -v /data/redis-data:/data \ -d redis:$redis_version redis-server /etc/redis/redis.conf --appendonly yes } #------cluster mode--------# cluster_redis() { read -p "input number of nodes: " num_nodes [ -z "$num_nodes" ] && echo 'number of nodes not found' && exit 2 if (( $num_nodes < 3 )) then echo "cluster number can not less than 3" exit 3 fi read -p "input node address: (split with space) " nodes_addr #-------access nodes-------# if ! grep -q '\[redis\]' /etc/ansible/hosts then echo '[redis]' >> /etc/ansible/hosts for ip_n in $nodes_addr do echo $ip_n >> /etc/ansible/hosts done fi [[ -f $HOME/.ssh/id_rsa ]] || \ echo -e "\n" | ssh-keygen -t rsa -N "" -q for key_sync in $nodes_addr do if ! pssh -H $key_sync -O stricthostkeychecking=no -l root "echo" &> /dev/null then echo "Input $key_sync password of root:" read -t 60 key_pass key_pass=${key_pass:-111111} export SSHPASS=$key_pass sshpass -e ssh-copy-id -i ~/.ssh/id_rsa.pub root@$key_sync -o StrictHostKeyChecking=no [ $? -ne 0 ] && echo "$key_sync add public key failure" && exit 1 fi done #-------redis cluster install-------# : ${redis_version:=latest} : ${redis_port:=6379} cat > redis.yaml << EOF --- - hosts: redis remote_user: root vars: pkgs: tasks: - name: docker install shell: if ! command -v docker; then curl -sSL https://9133w.cn/sources/docker_install.sh | /bin/bash;fi - name: download images shell: docker images | grep -q redis || docker pull redis:$redis_version - name: create redis shell: /usr/sbin/ss -tnl | grep -q $redis_port || docker create --name redis --net host -v /data/redis-data:/data redis:$redis_version --cluster-enabled yes --cluster-config-file nodes.conf --port $redis_port --appendonly yes - name: start redis cluster shell: docker start redis EOF ansible-playbook redis.yaml nodes_num=`echo $nodes_addr | awk '{print NF}'` nodes_one=`echo $nodes_addr | awk '{print $1}'` redis_info=`for i in $nodes_addr; do echo -en "${i}:$redis_port ";done; echo` redis_replicas=`echo "$nodes_num / 3 - 1"|bc` clear cat << EOF ###################################################################### #please login any one redis node to create cluster. commands info is:# ###################################################################### docker exec -it redis /bin/bash redis-cli --cluster create $redis_info --cluster-replicas $redis_replicas EOF } clear cat << EOF please select which mode to install [1] single-mode [2] cluster-mode [q] quit EOF read -p 'your choice: ' select_num : ${select_num:=q} case $select_num in 1) single_redis ;; 2) cluster_redis ;; *) exit 0 esac