在日常運維中,我們通常會利用shell的"function函數+if邏輯判斷+case選擇語句"來實現中間件服務一鍵部署或一鍵啟停。下面分享幾個常用運維的一鍵腳本:
一、Tomcat一鍵啟停服務腳本 [如有多個tomcat實例,就在/etc/init.d/下配置多個針對每個tomcat端口的啟停腳本。下面為tomcat_8080腳本文件]
#!/bin/bash #chkconfig: 345 99 10 #description: Auto-starts tomcat # /etc/init.d/tomcatd # Tomcat auto-start # Source function library. source /etc/init.d/functions # source networking configuration. #. /etc/sysconfig/network RETVAL=0 project_tomcat=tomcat_8080 #這里的tomcat采用結尾以端口號方式命令。即tomcat_port #如果本機由多個tomcat示例,則這種結尾以端口號命名的方式比較好, #執行"echo $JAVA_HOME"可以查看到本機JAVA主目錄路徑 export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.232.b09-0.el7_7.x86_64/ export CATALINA_HOME=/usr/local/${project_tomcat} #export CATALINA_BASE=/usr/local/${project_tomcat} #(centos7系統)重新加載服務配置文件。只有當該腳本被修改的時候需要執行該項,可以不配置。 systemctl daemon-reload #TOMCATUSER=tomcat start() { if [ -f ${CATALINA_HOME}/bin/startup.sh ]; then echo $"Starting Tomcat" #這里tomcat使用root啟動的,如果不是root用戶啟動的,這里就修改下用戶。 if [ root = `whoami` ]; then ${CATALINA_HOME}/bin/startup.sh else su - root -c "${CATALINA_HOME}/bin/startup.sh" fi RETVAL=$? echo " OK" return ${RETVAL} fi } stop() { if [ -f ${CATALINA_HOME}/bin/shutdown.sh ]; then echo $"Stopping Tomcat" ${CATALINA_HOME}/bin/shutdown.sh RETVAL=$? sleep 1 #ps -ef|grep $project_tomcat|egrep -v 'grep|init'|awk '{print$2}'|xargs kill -9 #egrep -v "grep|init" 的過濾效果等同於 grep -v "grep\|init" ps -ef|grep ${project_tomcat}|egrep -v 'grep|init' | grep ${CATALINA_HOME}|awk '{print $2}'|xargs kill -9 #下面可根據自己tomcat日志的實際路徑進行更改 mv ${CATALINA_HOME}/logs/catalina.out ${CATALINA_HOME}/logs/catalina.out_`date '+%Y%m%d_%H_%M_%S'` find ${CATALINA_HOME}/logs/ -mtime +10 -exec rm -rf {} \; echo " OK" # [ $RETVAL -eq 0 ] && rm -f /var/lock/... return ${RETVAL} fi } status() { #這里tomcat實例名結尾是以端口號命名的。如果實例名中沒有顯示端口號,則取tomcat端口號如下: #port=$(cat ${CATALINA_HOME}/conf/server.xml |grep -w 'URIEncoding="UTF-8"'|awk '{print $2}'|cut -d"=" -f2|cut -d"\"" -f2) port=$(echo ${project_tomcat}|awk -F _ '{print$2}') #打印"lsof -i:port"結果中第二行的第二列,即是該端口所屬服務的pid pid=$(`which lsof` -i:$port|awk 'NR==2{print$2}') if [ -z $pid ] #判斷${pid}字符串是否為空串,空串為真。 then #使用下面echo方式會將打印內容標紅! echo -e "\033[40;31m${project_tomcat} is stopped\033[0m" else echo ${project_tomcat} is running fi } case "$1" in start) start ;; stop) stop ;; restart) echo $"Restaring Tomcat" stop sleep 1 start ;; status) status ;; *) echo $"Usage: $0 {start|stop|restart|status}" exit 1 ;; esac exit ${RETVAL} 執行腳本: [root@localhost ~]# /etc/init.d/tomcat_8080 Usage: /etc/init.d/tomcat_8080 {start|stop|restart|status} [root@localhost ~]# chmod 755 /etc/init.d/tomcat_8080 [root@localhost ~]# /etc/init.d/tomcat_8080 restart Restarting tomcat_8080 (via systemctl): [ OK ] [root@localhost ~]# /etc/init.d/tomcat_8080 status tomcat_8080 is running [root@localhost ~]# /etc/init.d/tomcat_8080 stop Stopping tomcat_8080 (via systemctl): [ OK ] [root@localhost ~]# /etc/init.d/tomcat_8080 status tomcat_8080 is stopped [root@localhost ~]# /etc/init.d/tomcat_8080 start Starting tomcat_8080 (via systemctl): [ OK ] [root@localhost ~]# /etc/init.d/tomcat_8080 status tomcat_8080 is running
二、Zookeeper集群環境一鍵部署腳本 [生產環境中推薦使用該腳本]
[root@bobo zookeeper]# cat install_zookeeper.sh #!/bin/bash source /etc/profile java -version if [ "$?" -ne 0 ]; then echo "JDK未安裝,請先安裝JDK" exit 1 fi while getopts "a:b:n:l:c:f:m:h" opts do case $opts in a) #APP_NAME:項目編碼 APP_NAME=$OPTARG ;; b) #MODULE_NAME:模塊名稱 MODULE_NAME=$OPTARG ;; n) #ZK_SRVNUM:ZOOKEEPER數量 ZK_SRVNUM=$OPTARG ;; l) #ZK_IPLIST:ZOOKEEPER服務器IP地址列表 ZK_IPLIST=$OPTARG ;; c) #ZKCLIENT_PORT:客戶端訪問 zookeeper 的端口號 ZKCLIENT_PORT=$OPTARG ;; f) #ZKLEADER_PORT:ZOOKEEPER的F和L通信端口號 ZKLEADER_PORT=$OPTARG ;; m) #ZKCOM_PORT:ZOOKEEPER選舉端口號 ZKCOM_PORT=$OPTARG ;; h) echo -e "OPTIONS:\n-a:項目編碼(必選)\n-b:模塊名稱(可選,默認為空)\n-n:ZooKeeper服務器數量(可選,默認為3)" echo -e "-l:ZooKeeper服務器IP地址列表(必選,IP地址以英文逗號分隔)" echo -e "-c:Client-Port(可選,默認為2181,多個端口以英文逗號分隔,且與IP地址一一對應)" echo -e "-f:ZooKeeper的F和L通信端口號(可選,默認為2888,多個端口以英文逗號分隔,且與IP地址一一對應)" echo -e "-m:ZooKeeper選舉端口號(可選,默認為3888,多個端口以英文逗號分隔,且與IP地址一一對應)" exit 1 ;; ?) echo "missing options,pls check!" exit 1 ;; esac done #可選參數賦值 ZK_SRVNUM=${ZK_SRVNUM:-3} ZKCLIENT_PORT=${ZKCLIENT_PORT:-2181} ZKLEADER_PORT=${ZKLEADER_PORT:-2888} ZKCOM_PORT=${ZKCOM_PORT:-3888} #定義公共變量 #zookeep安裝包存放位置 ZKSAVDIR="/usr/local/src/zookeeper" #zookeeper安裝包名(不帶擴展名) ZKNAME="zookeeper-3.4.8" #必選參數存在性及參數合法性判斷 #if [ -z ${APP_NAME} ]||[ -z ${MODULE_NAME} ]||[ -z ${ZK_IPLIST} ];then if [ -z ${APP_NAME} ]||[ -z ${ZK_IPLIST} ];then echo "Missing options,exit" exit 1 elif [ ${ZK_SRVNUM} -ne 1 ]&&[ ${ZK_SRVNUM} -ne 3 ]&&[ ${ZK_SRVNUM} -ne 5 ];then echo "Wrong server num,exit" exit 1 fi IPLIST_NUM=`echo ${ZK_IPLIST}|awk -F"," '{print NF}'` if [ ${ZK_SRVNUM} -ne ${IPLIST_NUM} ];then echo "IP list and server num do not match,exit" exit 1 fi APP_NAME=`echo ${APP_NAME} | tr '[A-Z]' '[a-z]'` #多個端口時判斷端口數與IP地址數量是否一致 CPORT_NUM=`echo ${ZKCLIENT_PORT}|awk -F"," '{print NF}'` LPORT_NUM=`echo ${ZKLEADER_PORT}|awk -F"," '{print NF}'` EPORT_NUM=`echo ${ZKCOM_PORT}|awk -F"," '{print NF}'` if [ ${CPORT_NUM} -gt 1 ];then if [ ${IPLIST_NUM} -ne ${CPORT_NUM} ]||[ ${IPLIST_NUM} -ne ${LPORT_NUM} ]||[ ${IPLIST_NUM} -ne ${EPORT_NUM} ];then echo "IP list and Port list number do not match,exit" exit 1 fi #獲取IP地址和端口對應關系 rm -f /home/workapp/zkinfo.cfg for ((i=1;i<=${ZK_SRVNUM};i++)); do eval IP_$i='`echo ${ZK_IPLIST}|awk -F, "{ print $"$i" }"`' eval PORT_$i='`echo ${ZKCLIENT_PORT}|awk -F, "{ print $"$i" }"`' eval LPORT_$i='`echo ${ZKLEADER_PORT}|awk -F, "{ print $"$i" }"`' eval EPORT_$i='`echo ${ZKCOM_PORT}|awk -F, "{ print $"$i" }"`' # eval echo "server.${i}=\$IP_$i:${ZKLEADER_PORT}:${ZKCOM_PORT}">>${ZKHOME}/conf/zoo.cfg # eval IPTMP=\$IP_$i eval PORTTMP=\$PORT_$i #zookeeper HOME路徑 [ -z ${MODULE_NAME} ]&&eval ZKHOME="/opt/${APP_NAME}/zookeeper_\$PORT_$i"||eval ZKHOME="/opt/${APP_NAME}/zookeeper_${MODULE_NAME}_\$PORT_$i" #zookeeper日志存儲路徑 [ -z ${MODULE_NAME} ]&&eval DATA_LOGDIR="/var/log/${APP_NAME}/zookeeper_\$PORT_$i"||eval DATA_LOGDIR="/var/log/${APP_NAME}/zookeeper_${MODULE_NAME}_\$PORT_$i" #zookeeper數據存儲路徑 DATA_DIR="${ZKHOME}/data" #生成參數列表 eval echo "$i,\$IP_$i,\$PORT_$i,\$LPORT_$i,\$EPORT_$i,${ZKHOME},${DATA_LOGDIR},${DATA_DIR}">>/home/workapp/zkinfo.cfg done cat /home/workapp/zkinfo.cfg else #zookeeper HOME路徑 [ -z ${MODULE_NAME} ]&&ZKHOME="/opt/${APP_NAME}/zookeeper"||ZKHOME="/opt/${APP_NAME}/zookeeper_${MODULE_NAME}" echo "ZKHOME is ${ZKHOME}" #zookeeper日志存儲路徑 [ -z ${MODULE_NAME} ]&&DATA_LOGDIR="/var/log/${APP_NAME}/zookeeper"||DATA_LOGDIR="/var/log/${APP_NAME}/zookeeper_${MODULE_NAME}" echo "ZK log dir is ${DATA_LOGDIR}" #zookeeper數據存儲路徑 DATA_DIR="${ZKHOME}/data" echo "ZK data dir is ${DATA_DIR}" fi #安裝日志 INSTALL_LOG="/home/workapp/zookeeperinstall.log" #打印變量值 echo "APP_NAME is ${APP_NAME}"|tee -a ${INSTALL_LOG} echo "MODULE_NAME is ${MODULE_NAME}"|tee -a ${INSTALL_LOG} echo "ZK_Server_num is ${ZK_SRVNUM}"|tee -a ${INSTALL_LOG} echo "ZK_Server IP is ${ZK_IPLIST}"|tee -a ${INSTALL_LOG} echo "ZK_Client Port is ${ZKCLIENT_PORT}"|tee -a ${INSTALL_LOG} echo "ZK_Leader Port is $ZKLEADER_PORT"|tee -a ${INSTALL_LOG} echo "ZK_COM Port is ${ZKCOM_PORT}"|tee -a ${INSTALL_LOG} #獲取本機IP地址 HOST_IP=`ip a|grep global|awk '{print $2}'|awk -F"/" '{print $1}'` echo "Local IP is ${HOST_IP}"|tee -a ${INSTALL_LOG} #安裝包MD5校驗 md5Now=`md5sum ${ZKSAVDIR}/${ZKNAME}.tar.gz|awk '{print $1}'` md5Save=`cat ${ZKSAVDIR}/${ZKNAME}.tar.gz.md5` if [ "${md5Now}" != "${md5Save}" ];then echo "MD5 check Failed!"|tee -a ${INSTALL_LOG} echo "the md5 now is ${md5Now}"|tee -a ${INSTALL_LOG} echo "the md5 saved is ${md5Save}"|tee -a ${INSTALL_LOG} exit 1 else echo "MD5 check success!"|tee -a ${INSTALL_LOG} fi #安裝zookeeper function Install_zk { echo "=================`date '+%Y%m%d %H:%M:%S'`Start Install ZooKeeper....==============="|tee -a ${INSTALL_LOG} #解壓縮安裝包至項目編碼安裝路徑 if [ ! -e /opt/${APP_NAME}/ ]; then mkdir -p /opt/${APP_NAME} fi tar -xzf ${ZKSAVDIR}/${ZKNAME}.tar.gz -C /opt/${APP_NAME}/ mv /opt/${APP_NAME}/${ZKNAME} ${ZKHOME} mkdir -p ${DATA_DIR} mkdir -p ${DATA_LOGDIR} cp ${ZKHOME}/conf/zoo_sample.cfg ${ZKHOME}/conf/zoo.cfg #客戶化zoo.cfg配置 sed -i "s/clientPort=2181/clientPort=${ZKCLIENT_PORT}/g" ${ZKHOME}/conf/zoo.cfg sed -i "s#dataDir=/tmp/zookeeper#dataDir=${DATA_DIR}#g" ${ZKHOME}/conf/zoo.cfg sed -i "/dataLogDir/s/^/#/" ${ZKHOME}/conf/zoo.cfg echo "dataLogDir=${DATA_LOGDIR}" >>${ZKHOME}/conf/zoo.cfg #修改zookeeper-env.sh,指定運行日志zookeeper.log路徑 sed -i "s#/var/log/zookeeper#${DATA_LOGDIR}#g" ${ZKHOME}/conf/zookeeper-env.sh #修改java.env,設置jvm參數,指定gc日志路徑 sed -i "s#/var/log/zookeeper#${DATA_LOGDIR}#g" ${ZKHOME}/conf/java.env #服務器數量為3個或5個為集群模式 if [ ${ZK_SRVNUM} -eq 3 ]||[ ${ZK_SRVNUM} -eq 5 ];then #根據端口數量判斷安裝方式 if [ ${CPORT_NUM} -eq 1 ];then #拆分IP地址列表,獲取本機ZK_ID for ((i=1;i<=${ZK_SRVNUM};i++));do eval IP_$i='`echo ${ZK_IPLIST}|awk -F, "{ print $"$i" }"`' # eval echo \$IP_$i eval IPTMP=\$IP_$i eval echo "server.${i}=\$IP_$i:${ZKLEADER_PORT}:${ZKCOM_PORT}">>${ZKHOME}/conf/zoo.cfg if [ "$HOST_IP" == "$IPTMP" ];then #當列表中的IP地址等於本機地址時,獲取當前i值作為ID ZK_ID=${i} else continue fi done else ZK_ID=${NUM} while read ZK_INFO;do echo ${ZK_INFO}|awk -F, '{print "server."$1"="$2":"$4":"$5}'>>${ZKHOME}/conf/zoo.cfg done</home/workapp/zkinfo.cfg fi #客戶化myid echo "${ZK_ID}" >${DATA_DIR}/myid echo "zookeeper ID is ${ZK_ID}"|tee -a ${INSTALL_LOG} fi chown -R workapp:workapp ${ZKHOME} chown -R workapp:workapp ${DATA_LOGDIR} cat ${ZKHOME}/conf/zoo.cfg } function Check_install { retval=$? if [ $retval -eq 0 ];then echo "`date '+%Y%m%d %H:%M:%S'` zookeeper install SUCCESS!|${APP_NAME} ${MODULE_NAME} ${HOST_IP} ${ZKCLIENT_PORT} ${ZK_ID}|0"|tee -a ${INSTALL_LOG} else echo "`date '+%Y%m%d %H:%M:%S'` zookeeper install FAILED!|${APP_NAME} ${MODULE_NAME} ${HOST_IP} ${ZKCLIENT_PORT} ${ZK_ID}|1"|tee -a ${INSTALL_LOG} fi } function Start_check { su - workapp -c "sh ${ZKHOME}/bin/zkServer.sh start" sleep 10 su - workapp -c "sh ${ZKHOME}/bin/zkServer.sh status" netstat -anp|grep ${ZKCLIENT_PORT} } #根據端口數量判斷安裝方式,1個端口為standalone或集群模式,正常安裝; if [ ${CPORT_NUM} -eq 1 ];then Install_zk Check_install Start_check else #多個端口為偽集群模式,讀取zkinfo.cfg文件 while read ZK_INFO;do NUM=`echo ${ZK_INFO}|awk -F, '{print $1}'` IP=`echo ${ZK_INFO}|awk -F, '{print $2}'` ZKCLIENT_PORT=`echo ${ZK_INFO}|awk -F, '{print $3}'` ZKHOME=`echo ${ZK_INFO}|awk -F, '{print $6}'` DATA_LOGDIR=`echo ${ZK_INFO}|awk -F, '{print $7}'` DATA_DIR=`echo ${ZK_INFO}|awk -F, '{print $8}'` if [ "$IP" == "$HOST_IP" ];then Install_zk Check_install Start_check else continue fi done</home/workapp/zkinfo.cfg fi rm -f /home/workapp/zkinfo.cfg
查看腳本幫助信息
install_zookeeper.sh腳本用於一鍵安裝zookeeper,支持單實例部署或者3台/5台服務器集群 執行方式: bash install_zookeeper.sh -a [option] [-b option] -l [option] [-n option] [-c option] [-f option] [-m option] 參數說明: 通過"bash install_zookeeper.sh -h" 命令可以顯示參數說明 OPTIONS: -a:項目編碼(必選) -b:模塊名稱(可選,默認為空) -n:ZooKeeper服務器數量(可選,默認為3) -l:ZooKeeper服務器IP地址列表(必選,格式為以英文逗號[,]分隔的IP地址,如為standalone模式,填寫一個IP地址,如為偽集群模式,需填寫三個IP地址且與端口號一一對應) -c:Client-Port(可選,默認為2181,如有多個端口,需與IP地址列表一一對應,格式為以英文逗號[,]分隔) -f:ZooKeeper的Follower和Leader間通信端口號(可選,默認為2888,如有多個端口,需與IP地址列表一一對應,格式為以英文逗號[,]分隔) -m:ZooKeeper選舉端口號(可選,默認為3888,如有多個端口,需與IP地址列表一一對應,格式為以英文逗號[,]分隔) ================================================================================================ [root@bobo zookeeper]# bash install_zookeeper.sh -h java version "1.8.0_51" Java(TM) SE Runtime Environment (build 1.8.0_51-b16) Java HotSpot(TM) 64-Bit Server VM (build 25.51-b03, mixed mode) OPTIONS: -a:項目編碼(必選) -b:模塊名稱(可選,默認為空) -n:ZooKeeper服務器數量(可選,默認為3) -l:ZooKeeper服務器IP地址列表(必選,IP地址以英文逗號分隔) -c:Client-Port(可選,默認為2181,多個端口以英文逗號分隔,且與IP地址一一對應) -f:ZooKeeper的F和L通信端口號(可選,默認為2888,多個端口以英文逗號分隔,且與IP地址一一對應) -m:ZooKeeper選舉端口號(可選,默認為3888,多個端口以英文逗號分隔,且與IP地址一一對應)
舉例說明(可以通過該腳本部署如下四個場景的zookeeper服務環境,安裝后zookeeper服務默認啟動)
[root@bobo zookeeper]# pwd /usr/local/src/zookeeper [root@bobo zookeeper]# ll total 21760 -rwxr-xr-x 1 root root 10711 Nov 13 16:45 install_zookeeper.sh -rw-r--r-- 1 root root 22264081 Jun 12 15:44 zookeeper-3.4.8.tar.gz -rw-r--r-- 1 root root 33 Nov 13 16:46 zookeeper-3.4.8.tar.gz.md5 [root@bobo zookeeper]# md5sum zookeeper-3.4.8.tar.gz 81adbad1f9f2f3c1061f19c26bff9ce4 zookeeper-3.4.8.tar.gz [root@bobo zookeeper]# cat zookeeper-3.4.8.tar.gz.md5 81adbad1f9f2f3c1061f19c26bff9ce4 該腳本執行的前提是: 1. 腳本中已經定義了zookeep安裝包存放位置和安裝包名,這些要提前准備好 #zookeep安裝包存放位置 ZKSAVDIR="/usr/local/src/zookeeper" #zookeeper安裝包名(不帶擴展名) ZKNAME="zookeeper-3.4.8" zookeeper的安裝包要和部署腳本在同一個目錄路徑下(比如這里都放在腳本定義的/usr/local/src/zookeeper目錄下) 檢查zookeeper的tar包的md5值,這里是zookeeper-3.4.8.tar.gz.md5 2. webapp用戶要存在(這個可以根據自己機器的實際情況進行修改) ====================================================================================================================== 舉例如下: 1)在172.16.60.210,172.16.60.211,172.16.60.212 三台服務器上為項目編碼為test的應用安裝zookeeper,端口默認。(三台機器上都執行下面命令) [root@bobo zookeeper]# bash install_zookeeper.sh -a test -l "172.16.60.210,172.16.60.211,172.16.60.212" 2)在172.16.60.210,172.16.60.211,172.16.60.212,172.16.60.213,172.16.60.214五台服務器上為項目編碼為ketest的kemodu模塊安裝zookeeper,Client端口為3000。(五台機器上都執行下面命令) [root@bobo zookeeper]# bash install_zookeeper.sh -a ketest -b kemodu -n 5 -l "172.16.60.210,172.16.60.211,172.16.60.212,172.16.60.213,172.16.60.214" -c 3000 3)在172.16.60.210上為項目編碼為test的應用安裝zookeeper,模式為standalone,端口為22281。(172.16.60.210機器上執行下面命令) [root@bobo zookeeper]# bash install_zookeeper.sh -a test -n 1 -l "172.16.60.210" -c 22281 4)在172.16.60.210上為項目編碼為test的應用安裝zookeeper偽集群,客戶端口為2181,2281,2381, 通信端口為2188,2288,2388,選舉端口為3181,3281,3381。(172.16.60.210機器上執行下面命令) [root@bobo zookeeper]# bash install_zookeeper.sh -a test -n 3 -l "172.16.60.210,172.16.60.210,172.16.60.210" -c"2181,2281,2381" -f "2188,2288,2388" -m "3181,3281,3381" ======================================================================================================================= 注意: 1. 在單台機器上部署偽靜態集群時,參數要寫全,即-a、-n、-l、-c、-f、-m都要在命令中寫上,否則會報錯如下: "IP list and server num do not match,exit"!! 2. 如果部署后發現zookeeper服務沒有起來,可以查看日志,日志路徑在zoo.cfg文件里配置。如下: [root@bobo conf]# cat zoo.cfg |grep dataLogDir dataLogDir=/var/log/test/zookeeper_2181 [root@bobo conf]# cat /var/log/test/zookeeper_2181/zookeeper.out Unrecognized VM option 'MetaspaceSize=256m' Could not create the Java virtual machine. 有上面日志可以看出,zookeeper一鍵安裝后,服務沒有起來的原因是:jdk版本問題 將當前jdk版本調整到jdk1.8即可! 解決辦法: [root@bobo conf]# java -version java version "1.6.0_41" OpenJDK Runtime Environment (IcedTea6 1.13.13) (rhel-1.13.13.1.el7_3-x86_64) OpenJDK 64-Bit Server VM (build 23.41-b41, mixed mode) [root@bobo conf]# rpm -qa|grep jdk java-1.6.0-openjdk-1.6.0.41-1.13.13.1.el7_3.x86_64 java-1.6.0-openjdk-demo-1.6.0.41-1.13.13.1.el7_3.x86_64 java-1.6.0-openjdk-devel-1.6.0.41-1.13.13.1.el7_3.x86_64 java-1.6.0-openjdk-javadoc-1.6.0.41-1.13.13.1.el7_3.x86_64 java-1.6.0-openjdk-src-1.6.0.41-1.13.13.1.el7_3.x86_64 [root@bobo conf]# yum -y remove java-1.6.0-openjdk* [root@bobo conf]# yum -y remove tzdata-java.noarch [root@bobo conf]# java -version -bash: /usr/bin/java: No such file or directory [root@bobo conf]# yum -y install java-1.8.0-openjdk* [root@bobo conf]# java -version openjdk version "1.8.0_232" OpenJDK Runtime Environment (build 1.8.0_232-b09) OpenJDK 64-Bit Server VM (build 25.232-b09, mixed mode) 再次啟動zookeeper服務就OK了!
三、集成多個中間件服務的一鍵部署腳本 [這里只列舉了nginx、apache和mysql一鍵部署,如有其他中間件部署需求,可自行添加進去]
#!/bin/bash # Date: 2018-09-08 # Mail: kevin@163.com # Founder: kevin # Describe: This is a one - button installation service script function CDAN(){ cat << One_button_install +------------------------------------------------+ | | | _o0o_ 1. 安裝Nginx | | 08880 2. 安裝Apache | | 88"."88 3. 安裝MySQL | | (|-_-|) 4. 安裝PHP | | 0\=/0 5. 部署LNMP環境 | | __/ \__ 6. 安裝zabbix監控 | | ‘\ ///‘ 7. 退出此管理程序 | | / Linux一鍵 \ 8. 關閉計算機 | | || Server || ================================| | \ //// 一鍵安裝服務 | | ||| i i i ||| by Kevin | | ___ ___ ================================| |___‘. /--.--\ .‘___ | +------------------------------------------------+ One_button_install } CDAN source /etc/init.d/functions BASE_DIR=/usr/local/src read -p "請您輸入1-8任意字符:" NUM expr $NUM + 1 >/dev/null 2>&1 if [ "$?" -ne 0 ] then echo "請您輸入{1|2|3|4|5|6|7|8}" exit 1 fi function Nginx_server (){ echo "開始安裝Nginx,請喝杯咖啡,耐心等待一段時間...." yum install -y gcc gcc-c++ pcre-devel zlib-devel openssl-devel >/dev/null 2>&1 cd $BASE_DIR wget http://nginx.org/download/nginx-1.12.2.tar.gz >/dev/null 2>&1 useradd -M -s /sbin/nologin nginx tar -zvxf nginx-1.12.2.tar.gz >/dev/null 2>&1 cd $BASE_DIR/nginx-1.12.2/ ./configure --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre --with-http_ssl_module --with-http_gzip_static_module --user=nginx --group=nginx >/dev/null 2>&1 if [ "$?" -eq 0 ];then make && make install >/dev/null 2>&1 fi if [ -f /usr/local/nginx/sbin/nginx ];then ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin /usr/local/nginx/sbin/nginx echo "恭喜您! Nginx安裝成功!" fi } function Apache_server (){ echo "開始安裝Apache,請喝杯咖啡,耐心等待一段時間...." yum install httpd -y >/dev/null 2>&1 if [ "$?" -eq 0 ] then echo "恭喜您! Apache安裝成功!" else echo "很抱歉, Apache安裝失敗! 請仔細檢查安裝腳本,可能有點問題." fi } function Mysql_server (){ echo "開始安裝Mysql,請喝杯咖啡,耐心等待一段時間...." rpm -e $(/bin/rpm -qa | grep mysql|xargs) --nodeps >/dev/null 2>&1 rpm -e $(/bin/rpm -qa | grep mariadb|xargs) --nodeps >/dev/null 2>&1 yum -y install make gcc-c++ cmake bison-devel ncurses-devel >/dev/null 2>&1 mkdir -p /usr/local/boost && cd /usr/local/boost wget http://www.sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz >/dev/null 2>&1 tar -zvxf boost_1_59_0.tar.gz >/dev/null 2>&1 /usr/sbin/groupadd mysql /usr/sbin/useradd -g mysql mysql -M -s /sbin/nologin mkdir -p /data/mysql/data cd $BASE_DIR wget -c http://ftp.ntu.edu.tw/MySQL/Downloads/MySQL-5.7/mysql-5.7.28.tar.gz >/dev/null 2>&1 tar -zxvf mysql-5.7.28.tar.gz >/dev/null 2>&1 cd mysql-5.7.28/ #mysql安裝目錄和數據目錄最好分開,配置文件為/usr/local/mysql/my.cnf cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql/data -DSYSCONFDIR=/usr/local/mysql -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock -DMYSQL_TCP_PORT=3306 -DENABLED_LOCAL_INFILE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_BOOST=/usr/local/boost >/dev/null 2>&1 if [ "$?" -eq 0 ];then make && make install >/dev/null 2>&1 fi chown -R mysql:mysql /usr/local/mysql chown -R mysql:mysql /data/mysql # 執行初始化配置腳本,創建系統自帶的數據庫和表 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql/data --user=mysql --initialize >/dev/null 2>&1 ## 配置my.cnf, 注意下面EOF輸入的內容需要頂格寫,否則輸入無效! cat > /usr/local/mysql/my.cnf << EOF [client] port = 3306 socket = /usr/local/mysql/var/mysql.sock [mysqld] port = 3306 socket = /usr/local/mysql/var/mysql.sock basedir = /usr/local/mysql/ datadir = /data/mysql/data pid-file = /data/mysql/data/mysql.pid user = mysql bind-address = 0.0.0.0 server-id = 1 sync_binlog=1 log_bin = mysql-bin skip-name-resolve #skip-networking back_log = 600 max_connections = 3000 max_connect_errors = 3000 ##open_files_limit = 65535 table_open_cache = 512 max_allowed_packet = 16M binlog_cache_size = 16M max_heap_table_size = 16M tmp_table_size = 256M read_buffer_size = 1024M read_rnd_buffer_size = 1024M sort_buffer_size = 1024M join_buffer_size = 1024M key_buffer_size = 8192M thread_cache_size = 8 query_cache_size = 512M query_cache_limit = 1024M ft_min_word_len = 4 binlog_format = mixed expire_logs_days = 30 log_error = /data/mysql/data/mysql-error.log slow_query_log = 1 long_query_time = 1 slow_query_log_file = /data/mysql/data/mysql-slow.log performance_schema = 0 explicit_defaults_for_timestamp ##lower_case_table_names = 1 skip-external-locking default_storage_engine = InnoDB ##default-storage-engine = MyISAM innodb_file_per_table = 1 innodb_open_files = 500 innodb_buffer_pool_size = 40960M innodb_write_io_threads = 1000 innodb_read_io_threads = 1000 innodb_thread_concurrency = 8 innodb_purge_threads = 1 innodb_flush_log_at_trx_commit = 2 innodb_log_buffer_size = 4M innodb_log_file_size = 32M innodb_log_files_in_group = 3 innodb_max_dirty_pages_pct = 90 innodb_lock_wait_timeout = 120 bulk_insert_buffer_size = 8M #myisam_sort_buffer_size = 8M #myisam_max_sort_file_size = 1G #myisam_repair_threads = 1 interactive_timeout = 28800 wait_timeout = 28800 [mysqldump] quick max_allowed_packet = 16M [myisamchk] key_buffer_size = 8M sort_buffer_size = 8M read_buffer = 4M write_buffer = 4M sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES port = 3306 EOF #啟動mysql服務 cd /usr/local/mysql && mkdir var chown -R mysql.mysql var cp support-files/mysql.server /etc/init.d/mysql chmod 755 /etc/init.d/mysql #由於是拷貝到/etc/init.d下的啟動腳本,這里不管是centos6或centos6都使用chkconfig添加開機啟動 chkconfig mysql on service mysql start >/dev/null 2>&1 #設置環境變量 echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile source /etc/profile mkdir -p /var/lib/mysql ln -s /usr/local/mysql/var/mysql.sock /var/lib/mysql/mysql.sock chown -R mysql:mysql /var/lib/mysql #設置初始密碼為"mysql@123" sed -i '/\[mysqld]/a\skip-grant-tables' /usr/local/mysql/my.cnf service mysql restart >/dev/null 2>&1 #mysql無密碼登陸,可以使用mysql -p" "直接登陸(即密碼為空)。如果直接使用mysql -p回車,然后無密碼,但還是需要觸發一次回車。 /usr/local/mysql/bin/mysql -p" " -e "update mysql.user set authentication_string=password('mysql@123') where user='root';" -e "flush privileges;" sed -i '/skip-grant-tables/d' /usr/local/mysql/my.cnf MYSQL_VERSION=$(basename $(ls $BASE_DIR/mysql-*.tar.gz)|cut -d"-" -f2|awk -F".tar" '{print $1}') chown -R mysql:mysql /usr/local/mysql chown -R mysql:mysql /data/mysql service mysql restart >/dev/null 2>&1 if [ "$?" -eq 0 ];then echo "恭喜您! Mysql${MYSQL_VERSION}安裝成功!目前Mysql服務已啟動,初始密碼為mysql@123" fi } case $NUM in 1) Nginx_server ;; 2) Apache_server ;; 3) Mysql_server ;; esac
執行腳本
需要注意: 上面One_button_install.sh一鍵部署腳本中涉及服務安裝包的下載,考慮到網絡因素,可以提前將包下載下來放到指定的${BASE_DIR}目錄下,這樣有利於提高腳本執行效率。 執行腳本,必須選擇安裝mysql [root@localhost ~]# chmod 755 One_button_install.sh [root@localhost ~]# sh One_button_install.sh +------------------------------------------------+ | | | _o0o_ 1. 安裝Nginx | | 08880 2. 安裝Apache | | 88"."88 3. 安裝MySQL | | (|-_-|) 4. 安裝PHP | | 0\=/0 5. 部署LNMP環境 | | __/ \__ 6. 安裝zabbix監控 | | ‘\ ///‘ 7. 退出此管理程序 | | / Linux一鍵 \ 8. 關閉計算機 | | || Server || ================================| | \ //// 一鍵安裝服務 | | ||| i i i ||| by Kevin | | ___ ___ ================================| |___‘. /--.--\ .‘___ | +------------------------------------------------+ 請您輸入1-8任意字符:3 開始安裝Mysql,請喝杯咖啡,耐心等待一段時間.... 接着就是耐心等待就好了,本腳本經過線上測試可用。