1、根据需求,快速部署一些常用的组件。
-
安装jdk,版本:1.8.0_131
-
安装python,版本:2.7.8
-
安装mysql,版本:5.6.39
-
安装neo4j,版本:3.1.4
-
安装postgresql,版本:9.6.3
-
安装node.js,版本:8.9.0
-
安装nginx,版本:1.14.0
-
安装elasticsearch,版本:5.2.2
-
安装es-head
host_name=(
wyl01
wyl02
wyl03
)
host_ip=(
10.10.252.151
10.10.252.112
10.10.252.127
)
#存放二进制包的路径
SOFTWARE_PATH='/opt/software'
#java部分信息
JDK_VERSION='jdk1.8.0_131' #jdk的版本
JDK_INSTALL_PATH='/opt' #jdk的安装路径
#java部分信息
PYTHON_VERSION='python-2.7.8' #python的版本
PYTHON_INSTALL_PATH='/opt' #python的安装路径
#mysql部分信息
MYSQL_VERSION='mysql-5.6.39-linux-glibc2.12-x86_64' #mysql安装包名
MYSQL_INSTALL_PATH='/usr/local' #mysql安装的位置
#neo4j部分信息
NEO4J_VERSION='neo4j-community-3.1.4' #neo4j的版本,注意这里不.tar.gz
NEO4J_INSTALL_PATH='/opt' #noe4j的安装路径
#postgresql部分信息
POSTGRESQL_VERSION='postgresql-9.6.3' #postgresql安装包名
POSTGRESQL_INSTALL_PATH='/opt/postgresql' #postgresql安装的位置
#node.js部分信息,jdk要求1.8以上
NODE_VERSION='node-v8.9.0-linux-x64' #ndoe.js安装包名
NODE_INSTALL_PATH='/opt' #node.js安装的位置
#nginx的部分信息
NGINX_VERSION='nginx-1.14.0' #nginx的版本
NGINX_INSTALL_PATH='/usr/local' #nnginx的安装路径
#es的部分信息
ES_HEAD_VERSION='elasticsearch-head' #es-head的版本
ES_HEAD_INSTALL_PATH='/opt' #es-head的安装路径
#1 步骤输出 紫色
#2 正确输出 绿色
#3 错误输出 红色
#4 提示输出 蓝色
#5 警告输出 黄色
#根据不同的颜色打印出提示信息
function echo_fun(){
if [ $# -ge 2 ];then
params_num=$1
shift 1
params_mes=$@
else
echo_fun 3 请至少输入两个参数 echo_fun ..
exit
fi
case $params_num in
1)
echo -e "\n\033[35;40;1m ****************************** ${params_mes} ******************************\033[0m\r\n"
;;
2)
echo -e "\033[32;40;1m ${params_mes}\033[0m\r\n"
;;
3)
echo -e "\n\033[31;40;1m ${params_mes}\033[0m\r\n"
;;
4)
echo -e "\033[36;40;1m ${params_mes}\033[0m\r\n"
;;
5)
echo -e "\033[33;40;1m ${params_mes} \033[0m\r\n"
;;
*)
echo_fun 3 参数异常第一个参数应为1,2,3,4,5
;;
esac
}
install_list=(
1.安装jdk,版本:1.8.0_131
2.安装python,版本:2.7.8
3.安装mysql,版本:5.6.39
4.安装neo4j,版本:3.1.4
5.安装postgresql,版本:9.6.3
6.安装node.js,版本:8.9.0
7.安装nginx,版本:1.14.0
8.安装elasticsearch,版本:5.2.2
9.安装es-head
)
function check_ok(){
if [ $? -ne 0 ];then
echo_fun 3 执行失败,请查看日志
exit 1
fi
}
function echo_list(){
echo_fun 1 安装目录如下,请选择安装步骤1-9
for (( i=0;i<${#install_list[@]};i++ ))
do
echo_fun 4 ${install_list[i]}
done
}
function adduser(){
useradd -d /home/$1 $1
expect -c"
spawn passwd $1
expect {
\"*yes/no*\" {send \"yes\r\";exp_continue}
\"*New password:*\" {send \"$2\r\";exp_continue}
\"*Retype new password:*\" {send \"$2\r\";exp_continue}
}"
}
function add_cluster_user(){
for ((i=0;i<${#host_name[*]};i++))
do
echo_fun 4 ${host_name[i]}机器添加用户,并设置密码
ssh -Tq ${host_name[i]} <<remotessh
useradd -d /home/$1 $1
expect -c"
spawn passwd $1
expect {
\"*yes/no*\" {send \"yes\r\";exp_continue}
\"*New password:*\" {send \"$2\r\";exp_continue}
\"*Retype new password:*\" {send \"$2\r\";exp_continue}
}"
exit
remotessh
echo -e "\n"
done
}
function check_exist_user(){
num_user=`cat /etc/passwd|grep -w $1|wc -l`
if [ ${num_user} -eq 1 ];then
echo_fun 2 该机器已经创建了$1用户,无需再创建,继续下一步
num_user=`echo 1`
else
echo_fun 4 创建$1用户
num_user=`echo 0`
fi
}
function check_cluster_exist_user(){
for ip in ${host_name[*]}
do
echo_fun 5 检查$ip机器上的$1用户是否存在
cluster_num_user=$(ssh $ip cat /etc/passwd|grep -w $1|wc -l )
if [ ${cluster_num_user} -eq 1 ];then
echo_fun 2 $ip机器已经创建了$1用户,无需再创建,继续下一步
cluster_user_num=`echo 1`
else
echo_fun 4 $ip机器上的$1用户不存在,需要创建
cluster_user_num=`echo 0`
fi
done
}
function check_catalog_exist(){
test -d $1 && echo_fun 5 $1的安装目录已经存在,请检查 && exit
}
function check_cluster_catalog_exist(){
for ip in ${host_name[*]}
do
num=$(ssh $ip test -d $1 && echo 1 || echo 0 )
if [ $num -eq 1 ];then
echo_fun 3 "$ip机器上的$2目录存在,请注意检查"
exit
fi
done
}
function check_package(){
package_num=`rpm -qa|grep $1|wc -l `
if [ $package_num -lt 1 ];then
echo_fun 5 缺少$1的依赖包,安装依赖
yum install -y $1
check_ok
fi
}
function check_cluster_package(){
for ip in ${host_name[*]}
do
cluster_package_num=$(ssh $ip rpm -qa|grep $1|wc -l )
if [ ${cluster_package_num} -ge 1 ];then
echo_fun 2 "$ip机器上的$1组件存在,继续下一步"
else
echo_fun 5 缺少$1的依赖包,安装依赖
ssh $ip "yum install -y $1"
check_ok
fi
done
}
#检查环境变量---单台
function check_etc_profile(){
echo_fun 4 配置环境变量
#检查环境变量中是否已经配置了
path_num=`cat /etc/profile |grep -w $1 |wc -l `
if [ ${path_num} -ge 1 ];then
echo_fun 5 该机器环境变量中已经配置,请检查准确性
#回滚,删除之前的软连接和安装包
rm -rf $1
rm -rf $2
exit
fi
}
#检查环境变量--多台
function check_cluster_etc_profile(){
for ip in ${host_name[*]}
do
#检查环境变量中是否已经配置了
cluster_path_num=$(ssh $ip cat /etc/profile |grep -w $1 |wc -l )
if [ ${cluster_path_num} -ge 1 ];then
echo_fun 5 $ip机器上环境变量中已经配置,请检查准确性
exit
fi
done
}
# ------------------------------------------------第一步----------------------------------------------------
#解压jdk的二进制包,并设置软连接,和改变其属组属性。
function extract_jdk(){
cd $SOFTWARE_PATH
sleep 1s
echo_fun 4 解压jdk二进制包,并创建软连接
tar -xf ${JDK_VERSION}.tar.gz -C ${JDK_INSTALL_PATH}
ln -s ${JDK_INSTALL_PATH}/${JDK_VERSION} ${JDK_INSTALL_PATH}/java
}
#同步jdk安装包和软连接到其他的集群机器上
function rsync_jdk(){
echo_fun 4 同步jdk目录和软连接到其他的集群机器上
sleep 1s
cd ${JDK_INSTALL_PATH}
for ((i=1;i<${#host_name[*]};i++))
do
rsync -av java ${JDK_VERSION} ${host_name[i]}:/opt >/dev/null 2>&1
done
check_ok
echo_fun 2 同步成功
}
#安装jdk
function step_fun_1(){
echo_fun 4 检查java安装目录是否存在
#循环检查/opt/java目录是否存在
check_cluster_catalog_exist ${JDK_INSTALL_PATH}/java java
if [ $num -eq 0 ];then
#解压jdk包
extract_jdk
#同步
rsync_jdk
fi
echo_fun 4 检查环境变量
check_cluster_etc_profile ${JDK_INSTALL_PATH}/java ${JDK_INSTALL_PATH}/${JDK_VERSION}
if [ ${cluster_path_num} -lt 1 ];then
echo_fun 4 配置环境变量
for ((i=0;i<${#host_name[*]};i++))
do
echo_fun 4 配置${host_name[i]}机器上的环境变量
ssh -Tq root@${host_name[i]} <<remotessh
echo -e '\nexport JAVA_HOME=${JDK_INSTALL_PATH}/java\nexport PATH=\${JAVA_HOME}/bin:\$PATH'>> /etc/profile
source /etc/profile
exit
remotessh
done
fi
}
#--------------------------------------------------第二步----------------------------------------------------
#解压python的二进制包,并设置软连接,和改变其属组属性。
function extract_python(){
cd $SOFTWARE_PATH
sleep 1s
echo_fun 4 解压python二进制包,并创建软连接
tar -xf ${PYTHON_VERSION}.tar.gz -C ${PYTHON_INSTALL_PATH}
ln -s ${PYTHON_INSTALL_PATH}/${PYTHON_VERSION} ${PYTHON_INSTALL_PATH}/python
}
#同步python安装包和软连接到其他的集群机器上
function rsync_python(){
echo_fun 4 同步jdk目录和软连接到其他的集群机器上
sleep 1s
cd ${JDK_INSTALL_PATH}
for ((i=1;i<${#host_name[*]};i++))
do
rsync -av python ${PYTHON_VERSION} ${host_name[i]}:/opt >/dev/null 2>&1
done
check_ok
echo_fun 2 同步成功
}
function step_fun_2(){
echo_fun 4 检查python安装目录是否存在
#循环检查/opt/python目录是否存在
check_cluster_catalog_exist ${PYTHON_INSTALL_PATH}/python python
if [ $num -eq 0 ];then
#解压python包
extract_python
#同步python
rsync_python
fi
echo_fun 4 检查环境变量
check_cluster_etc_profile ${PYTHON_INSTALL_PATH}/python
if [ ${cluster_path_num} -lt 1 ];then
echo_fun 4 配置环境变量
for ((i=0;i<${#host_name[*]};i++))
do
echo_fun 4 配置${host_name[i]}机器上的环境变量
ssh -Tq root@${host_name[i]} <<remotessh
echo -e '\nexport PYTHON_HOME=${PYTHON_INSTALL_PATH}/python\nexport PATH=\${PYTHON_HOME}/bin:\$PATH'>> /etc/profile
source /etc/profile
exit
remotessh
done
fi
}
#----------------------------------------------------第三步------------------------------------------------------
#初始化mysql
function extract_init_mysql(){
cd $SOFTWARE_PATH
echo_fun 4 解压mysql,并创建软连接
tar -xf ${MYSQL_VERSION}.tar.gz -C ${MYSQL_INSTALL_PATH}
ln -s ${MYSQL_INSTALL_PATH}/${MYSQL_VERSION} ${MYSQL_INSTALL_PATH}/mysql
check_ok
chown -R mysql:mysql ${MYSQL_INSTALL_PATH}/mysql*
echo_fun 4 初始化mysql
cd ${MYSQL_INSTALL_PATH}/mysql
cp support-files/my-default.cnf /etc/my.cnf
cp support-files/mysql.server /etc/init.d/mysql.server
scripts/mysql_install_db --user=mysql
check_ok
}
#启动mysql
function start_mysql(){
if [ $RELEASE = '6' ];then
service mysql.server start
check_ok
elif [ $RELEASE = '7'];then
systemctl start mysql.server
fi
mysql_pid_num=`ps -ef |grep mysqld|grep -v grep|wc -l`
if [ $mysql_pid_num -ge 2 ];then
echo_fun 2 安装成功,并已经启动mysql服务
else
echo_fun 3 安装失败
fi
}
#初始化mysql的root用户密码
function init_mysql_passwd(){
echo_fun 4 初始化mysql的root用户密码
mysql -uroot << EOF
set password = password("baifendian");
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'baifendian';
GRANT ALL PRIVILEGES ON *.* TO 'root'@localhost IDENTIFIED BY 'baifendian';
flush privileges;
EOF
}
#安装mysqll
function step_fun_3(){
#获取操作系统的版本号
RELEASE=`lsb_release -a |grep Release |awk '{print $2}'|awk -F '.' '{print $1}'`
#检查/usr/local目录下有没有mysql目录
echo_fun 4 检查mysql安装目录是否存在
check_catalog_exist ${MYSQL_INSTALL_PATH}/mysql
echo_fun 4 检查是否存在mysql用户
check_exist_user mysql
if [ $num_user -eq 0 ]; then
echo_fun 4 给mysql用户输入密码
read -p "password=" mysql_password
adduser mysql ${mysql_password}
fi
extract_init_mysql
echo_fun 4 检查环境变量
check_etc_profile ${MYSQL_INSTALL_PATH}/mysql ${MYSQL_INSTALL_PATH}/${MYSQL_VERSION}
#配置环境变量
if [ ${path_num} -lt 1 ];then
echo -e '\nexport MYSQL_HOME='${MYSQL_INSTALL_PATH}'/mysql\nexport PATH=${MYSQL_HOME}/bin:$PATH'>> /etc/profile
source /etc/profile
fi
check_ok
start_mysql
#设置开机自启动
echo_fun 4 设置开机自启动
chkconfig mysql.server on
check_ok
init_mysql_passwd
}
#------------------------------------------------第四步-----------------------------------------------------------
#解压neo4j的二进制包,并设置软连接,和改变其属组属性。
function extract_neo4j(){
cd $SOFTWARE_PATH
echo_fun 4 解压neo4j二进制包,并创建软连接
tar -xf ${NEO4J_VERSION}-unix.tar.gz -C ${NEO4J_INSTALL_PATH}
check_ok
ln -s ${NEO4J_INSTALL_PATH}/${NEO4J_VERSION} ${NEO4J_INSTALL_PATH}/neo4j
cd ${NEO4J_INSTALL_PATH}
chown -R $1:$1 ${NEO4J_INSTALL_PATH}/neo4j*
sleep 1s
}
function alter_neo4j_config(){
echo_fun 4 修改neo4j配置文件内容
sleep 1s
cd /${NEO4J_INSTALL_PATH}/neo4j/conf/
sed -i '/#dbms.directories.data/s/^#//' neo4j.conf
sed -i '/#dbms.directories.plugins/s/^#//' neo4j.conf
sed -i '/#dbms.directories.certificates/s/^#//' neo4j.conf
sed -i '/#dbms.directories.logs/s/^#//' neo4j.conf
sed -i '/#dbms.directories.lib/s/^#//' neo4j.conf
sed -i '/#dbms.directories.run/s/^#//' neo4j.conf
sed -i '/#dbms.connectors.default_listen_address/s/^#//' neo4j.conf
sed -i '/#dbms.connector.bolt.tls_leve/s/^#//' neo4j.conf
sed -i 's/#dbms.connector.bolt.listen_address=:7687/dbms.connector.bolt.listen_address='"${host_ip[0]}"':7687/g' neo4j.conf
sed -i 's/#dbms.connector.http.listen_address=:7474/dbms.connector.http.listen_address='"${host_ip[0]}"':7474/g' neo4j.conf
sed -i 's/#dbms.connector.https.listen_address=:7473/dbms.connector.https.listen_address='"${host_ip[0]}"':7473/g' neo4j.conf
sed -i '/#dbms.security.allow_csv_import_from_file_urls=true/s/^#//' neo4j.conf
sed -i '/#dbms.shell.enabled/s/^#//' neo4j.conf
sed -i 's/#dbms.shell.host=127.0.0.1/dbms.shell.host='"${host_ip[0]}"'/g' neo4j.conf
sed -i '/#dbms.shell.port=1337/s/^#//' neo4j.conf
}
function start_neo4j(){
echo_fun 4 启动neo4j进程
su - ${NEO4J_USER} <<EOF
cd /opt/neo4j
nohup ./bin/neo4j start >/home/${NEO4J_USER}/neo4j.log 2>&1
EOF
}
function step_fun_4(){
echo_fun 4 检查neo4j安装目录是否存在
check_catalog_exist ${NEO4J_INSTALL_PATH}/${NEO4J_VERSION}
echo_fun 5 请输入neo4j的属组用户
read -p "neo4j_user=" neo4j_user
check_exist_user ${neo4j_user}
if [ $num_user -eq 0 ]; then
echo_fun 4 给neo4j用户输入密码
read -p "neo4j_password=" neo4j_passwd
adduser ${neo4j_user} ${neo4j_passwd}
fi
#解压,设置软连接
extract_neo4j ${neo4j_user}
#修改配置文件
alter_neo4j_config
#检查环境变量
echo_fun 4 检查环境变量
check_etc_profile ${NEO4J_INSTALL_PATH}/neo4j ${NEO4J_INSTALL_PATH}/${NEO4J_VERSION}
#配置环境变量
if [ ${path_num} -lt 1 ];then
echo -e '\nexport NEO4J_HOME='${NEO4J_INSTALL_PATH}'/neo4j\nexport PATH=${NEO4J_HOME}/bin:$PATH'>> /etc/profile
source /etc/profile
fi
#启动neo4j
start_neo4j
neo4j_pid_num=`ps -ef |grep neo4j|grep -v grep|wc -l`
if [ ${neo4j_pid_num} -eq 1 ];then
echo_fun 2 neo4j has started....
echo_fun 2 在浏览器输入${host_ip[0]}:7474
else
echo_fun 3 启动失败,请查看错误日志信息/home/${NEO4J_USER}/neo4j.log
fi
}
#-------------------------------------------------------第五步--------------------------------------------------
#postgresql源码解压编译
function config_psql(){
echo_fun 4 编译安装,等待时间较长. . .
cd $SOFTWARE_PATH
tar -xf ${POSTGRESQL_VERSION}.tar.gz
cd ${POSTGRESQL_VERSION}
#检查并解决依赖
check_package readline-devel
check_package zlib-devel
#编译
./configure --prefix=${POSTGRESQL_INSTALL_PATH}
sleep 10s
make && make install
check_ok
}
function step_fun_5(){
echo_fun 4 检查postgresql目录是否存在
check_catalog_exist ${POSTGRESQL_INSTALL_PATH}
#解压,编译
config_psql
#创建用户,用来启动postgresql
echo_fun 5 建议创建一个[postgres]用户,用来启动postgresql
read -p "psql_user=" psql_user
check_exist_user $psql_user
if [ ${num_user} -eq 0 ]; then
echo_fun 5 给postgresql用户输入密码
read -p "psql_passwd=" psql_passwd
adduser $psql_user $psql_passwd
fi
cd ${POSTGRESQL_INSTALL_PATH}/../
chown -R ${psql_user}:${psql_user} ${POSTGRESQL_INSTALL_PATH}
#配置环境变量和指定PGDATA位置
echo_fun 4 配置环境变量和指定PGDATA位置
check_etc_profile ${POSTGRESQL_INSTALL_PATH}
if [ ${path_num} -lt 1 ];then
echo -e '\nexport POSTGRESQL_HOME='${POSTGRESQL_INSTALL_PATH}'\nexport PATH=${POSTGRESQL_HOME}/bin:$PATH\nexport PGDATA='${POSTGRESQL_INSTALL_PATH}'/data\n'>> /etc/profile
source /etc/profile
fi
#初始化postgresql数据库
echo_fun 4 初始化postgresql数据库
su - ${psql_user} <<EOF
initdb
sleep 10s
EOF
#修改postgresql的配置文件
echo_fun 4 修改postgresql的配置文件
cd ${POSTGRESQL_INSTALL_PATH}/data
sed -i 's/127.0.0.1\/32 trust/0.0.0.0\/0 md5/g' pg_hba.conf
sed -i "s/#listen_addresses = 'localhost'/listen_addresses = '*'/g" postgresql.conf
sed -i 's/#port = 5432/port = 5432/g' postgresql.conf
check_ok
#启动postgresql
echo_fun 4 启动postgresql
su - ${psql_user} <<EOF
pg_ctl -D ${POSTGRESQL_INSTALL_PATH}/data -l logfile start
EOF
#检查postgresql启动进程
psql_pid_num=`ps -ef |grep ${POSTGRESQL_INSTALL_PATH}/data|grep -v grep|wc -l`
if [ ${psql_pid_num} -eq 1 ];then
echo_fun 2 安装成功,并已经启动postgresql服务
else
echo_fun 3 安装失败
fi
}
#---------------------------------------------------------第六步------------------------------------------------
#安装node.js
function step_fun_6(){
cd $SOFTWARE_PATH
#解压,设置软连接
check_catalog_exist ${NODE_INSTALL_PATH}/node
tar -xf ${NODE_VERSION}.tar.gz -C ${NODE_INSTALL_PATH}
check_ok
ln -s ${NODE_INSTALL_PATH}/${NODE_VERSION} ${NODE_INSTALL_PATH}/node
#配置环境变量
check_etc_profile ${NODE_INSTALL_PATH}/node ${NODE_INSTALL_PATH}/${NODE_VERSION}
if [ ${path_num} -lt 1 ];then
echo -e '\nexport NODE_HOME='${NODE_INSTALL_PATH}'/node\nexport PATH=${NODE_HOME}/bin:$PATH'>> /etc/profile
source /etc/profile
fi
echo_fun 4 检查node版本
echo_fun 5 'node.js的版本号为:'`node -v`
if [ $? -eq 0 ];then
echo_fun 2 node.js安装成功
fi
}
#----------------------------------------------------------第七步-----------------------------------------------
#解压ngxin的二进制包。
function extract_nginx(){
cd ${SOFTWARE_PATH}
echo_fun 4 解压nginx二进制包,并创建软连接
tar -xf ${NGINX_VERSION}.tar.gz
cd ${NGINX_VERSION}
./configure --prefix=./configure --prefix=${NGINX_INSTALL_PATH}/nginx --user=nginx --group=nginx --error-log-path=/usr/local/nginx/error.log --pid-path=/usr/local/nginx/nginx.pid --http-log-path=/usr/local/nginx/access.log --with-debug
check_ok
make && make install
check_ok
}
function start_nginx(){
echo_fun 4 启动nginx
cd ${NGINX_INSTALL_PATH}/nginx
nohup nginx >/home/${NGINX_USER}/nginx.log 2>&1
sleep 15s
nginx_pid_num=`ps -ef|grep nginx|grep -v grep|wc -l`
if [ ${nginx_pid_num} -ge 1 ];then
echo_fun 2 nginx has started....
fi
}
#nginx的部署
function step_fun_7(){
#检查nginx安装目录
check_catalog_exist ${NGINX_INSTALL_PATH}/nginx
#解压nginx
extract_nginx
echo_fun 5 请创建nginx的work进程启动用户[nginx]
read -p "nginx_user=" nginx_user
check_exist_user ${nginx_user}
if [ ${num_user} -eq 0 ]; then
echo_fun 5 给${nginx_user}用户输入密码
read -p "nginx_passwd=" nginx_passwd
adduser $nginx_user $nginx_passwd
fi
check_package openssl-devel
check_package pcre-devel
check_package zlib-devel
check_package gcc
check_etc_profile ${NGINX_INSTALL_PATH}/nginx
if [ ${path_num} -lt 1 ];then
echo -e '\nexport NGINX_HOME='${NGINX_INSTALL_PATH}'/nginx\nexport PATH=${NGINX_HOME}/sbin:$PATH'>> /etc/profile
source /etc/profile
fi
#启动nginx
start_nginx
}
#---------------------------------------------------------第八步----------------------------------------------------
ES_VERSION='elasticsearch-5.2.2' #es的版本,注意这里不.tar.gz
ES_INSTALL_PATH='/opt' #es的安装路径
data_path='\/opt\/elasticsearch\/data' #es的数据存放路径
logs_path='\/opt\/elasticsearch\/log' #es日志存放路径
#解压es的二进制包,并设置软连接,和改变其属组属性。
function extract_es(){
cd $SOFTWARE_PATH
sleep 1s
echo_fun 4 解压es二进制包,并创建软连接
tar -xf ${ES_VERSION}.tar.gz -C ${ES_INSTALL_PATH}
ln -s ${ES_INSTALL_PATH}/${ES_VERSION} ${ES_INSTALL_PATH}/elasticsearch
cd ${ES_INSTALL_PATH}
chown -R $1:$1 ${ES_INSTALL_PATH}/elasticsearch*
sleep 1s
}
#定义修改es配置文件
function alter_es_config(){
echo_fun 4 修改es配置文件内容
sleep 1s
cd ${ES_INSTALL_PATH}/elasticsearch/config
data_path='\/opt\/elasticsearch\/data'
logs_path='\/opt\/elasticsearch\/log'
sed -i 's/#cluster.name: my-application/cluster.name: '"${cluster_name}"'/g' elasticsearch.yml
sed -i 's/#node.name: node-1/node.name: '"${host_name[0]}"'/g' elasticsearch.yml
sed -i 's/#path.data: \/path\/to\/data/path.data: '"${data_path}"'/g' elasticsearch.yml
sed -i 's/#path.logs: \/path\/to\/logs/path.logs: '"${logs_path}"'/g' elasticsearch.yml
sed -i 's/#network.host: 192.168.0.1/network.host: '"${host_ip[0]}"'/g' elasticsearch.yml
sed -i '/#http.port: 9200/a\transport.tcp.port: 9300' elasticsearch.yml
sed -i 's/#http.port: 9200/http.port: 9200/g' elasticsearch.yml
sed -i 's/\["host1", "host2"\]//' elasticsearch.yml
sed -i 's/#discovery.zen.ping.unicast.hosts:/discovery.zen.ping.unicast.hosts:/g' elasticsearch.yml
for ((i=${#host_name[*]};i>0;i--))
do
sed -i '/discovery.zen.ping.unicast.hosts/a\ - '"${host_name[i-1]}"':9300' elasticsearch.yml
done
sed -i 's/#discovery.zen.minimum_master_nodes: 3/discovery.zen.minimum_master_nodes: 1/g' elasticsearch.yml
sed -i '/#action.destructive_requires_name/a\bootstrap.system_call_filter: false' elasticsearch.yml
sed -i '/#action.destructive_requires_name/a\http.cors.allow-origin: "*"' elasticsearch.yml
sed -i '/#action.destructive_requires_name/a\http.cors.enabled: true' elasticsearch.yml
sed -i '/#action.destructive_requires_name/a\node.data: true' elasticsearch.yml
sed -i '/#action.destructive_requires_name/a\node.master: true' elasticsearch.yml
}
#同步es安装包和软连接到其他的集群机器上并修改配置内容
function rsync_tar(){
echo_fun 4 同步es安装包和软连接到其他的集群机器上并修改配置内容
sleep 1s
cd ${ES_INSTALL_PATH}
for ((i=1;i<${#host_name[*]};i++))
do
rsync -av elasticsearch ${ES_VERSION} ${host_name[i]}:/opt >/dev/null 2>&1
check_ok
ssh -Tq ${host_name[i]} <<remotessh
cd ${ES_INSTALL_PATH}/elasticsearch/config
sed -i 's/node.name: '"${host_name[0]}"'/node.name: '"${host_name[i]}"'/g' elasticsearch.yml
sed -i 's/network.host: '"${host_ip[0]}"'/network.host: '"${host_ip[i]}"'/g' elasticsearch.yml
sed -i 's/node.master: true/node.master: false/g' elasticsearch.yml
exit
remotessh
done
echo_fun 2 修改成功
}
#配置环境变量
function etc_es_profile(){
for ((i=0;i<${#host_name[*]};i++))
do
echo_fun 4 配置${host_name[i]}机器上的环境变量
done
}
function max_map_config(){
echo_fun 5 检查vm.max_map_count的值
for ip in ${host_name[*]}
do
#获取是否存在vm.overcommit_memory的记录
max_map=$(ssh $ip cat /etc/sysctl.conf | grep vm.max_map_count | wc -l )
#获取是否存在vm.overcommit_memory的记录的value值为多少
max_map_count=$(ssh $ip cat /etc/sysctl.conf | grep vm.max_map_count |awk '{print $3}' )
if [ ${max_map} -eq 1 ];then
if [ ${max_map_count} -ge 262144 ]; then
echo_fun 2 $ip机器上存在vm.max_map_count,且值大于等于262144
sysctl -p
else
#修改value值为262144
echo_fun 3 $ip机器上存在vm.overcommit_memory,且值小于262144,需要修改
#注意这里1262144第一个1不是数字概念
ssh $ip "sed -i 's/\(vm.max_map_count = \)\S*/\1262144/' /etc/sysctl.conf"
echo_fun 2 修改成功
sysctl -p
fi
else
echo_fun 4 $ip机器上不存在vm.max_map_count,需要添加
ssh $ip "echo 'vm.max_map_count = 262144' >> /etc/sysctl.conf"
echo_fun 2 添加成功
sysctl -p
fi
done
}
#这里根据用户,软硬件,进程,文件等不太好判断,
#所以直接判断有没有这个用户的记录,如果没有就添加,有就手动去检查
function limits_config(){
for ip in ${host_name[*]}
do
#根据用户来获取,一般是4行,如下
# hadoop hard nproc 102400
# hadoop soft nproc 102400
# hadoop hard nofile 102400
# hadoop soft nofile 102400
nofile_nproc_num=$(ssh $ip cat /etc/security/limits.conf|grep -w $1 |wc -l)
if [ ${nofile_nproc_num} -ge 4 ];then
echo_fun 2 $ip机器已经设置了打开最大进程数和文件数
else
echo_fun 3 $ip机器未设置,进行设置
ssh $ip "echo '$1 hard nproc 102400' >>/etc/security/limits.conf;echo '$1 soft nproc 102400' >>/etc/security/limits.conf;echo '$1 hard nofile 102400' >>/etc/security/limits.conf;echo '$1 soft nofile 102400' >>/etc/security/limits.conf"
if [ $? -eq 0 ];then
echo_fun 2 设置成功
fi
fi
done
}
function start_es(){
for ((i=0;i<${#host_name[*]};i++))
do
ssh -Tq root@${host_name[i]} <<remotessh
su - hadoop <<EOF
cd ${ES_INSTALL_PATH}/elasticsearch
nohup ./bin/elasticsearch -d &
if [ $? -eq 0 ];then
echo -e "\033[32;40;1m ${host_name[i]}机器上的 es has started....\033[0m\r\n"
fi
EOF
exit
remotessh
done
}
function step_fun_8(){
#检查目录是否存在
echo_fun 4 检查es安装目录是否存在
check_cluster_catalog_exist $ES_INSTALL_PATH/elasticsearch elasticsearch
echo_fun 5 请输入ES的属组及启动用户
read -p "es_user=" es_user
check_cluster_exist_user ${es_user}
if [ $cluster_user_num -eq 0 ]; then
echo_fun 5 给${nginx_user}用户输入密码
read -p "es_passwd=" es_passwd
add_cluster_user ${es_user} ${es_passwd}
fi
extract_es ${es_user}
echo_fun 5 '请输入es集群名字'
read -p "cluster_name=" cluster_name
alter_es_config ${cluster_name}
rsync_tar
#配置环境变量
check_cluster_etc_profile ${ES_INSTALL_PATH}/elasticsearch ${ES_INSTALL_PATH}/${ES_VERSION}
if [ ${cluster_path_num} -lt 1 ];then
for (( i = 0; i < ${#host_name[*]}; i++ )); do
ssh -Tq root@${host_name[i]} <<remotessh
echo -e "\033[33;40;1m 配置${host_name[i]}机器上环境变量 \033[0m\r\n"
echo -e '\nexport ES_HOME=${ES_INSTALL_PATH}/elasticsearch\nexport PATH=\${ES_HOME}/bin:\$PATH'>> /etc/profile
source /etc/profile
exit
remotessh
done
fi
#修改系vm_max_map的值,以及打开最大文件数和进程数
max_map_config
limits_config ${es_user}
start_es
}
#--------------------------------------------------第九步----------------------------------------------------
#解压es-head的二进制包。
function extract_es_head(){
cd $SOFTWARE_PATH
sleep 1s
echo_fun 4 解压es-head二进制包,并修改配置文件
tar -xf ${ES_HEAD_VERSION}.tar.gz -C ${ES_HEAD_INSTALL_PATH}
check_ok
cd ${ES_HEAD_INSTALL_PATH}/elasticsearch-head
sed -i 's/localhost/'"${host_ip[0]}"'/g' Gruntfile.js
sed -i 's/localhost/'"${host_ip[0]}"'/g' src/app/app.js
sed -i 's/localhost/'"${host_ip[0]}"'/g' _site/app.js
}
function start_es_head(){
echo_fun 4 启动es-head插件
nohup /opt/elasticsearch-head/node_modules/grunt/bin/grunt server >/dev/null 2>&1
num=`ps -ef |grep -w grunt |grep -v grep|wc -l`
if [[ $num -eq 1 ]];then
echo_fun 2 es-head has started....
fi
}
function step_fun_9(){
#检查目录是否存在
echo_fun 4 检查es-head安装目录是否存在
check_catalog_exist ${ES_HEAD_INSTALL_PATH}/${ES_HEAD_VERSION}
#解压并修改配置文件
extract_es_head
#启动
start_es_head
}
function yn_install(){
read -p "选择安装项[1-9]: " num
case $num in
1)
echo_fun 1 ${install_list[0]}
step_fun_1
;;
2)
echo_fun 1 ${install_list[1]}
step_fun_2
;;
3)
echo_fun 1 ${install_list[2]}
step_fun_3
;;
4)
echo_fun 1 ${install_list[3]}
step_fun_4
;;
5)
echo_fun 1 ${install_list[4]}
step_fun_5
;;
6)
echo_fun 1 ${install_list[5]}
step_fun_6
;;
7)
echo_fun 1 ${install_list[6]}
step_fun_7
;;
8)
echo_fun 1 ${install_list[7]}
step_fun_8
;;
9)
echo_fun 1 ${install_list[8]}
step_fun_9
;;
*)
echo_fun 3 数字应该在1-9之间
exit
;;
esac
}
yn='y'
while [ "$yn" == "y" ];do
echo_list
yn_install
read -p '是否继续安装[y/n]:' yn
done
执行的结果如下:
安装之前会检查是否之前有过安装,和配置过环境变量。如果出现上述2种情况,则程序终止,需要手动检查。
正确安装结果如下: