Shell脚本自动化搭建ElasticSearch集群

/ 前言 /

       该脚本适用于7台主机以下的集群, 如果是大集群需要为节点进行个性化配置可以加一些if判断来根据ip修改节点的属性
       如需了解ElasticSearch集群搭建流程请看我的另一篇博文ElasticSearch集群搭建图文解析
       如需了解ElasticSearch启动常见异常及解决方案请看我的另一篇博文ElasticSearch常见启动异常及解决方案

/ 自动化Shell脚本 /

# !/bin/bash

# es集群节点名称
NAME_LIST=(
node-1
node-2
node-3
)

# es集群IP地址
IP_LIST=(
192.168.0.1
192.168.0.2
192.168.0.3
)

unicast_hosts="[\"192.168.0.1:9310\",\"192.168.0.2:9310\",\"192.168.0.3:9310\"]"
initial_hosts="[\"192.168.0.1\",\"192.168.0.2\",\"192.168.0.3\"]"


# 创建es启动用户
function add_user(){

echo "请注意,在创建用户时会先对该用户进行删除操作以确保脚本运行成功, 如已有该用户请慎重输入用户名!"
read -p "继续请输入 1 ,停止请输入 2. : " IS_CONTINUE
if [ ${IS_CONTINUE} -ne 1 ]; then
  echo "停止运行该脚本!"
fi

read -p "请输入新增用户用户名 : " username

read -p "请输入新增用户密码 : " password

echo -e "\n"
for ((i=0;i<${#IP_LIST[*]};i++))
do

echo "正在为${IP_LIST[i]}机器添加用户, 请输入该机器的root密码"
ssh -Tq ${IP_LIST[i]} <<ADDEOF
userdel -r ${username}
echo "userdel -r ${username}"
useradd -d /home/${username} ${username}
expect -c"
 spawn passwd ${username}
 expect {
     \"*yes/no*\" {send \"yes\r\";exp_continue}
     \"*New password:*\" {send \"${password}\r\";exp_continue}
     \"*Retype new password:*\" {send \"${password}\r\";exp_continue}
}"
exit
ADDEOF
echo -e "\n"
done
}

# 创建秘钥
function create_keygen(){
echo "开始新建免密秘钥"
su - root <<EOF
 expect -c"
    spawn  ssh-keygen -t rsa
      set timeout 30
      expect {
        \"*.ssh/id_rsa*\" {send \"\r\";exp_continue}
        \"*Overwrite*\" {send \"y\r\";exp_continue}
    \"*empty for no passphrase*\" {send \"\r\";exp_continue}
        \"*Enter same passphrase again:*\" {send \"\r\";exp_continue}
      }
  "
EOF
if [ $? -eq 0 ];then
 echo "创建秘钥成功"
else
 echo "创建秘钥失败"
fi
}

# 免密钥到其他机器
function sync_keygen(){
echo "开始同步密钥到其他主机"
for ((i=0;i<${#IP_LIST[*]};i++))
do
su root<<EOF
expect -c"
 spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@${IP_LIST[i]}
 expect {
     \"*yes/no*\" {send \"yes\r\";exp_continue}
     \"*password:*\" {send \"$password\r\";exp_continue}
  }"
EOF
done
if [ $? -eq 0 ];then
  echo "设置免秘钥成功"
else
  echo "设置免秘钥失败"
fi
}

read -p "请输入es安装包位置, 如/opt/down : " FILE_PATH
read -p "请输入安装包的名称, 如elasticsearch-7.7.0-linux-x86_64.tar.gz : " FILE_NAME
read -p "请输入es安装目录, 如/opt : " INSTALL_PATH
read -p "请输入集群名称 : " CLUSTER_NAME
DATA_PATH='\'${INSTALL_PATH}'\/elasticsearch\/data'
LOG_PATH='\'${INSTALL_PATH}'\/elasticsearch\/logs'


#  安装es
function install_es(){

echo "开始安装ES"
cd ${FILE_PATH}
sleep 1s
tar -xf ${FILE_NAME}  -C  ${INSTALL_PATH}
NAME_LENGTH=${#FILE_NAME}
SPLIT_LENGTH=$((${NAME_LENGTH}-7))
FILE_NAME=${FILE_NAME:0:${SPLIT_LENGTH}}
ln -s ${INSTALL_PATH}/${FILE_NAME}   ${INSTALL_PATH}/elasticsearch


sleep 1s
cd ${INSTALL_PATH}
chown -R ${username}:${username} ${INSTALL_PATH}/elasticsearch
echo "chown cmd" "chown -R ${username}:${username} ${INSTALL_PATH}/elasticsearch*"
sleep 1s
}


# 配置es
function config_es(){

echo "开始ES集群化配置"
sleep 1s
cd ${INSTALL_PATH}/elasticsearch/config

cp elasticsearch.yml.master elasticsearch.yml
# 如果是修改没有配置好的elasticsearch.yml使用下面的echo
echo 'cluster.name= '"${CLUSTER_NAME}" >> elasticsearch.yml
echo 'node.name= '"${NAME_LIST[0]}" >> elasticsearch.yml
# ...

# 如果是修改已经配置好的elasticsearch.yml文件使用下面的sed -i
sed -i '/cluster.name/s/:.*/: '"${CLUSTER_NAME}"'/'   elasticsearch.yml
sed -i '/node.name/s/:.*/: '\""${NAME_LIST[0]}"\"'/'   elasticsearch.yml
sed -i '/path.data/s/:.*/: '"${DATA_PATH}"'/'   elasticsearch.yml
sed -i '/path.logs/s/:.*/: '"${LOG_PATH}"'/'   elasticsearch.yml
sed -i '/network.host/s/:.*/: '"${IP_LIST[0]}"'/'   elasticsearch.yml
sed -i '/network.bind_host/s/:.*/: '"${IP_LIST[0]}"'/'   elasticsearch.yml
sed -i '/http.cors.allow-origin/s/:.*/: "http:\/\/'${IP_LIST[0]}':8080"/'   elasticsearch.yml
sed -i '/network.publish_host:/s/:.*/: '"${IP_LIST[0]}"'/'   elasticsearch.yml
sed -i '/cluster.initial_master_nodes:/s/:.*/: '${initial_hosts}'/'   elasticsearch.yml
sed -i '/discovery.zen.ping.unicast.hosts:/s/:.*/: '${unicast_hosts}'/'   elasticsearch.yml
echo 'vm.max_map_count = 262144' >>/etc/sysctl.conf
sysctl -p
echo ''${username}'        hard  nofile   65536' >>/etc/security/limits.conf
echo ''${username}'        soft  nofile   65536' >>/etc/security/limits.conf
echo ''${username}'        hard  nproc    4096' >>/etc/security/limits.conf
echo ''${username}'        soft  nproc    4096' >>/etc/security/limits.conf
}


# 同步es安装包并开始统一修改elasticsearch.yml配置文件
function sync_cfg(){
echo "开始配置集群内其余主机"
sleep 1s
cd ${INSTALL_PATH}
for ((i=1;i<${#IP_LIST[*]};i++))
do

 ssh -Tq ${IP_LIST[i]} <<CONFIG_EOF
chown -R ${username}:${username} ${INSTALL_PATH}/elasticsearch
sleep 1s
cd ${INSTALL_PATH}/elasticsearch
rm -rf ${INSTALL_PATH}/elasticsearch/data
sleep 1s
cd config
sed -i '/node.name/s/:.*/: '"${NAME_LIST[i]}"'/'   elasticsearch.yml
sed -i '/network.host/s/:.*/: '"${IP_LIST[i]}"'/'   elasticsearch.yml
sed -i '/network.bind_host/s/:.*/: '"${IP_LIST[i]}"'/'   elasticsearch.yml
sed -i '/network.publish_host:/s/:.*/: '"${IP_LIST[i]}"'/'   elasticsearch.yml

echo -e '\n export ES_HOME=${INSTALL_PATH}/elasticsearch \n export PATH=\${ES_HOME}/bin:\$PATH'>> /etc/profile
source /etc/profile

echo 'vm.max_map_count = 262144' >>/etc/sysctl.conf
sysctl -p
echo '${username}        hard  nofile   65536' >>/etc/security/limits.conf
echo '${username}        soft  nofile   65536' >>/etc/security/limits.conf
echo '${username}        hard  nproc    4096' >>/etc/security/limits.conf
echo '${username}        soft  nproc    4096' >>/etc/security/limits.conf
exit
CONFIG_EOF
done
  echo "修改配置文件成功"
}


add_user
create_keygen
sycn_keygen
install_es
config_es
sync_cfg

猜你喜欢

转载自blog.csdn.net/F1004145107/article/details/106281433