自动化部署脚本

1、自动化部署脚本如下:

init.sh脚本

#获取当前脚本所在的目录并赋值给变量bin,/opt/xxx/xxx
bin=`dirname "${BASH_SOURCE-$0}"`
bin=`cd "$bin"; pwd`

PORT=3222
STEP=1
ENDSTEP=9


SSH='/usr/bin/ssh'
#SSHID=`netstat -ntlp | grep  sshd | grep -w "tcp" | awk '{print $4}' | cut -d: -f2`
SSH_KEYGEN='/usr/bin/ssh-keygen'
SSH_COPY_ID='/usr/bin/ssh-copy-id'
SCP='/usr/bin/scp'



function print_usage(){
  echo -e "Usage: ./first.sh [-step stepNUM] [-endstep endstepnum] [-port sshPort] COMMAND"
}

#整个脚本执行的顺序,从哪传的参数,什么时候执行这个代码的。相当于重新获取 port值,step值和endstep值
((NUM=$#%2))
if [ $NUM != 0 ];then
  print_usage
  exit
fi


# ./frist.sh -step 2 -endstep 6 -port  


until [ $# -eq 0 ]
do
 case $1 in
      -port)  
      PORT=$2
      ;;
      -step)
      STEP=$2
      ;;
      -endstep)
      ENDSTEP=$2
      ;;
      *)
      print_usage
      exit
      ;;
 esac

 shift 2
done



#####################public function############################
#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 "\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 "\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
}


# 公共函数 遍历hosts
function list_hosts(){
  OLD_IS="$IFS"
  IFS=" "
  while read LINE
    do
      arr=($LINE)
      HOSTNAME=${arr[0]}
      USERNAME=${arr[1]}
      PASSWD=${arr[2]}
      $1 $USERNAME $HOSTNAME $PASSWD    
      RES=$?
      if [ $RES != "0" ];then
        return "$RES"
        break
      fi
    done < $bin/hosts
}

#获取秘钥 ###
function ssh_keygen(){
   res=`ssh_keygen_fun $1 $2 $3`     #$1,$2,$3分别为 $USERNAME $HOSTNAME $PASSWD 
   RESULT=$?
   MESSAGE="keygen-->$1@$2"
   show_result  $RESULT  $MESSAGE   # 公共函数 数据结果
}
#获取秘钥的实际操作步骤 ###
function ssh_keygen_fun(){
  expect -c"
    spawn $SSH -p$PORT $1@$2  $SSH_KEYGEN
      set timeout 30
      expect {
        \"*Permission denied, please try again*\" {puts \"fail\";exit 9 }
        \"*Connection refused*\" {puts \"fail\";exit 7 }
        \"*continue connecting (yes/no)*\" {send \"yes\r\";exp_continue}
        \"*password*\" {send \"$3\r\";exp_continue}
        \"Enter file in which to save the key*\" {send \"\r\";exp_continue}
        \"Enter passphrase*\" {send \"\r\";exp_continue}
        \"Enter same passphrase again*\" {send \"\r\";puts \"success\";exit 1}
        \"Overwrite (y/n)*\" {send \"n\r\";puts \"success\";exit 2}
        \"*No route to host*\" {puts \"fail\";exit 8}
        \"*Connection timed out*\" {puts \"fail\";exit 6}
      }
  "
}
# 公共函数 数据结果 ###
#下面的数字是根据上面的函数执行后的结果所返回的
# 9 --> 密码错误
# 8 --> ip/hostname 错误
# 7 --> passwd
# 6 --> Connection timed out
# 2 --> 已经做过的ssh-keygen 不在做了
# 1 --> 新做的ssh-keygen
function show_result(){ 
  if [ $# -ge 2 ];then
     params_num=$1
     shift 1
     params_mes=$@
  else
    echo_fun 3 请至少输入两个参数 show_result ..
    exit
  fi

  case $params_num in
    0)
        echo_fun 2  "${params_mes[*]} [ success ]"
    ;;

    1)
        echo_fun 2  "${params_mes[*]} [ success ]"
    ;;

    2)
        echo_fun 2  "${params_mes[*]} [ success ]"
     ;;
    6)
        echo_fun 3  "${params_mes[*]}  [ failed ] : Connection timed out"
        return 6
    ;;
    7)
        echo_fun 3  "${params_mes[*]}  [ failed ] : Connection refused(ssh 端口是否正确)"
        return 7
    ;;
    8)
        echo_fun 3  "${params_mes[*]}   [ failed ] : No route to host(ip地址是否正确)"
        return 8
    ;;
    9)
        echo_fun 3  "${params_mes[*]}  [ failed ] : Permission denied(密码错误)"
        return 9
    ;;
    *)
        echo_fun 3  "${params_mes[*]} [ failed ] : 未知的错误"
        return 9
    ;;
  esac
}

#################第一步 读取hosts文本内容,对每台机器生成秘钥对#########################
function step_fun_1(){
echo_fun 1 第一步,生成秘钥对
if [ "`rpm -qa |grep expect`" = "" ];then
  echo_fun 4 下载expect...
  yum install expect -y  >/dev/null 2>&1
  if [ `echo $?` != 0 ];then
    echo_fun 5 expect下载失败请检查yum源
    exit
  fi
fi
  list_hosts ssh_keygen        # 公共函数 遍历hosts
  RES=$?

  if [ $RES != 0 ];then
     echo -e "\033[33;40;1m>>Please check '${bin}/hosts' file<<   Retry(yes/no)?\033[0m"
     read  name
     if [ $name = "no" ];then
       echo_fun 5 "当前执行第 1  步,如果继续执行请输入 ./frist.sh -step 1 -port portnum "
       exit
     elif [ $name = "yes" ];then
       step_fun_1
     else
      step_fun_1
    fi
  fi
  echo -e "\r\n"
}

#-----------------------------------第二步 配置单项免密----------------------------
function step_fun_2(){
  echo_fun 1 第二步,配置免密
  echo_fun 4 "当前机器`hostname`"
  ssh_copyid_fun
}

###########循环遍历 做单项免密###############
function ssh_copyid_fun(){
  OLD_IS="$IFS"
  IFS=" "
  while read LINE
    do
      arr=($LINE)
      HOSTNAME=${arr[0]}
      USERNAME=${arr[1]}
      PASSWD=${arr[2]}
      # 免秘钥  ~/.ssh/id_rsa.pub
      abc=`expect -c " 
        spawn   $SSH_COPY_ID    -p $PORT  $USERNAME@$HOSTNAME 
        expect {
          \"*continue connecting (yes/no)*\" {send \"yes\r\";exp_continue}
          \"*Permission denied*\" {puts \"fail\";exit 9 }
          \"*password*\" {send \"$PASSWD\r\";exp_continue}
          \"*No route to host*\" {puts \"fail\r\";exit 8}
          \"*Connection timed out*\" {puts \"fail\r\";exit 6}
        }
    "`
   RESULT=$?
   MESSAGE="免密-->$USERNAME@$HOSTNAME"
   show_result  $RESULT $MESSAGE
  if [ $RESULT -ne 0 ];then
     echo_fun 5 "当前执行第 2  步,如果继续执行请输入 ./frist.sh -step 2 -port portnum "
     exit
  fi
done < $bin/hosts
}





#opt目录
ENV_PARENT_PATH="/opt"

TAR_JDK_PATH=""   #后期的值为jdk包的全路径以及包的名字/opt/software/jdk1.7.0_67.tar.gz 

TAR_PYTHON_PATH=""

MYSQL_JDBC_DRIVER="" #后期的值为mysqljar包的全路径以及包的名字
 
#TAG_MYSQL_JDBC_DRIVER="/usr/share/java/$mysql_jdbc_name"
TAG_MYSQL_JDBC_DRIVER=""  

PARENT_PACAKGE="/opt/software"

LN_MYSQL_JDBC_DRIVER=/usr/share/java/mysql-connector-java.jar


function is_opt_exsit(){
  $SSH -n -p $PORT $1@$2 "if [ ! -d ${ENV_PARENT_PATH} ];then exit 2; fi"     
}


function is_opt_java(){
  $SSH -n -p $PORT  $1@$2 "if [ -d ${ENV_PARENT_PATH}/java ] ;then exit 2; fi"
}

function is_opt_python(){
  $SSH -n -p $PORT  $1@$2 "if [ -d ${ENV_PARENT_PATH}/python ];then exit 2; fi"
}

function distri_jdk_fun(){
  #TAR_JDK_PATH java的安装包
     $SCP -P $PORT $TAR_JDK_PATH $1@$2:${ENV_PARENT_PATH}
}

function distri_py_fun(){
     $SCP -P $PORT $TAR_PYTHON_PATH $1@$2:${ENV_PARENT_PATH}
}

function distri_mysql_jdbc(){
  $SSH -n -p $PORT $1@$2 "mkdir -p /usr/share/java"
  $SCP -P $PORT $MYSQL_JDBC_DRIVER $1@$2:/usr/share/java/
  $SSH -n -p $PORT $1@$2 "if [ -f $LN_MYSQL_JDBC_DRIVER ];then rm -r $LN_MYSQL_JDBC_DRIVER; fi"
  $SSH -n -p $PORT $1@$2 "ln -s $TAG_MYSQL_JDBC_DRIVER $LN_MYSQL_JDBC_DRIVER"
}


function get_params_value() {
    if [ $# -ne 1 ];then
      echo_fun 3 参数输入有误 get_params_value
    fi
    k=$1
    value=`awk -F=  -v key=${k} '{if ($1 == key ) print $2}' $bin/params`
    echo $value
}

#将jdk的包分发到其他机器上
function distri_jdk_fun(){
  #TAR_JDK_PATH java的安装包的路径加包名
     $SCP -P $PORT $TAR_JDK_PATH $1@$2:${ENV_PARENT_PATH}
}

function loop_hosts(){
i=1
  l=$(wc -l $bin/hosts| sed 's/^[ \t]*//g' | cut -d ' ' -f1)
  CMD=$1
  MESSAGE_3=$2
  STEP_3=$3
  OLD_IS="$IFS"
  IFS=" "
  while read LINE
    do
      arr=($LINE)
      HOSTNAME=${arr[0]}
      USERNAME=${arr[1]}
      PASSWD=${arr[2]}
      $CMD $USERNAME $HOSTNAME $PASSWD
      RES=$?
      if [ $RES != "0" ];then
        echo -e "\r\n\033[31;40;1mERROR: $HOSTNAME $MESSAGE_3   \033[0m \r\n"
        echo -e  "\033[33;40;1m  当前执行第 $STEP_3 步,如果继续执行请输入 ./frist.sh -step $STEP_3 -port portnum \033[0m\r\n"
        exit
      fi
      if [ "`rpm -qa |grep "^bc"`" = "" ];then
   echo_fun 4 下载bc...
   yum install bc -y  >/dev/null 2>&1
   if [ `echo $?` != 0 ];then
    echo_fun 5 bc下载失败请检查yum源
    exit
  fi
fi
 
    echo -en "\b\b\b\b" `echo $i*100/$l | bc `'%'
    done < $bin/hosts
    echo -en '\033[32;40;1m\b\b\b\bOK\033[0m   \r\n'
}





function step_fun_3(){

  echo_fun 1 第三步,分发jdk python
  echo_fun 5 默认情况下是安装python 如果想不装python 请将./tool/params文件的'TAR_PYTHON_NAME'值清空!
  echo_fun 4 是否继续[yes/no]:
  read value
  case $value in
        yes)
	echo -e "\n"
        echo -e "\033[42;33m 接着执行 \033[0m\n"
	;;
        no)
            echo_fun 5 当前执行第 3 步,如果继续执行请输入 ./frist.sh -step 3 -port portnum
            exit
        ;;
        *)
        step_fun_3
        ;;
  esac
  #获取jdk包的名字  TAR_JDK_NAME参数k=v 这里相当于k ,params中的TAR_JDK_NAME=jdk1.7.0_67.tar.gz的key
  #tar_jdk_name的值为jdk1.7.0_67.tar.gz
  tar_jdk_name=`get_params_value TAR_JDK_NAME`
  #获取python包的名字
  tar_python_name=`get_params_value TAR_PYTHON_NAME`
  #获取mysql的数据库连接jar包名字
  mysql_jdbc_name=`get_params_value MYSQL_JDBC_DRIVER`

  # 检测是否存在 /opt 目录
  CHECK_OPT_MESSAGE="经检查该机器上不存在${ENV_PARENT_PATH}目录"
  echo_fun 4 "检查是否存在${ENV_PARENT_PATH}目录....."
  loop_hosts  is_opt_exsit   $CHECK_OPT_MESSAGE  "3"
  echo_fun 2 "检查是否存在${ENV_PARENT_PATH}目录完毕!"


  if [ "$tar_jdk_name" = "" ];then
        echo_fun 5 ./tool/params文件中TAR_JDK_NAME值为空,再安装jdk
  else
       #检测 /opt/java 目录是否存在
      echo_fun 4 "检查是否存在${ENV_PARENT_PATH}/java"
      CHECK_JAVA_HOME="的机器上已存在${ENV_PARENT_PATH}/java目录,请检查手动清理一下!"
      loop_hosts is_opt_java $CHECK_JAVA_HOME 3      
      TAR_JDK_PATH="${PARENT_PACAKGE}/${tar_jdk_name}"
     
      if [ -f $TAR_JDK_PATH ];then
        echo_fun 4 分发JDK
        loop_hosts distri_jdk_fun
      else 
        echo_fun 3 $TAR_JDK_PATH 文件不存在 请检查文件的完整性
        echo_fun 5 当前执行第 3 步,如果继续执行请输入 ./frist.sh -step 3 -port portnum
        exit 9
      fi
   fi


   if [ "$tar_python_name" = "" ];then
        echo_fun 5 ./tool/params文件中TAR_PYTHON_NAME值为空 不在安装python
   else
        TAR_PYTHON_PATH=$PARENT_PACAKGE/$tar_python_name
        #检测 /opt/python 目录是否存在
        echo_fun 4 "检查是否存在${ENV_PARENT_PATH}/python"
     
        CHECK_PYTHON_HOME="的机器上已存在${ENV_PARENT_PATH}/python目录,请检查手动清理一下一下!"
    
        loop_hosts is_opt_python $CHECK_PYTHON_HOME 3
   
        if [ ! -f $TAR_PYTHON_PATH ];then
          echo_fun 3 $TAR_PYTHON_PATH 文件不存在 请检查包的完整性
          echo_fun 5 当前执行第 3 步,如果继续执行请输入 ./frist.sh -step 3 -port portnum
          exit 9
        fi
   fi



  if [ "$tar_python_name" != "" ];then
      echo_fun 4 分发python
      loop_hosts distri_py_fun
  fi


    if [ "$mysql_jdbc_name" = "" ];then
       echo_fun 5  ./tool/params文件中MYSQL_JDBC_DRIVER值为空 不在分发mysql驱动
    else
       MYSQL_JDBC_DRIVER=$PARENT_PACAKGE/$mysql_jdbc_name
       TAG_MYSQL_JDBC_DRIVER="/usr/share/java/$mysql_jdbc_name"
       if [ -f $MYSQL_JDBC_DRIVER ];then
          echo_fun 4 分发jdbc的驱动
          loop_hosts distri_mysql_jdbc
       else
          echo 3  $MYSQL_JDBC_DRIVER 文件不存在
          exit
       fi
    fi
}


#---------------------------------------第四步 安装jdk、python-------------------------------------------------
#检查 是否存在/jdk python 安装包。

function is_exist_java(){
 ssh -n -p $PORT $1@$2 "if [ ! -f $TAG_JDK_PATH ];then exit 2; fi"
}

function is_exist_python(){
 ssh -n -p $PORT $1@$2 "if [ ! -f $TAG_PYTHON_PATH ];then exit 2; fi"
}

function is_exist_path_java(){
  ssh -n -p $PORT $1@$2 "if [ -d ${DECOM_JDK_PATH} ] ;then exit 2; fi"
}

function is_exist_path_python(){
  ssh -n -p $PORT $1@$2 "if [ -d ${DECOM_PYTHON_PATH} ];then exit 2; fi"
}

function decom_jdk(){
  ssh -n -p $PORT $1@$2 "tar -zxvf $TAG_JDK_PATH -C ${ENV_PARENT_PATH}  >/dev/null 2>&1;  ln -s ${DECOM_JDK_PATH}  ${ENV_PARENT_PATH}/java >/dev/null 2>&1; "
}

function decom_python(){
  ssh -n -p $PORT $1@$2 " tar -xvf $TAG_PYTHON_PATH -C ${ENV_PARENT_PATH} >/dev/null 2>&1; ln -s ${DECOM_PYTHON_PATH} ${ENV_PARENT_PATH}/python >/dev/null 2>&1; "
}


TAG_JDK_PATH=""  # /opt/jdk1.7.0_67.tar.gz包
TAG_PYTHON_PATH=""


DECOM_JDK_PATH=""
DECOM_PYTHON_PATH=""


#"################################安装jdk,python######################################"
function step_fun_4(){
  echo_fun 1 第四步,解压jdk python

  tar_jdk_name=`get_params_value TAR_JDK_NAME`
  tar_python_name=`get_params_value TAR_PYTHON_NAME`

  if [ "$tar_jdk_name" != "" ];then
      TAR_JDK_PATH="${PARENT_PACAKGE}/${tar_jdk_name}"

      # /opt/jdk1.7.0_67.tar.gz包
      TAG_JDK_PATH="${ENV_PARENT_PATH}/${tar_jdk_name}"
      
      #检查各个机器上jdk的安装包是否存在
      echo_fun 4 "检查jdk安装包是否存在"
      CHECK_JAVA_MESSAGE="的机器上不存在${TAG_JDK_PATH}请检查一下"
      loop_hosts is_exist_java $CHECK_JAVA_MESSAGE 4
      echo_fun 2 "jdk检查完毕"
      after_jdk_decom_path=`tar -tvf $TAG_JDK_PATH |head -n 1 |awk -F ' ' '{print $6}' |awk -F '/' '{print $1}'`
      if [ "$after_jdk_decom_path" = "" ];then
          echo_fun 3 after_decom_path is null at  $LINENO line
          exit
      fi
      DECOM_JDK_PATH="${ENV_PARENT_PATH}/${after_jdk_decom_path}"
      #"检查是否存在已经解压好的 jdk python的目录"
      CHECK_JAVA_PATH_MESSAGE="的机器上已存在${DECOM_JDK_PATH}请检查一下"
      loop_hosts is_exist_path_java ${CHECK_JAVA_PATH_MESSAGE} 4
  fi

  if [ "$tar_python_name" != "" ];then
      TAR_PYTHON_PATH="${PARENT_PACAKGE}/${tar_python_name}"
      TAG_PYTHON_PATH="${ENV_PARENT_PATH}/${tar_python_name}"
      echo_fun 4 "检查python 安装包是否存在!"
      #检查各个机器上python的安装包是否存在
      CHECK_PYTHON_MESSAGE="的机器上不存存在${TAG_PYTHON_PATH}请检查一下"
      loop_hosts is_exist_python ${CHECK_PYTHON_MESSAGE} 4
      echo_fun 2 "python 检查完毕"
      after_python_decom_path=`tar -tvf ${TAG_PYTHON_PATH} |head -n 1 |awk -F ' ' '{print $6}' |awk -F '/' '{print $1}'`
      if [ "$after_python_decom_path" = "" ];then
          echo_fun 3 after_python_decom_path is null at  $LINENO line
          exit
      fi
      DECOM_PYTHON_PATH="${ENV_PARENT_PATH}/${after_python_decom_path}"
      #"检查是否存在已经解压好的 jdk python的目录"
      CHECK_PYTHON_PATH_MESSAGE="的机器上已存在${DECOM_PYTHON_PATH}请检查一下"
      loop_hosts is_exist_path_python ${CHECK_PYTHON_PATH_MESSAGE} 4
  fi

  if [ "$tar_jdk_name" != "" ];then
       echo_fun 4 "开始解压jdk包此过程比较缓慢请耐心等待"
       loop_hosts decom_jdk "的机器上jdk解压失败" 4
  fi

  if [ "$tar_python_name" != "" ];then
       echo_fun 4 "开始解压python包此过程比较缓慢请耐心等待"
       loop_hosts decom_python "的机器上python解压失败"  4
  fi
}




#-------------------------------第五步、生成环境变量--------------------------------------------------

function gen_pro_env_fun(){
> /etc/profile.d/bfd_env.sh >/dev/null
if [ -d ${ENV_PARENT_PATH}/python ];then
cat << EOF >> /etc/profile.d/bfd_env.sh
export JAVA_HOME=${ENV_PARENT_PATH}/java
export PATH=\$JAVA_HOME/bin:\$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 

export PYTHON_HOME=${ENV_PARENT_PATH}/python
export PATH=\$PYTHON_HOME/bin:\$PATH
EOF
else
cat << EOF >> /etc/profile.d/bfd_env.sh
export JAVA_HOME=${ENV_PARENT_PATH}/java
export PATH=\$JAVA_HOME/bin:\$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 

EOF
fi
}


function gen_ld_env_fun(){
ssh -n -p $PORT $1@$2 "
/bin/cat << EOF >> /etc/ld.so.conf
${ENV_PARENT_PATH}/python/lib
EOF
"
}

function scp_pro_env_fun(){
scp -P $PORT /etc/profile.d/bfd_env.sh $1@$2:/etc/profile.d/
}

function exe_env_fun(){
  #ssh -n -p $PORT $1@$2 "/sbin/ldconfig;/bin/sh /etc/profile"
  ssh -n -p $PORT $1@$2 "/sbin/ldconfig;source /etc/profile.d/bfd_env.sh"
}

function step_fun_5(){
echo_fun 1 第五步,生成环境变量
  echo "开始生成环境变量..."
  gen_pro_env_fun
  loop_hosts scp_pro_env_fun
  tar_python_name=`get_params_value TAR_PYTHON_NAME`
  if [ "$tar_python_name" != "" ];then
      loop_hosts gen_ld_env_fun
      loop_hosts exe_env_fun
  fi
}



#--------------------------第六步,检查openssl的版本号----------------------
function check_openssl_fun(){
 ssh -n -p $PORT $1@$2  "if [ `rpm -qa |grep openssl-1 |awk -F '-' '{print $3}' |awk -F '.' '{print $1}'` -lt 15 ];then exit 3;fi"
}

if [ "`rpm -qa |grep "^redhat-lsb"`" = "" ];then
   echo_fun 4 下载redhat-lsb...
   yum install redhat-lsb -y  >/dev/null 2>&1
   if [ `echo $?` != 0 ];then
    echo_fun 5 redhat-lsb下载失请检查yum源
    exit
  fi
fi

function get_centos_verison(){
   cen_version=`lsb_release -a |awk -F ' ' '{print $2}' |head -n 4 |tail -n 1 |awk -F '.' '{print $1}'`
   echo $cen_version
}

function step_fun_6(){
  echo_fun 1 "第六步,检查openssl的版本"
  echo_fun 4 检查openssl版本号
  centos_version=`get_centos_verison`
  case $centos_version in
      6)
      CHECK_OPENSSL_MESSAGE="该机器上的openssl小于15版本"
      loop_hosts check_openssl_fun $CHECK_OPENSSL_MESSAGE 6
      echo_fun 2 openssl检查成功
      ;;
      7)
      echo_fun 5 "centos7 跳过该步"
      ;;
      *)
      echo_fun 3 操作系统版本获取失败
      exit
      ;;
   esac
}

#------------------------------第七步,配置ect/hosts------------------------------
function dishosts(){
  scp -P $PORT $bin/srchosts $1@$2:/etc/hosts
}

function step_fun_7(){
  echo_fun 1 第七步 配置/etc/hosts的文件
  echo_fun 4 开始生成hosts文件
  sh $bin/genAllHostname.sh $PORT
  echo_fun 2 hosts文件生成成功

  echo_fun 4 开始分发hosts的文件
  if [ ! -f $bin/srchosts ];then
    echo_fun 5  $bin/srchosts文件不存在 $LI
    echo -e  "\033[33;40;1m  当前执行第 7 步,如果继续执行请输入 ./frist.sh -step 7 -port portnum \033[0m\r\n"
    exit 9
  fi

  ERROR_MESSAGE="hosts文件分发失败,请检查原因"
  loop_hosts dishosts $ERROR_MESSAGE  8
  echo_fun 2 hosts文件分发成功
}


#-------------------第八步,搭建时间同步服务器-------------------------------
function ntp_client_ins(){
  host_ip=`hostname -i`
  if [ "$host_ip" = "" ];then
    echo_fun 5 不能获取到当前机器ip"hostname -i"
    exit 9
  fi
  
  echo "host_ip $host_ip"
  if [ "$host_ip" != "$2" ];then
    ssh -n -p $PORT $1@$2 "yum install ntp -y >/dev/null 2 >&1"
    if [ `echo $?` != 0 ];then
      echo_fun 5 ntp客户端安装失败
      echo_fun 4  失败机器hostname$2
      exit 9
    fi
    ssh -n -p $PORT $1@$2  "/usr/sbin/ntpdate $host_ip  >/dev/null 2 >&1 "
    if [ `echo $?` != 0 ];then
      echo_fun 5 ntpdate 更新失败
      echo_fun 4  失败机器hostname$2
      exit 9
    fi
    scp -P $PORT  $bin/genCrontab.sh  $1@$2:/tmp
    if [ `echo $?` != 0 ];then
      echo_fun 5  "$bin/genCrontab.sh文件分发失败"
      echo_fun 4  失败机器hostname$2
      exit 9
    fi
    ssh -n -p $PORT $1@$2 "sh /tmp/genCrontab.sh $host_ip ; /usr/bin/crontab -l"
    if [ `echo $?` != 0 ];then
      echo_fun 5  配置crontab失败
      echo_fun 4  失败机器hostname$2
      exit 9
    fi
  fi
}
function step_fun_8(){
  echo_fun 1 "第八步,搭建时间同步服务器"
  centos_version=`get_centos_verison`
  echo_fun 4 安装ntp服务器
  if [ "`rpm -qa|grep ntp- |head -n 1`" = "" ];then
    yum install ntp -y >/dev/null 2>&1
    if [ `echo $?` != 0 ];then
      echo_fun 5 ntp服务器安装失败!
      exit 9
    fi
  fi
  echo_fun 2 ntp服务器安装成功

  #先注释掉,然后在追加
  sed  -i '/restrict default/s/^/#/g' /etc/ntp.conf
  sed -i '6a\restrict default nomodify\n' /etc/ntp.conf
  sed  -i '7a\server 127.127.1.0\n'  /etc/ntp.conf
  echo_fun 4 启动ntp服务器
  case $centos_version in
      6)
      chkconfig ntpd on
      service  ntpd  restart
      if [ `echo $?` != 0 ];then
          echo_fun 5 ntp服务启动失败
          exit 9
      fi
      ;;
      7)
      systemctl enable ntpd
      systemctl restart ntpd
      if [ `echo $?` != 0 ];then
          echo_fun 5 ntp服务启动失败
          exit 9
      fi
      ;;
      *)
      echo_fun 3 操作系统版本获取失败
      exit 9
      ;;
  esac
  echo_fun 2 ntp服务器启动成功
  echo_fun 4 配置ntp客户端
  loop_hosts ntp_client_ins ntp客户端安装失败 "8"
}

#-----------------------------第九步,优化系统参数--------------------------------------

function scp_in_fun6(){
  scp -P $PORT $bin/in6.sh $1@$2:/tmp/
}
function ssh_in_fun6(){
  ssh -n -p $PORT  $1@$2 "/bin/sh /tmp/in6.sh"
}

function scp_in_fun7(){
  scp -P $PORT $bin/in7.sh $1@$2:/tmp/
}
function ssh_in_fun7(){
  ssh -n -p $PORT  $1@$2 "/bin/sh /tmp/in7.sh"
}

function step_fun_9(){
  centos_version=`get_centos_verison`
  echo_fun 1  "第九步,优化系统参数"
  echo_fun 4 开始优化系统参数
  case $centos_version in
      6)
         loop_hosts scp_in_fun6
         loop_hosts ssh_in_fun6 > /dev/null 2>&1
      ;;
      7)
         loop_hosts scp_in_fun7
         loop_hosts ssh_in_fun7 > /dev/null 2>&1
      ;;
      *)
      echo_fun 3 获取版本失败
      exit
      ;;
  esac
  echo_fun 2 优化系统参数完成
}


while (($STEP <= $ENDSTEP))
do
  step_fun_$STEP
  ((STEP++))
done

genAllHostname.sh 脚本

#!/bin/sh

bin=`dirname "${BASH_SOURCE-$0}"`
bin=`cd "$bin"; pwd`


PORT=22
if [ "$1" != "" ];then
 PORT=$1
fi
function loop_hosts(){
  OLD_IS="$IFS"
  IFS=" "
  while read LINE
    do
      arr=($LINE)
      HOSTNAME=${arr[0]}
      USERNAME=${arr[1]}
      PASSWD=${arr[2]}
      tag_hostname=`ssh -n -p$PORT $USERNAME@$HOSTNAME "hostname"`
      RES=$?
      echo "$HOSTNAME $tag_hostname" >> $bin/srchosts
      if [ $RES != "0" ];then
        echo -e "\r\n\033[31;40;1mERROR: $HOSTNAME 机器主机名获取失败\033[0m \r\n"
        exit 9
      fi
    done < $bin/hosts
}

if [ ! -d $bin/../tmp ];then
  mkdir $bin/../tmp
fi
cat > $bin/srchosts << EOF
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
EOF
loop_hosts

genCrontab.sh 脚本


#!/bin/sh
hostname=$1
echo "*/15 * * * * /usr/sbin/ntpdate $hostname" >> /var/spool/cron/root

 hosts和params 文件

172.18.1.25 root bfd123
172.18.1.26 root bfd123


TAR_JDK_NAME=jdk1.8.0_131.tar.gz
TAR_PYTHON_NAME=Python-2.7.8.tar.gz
MYSQL_JDBC_DRIVER=mysql-connector-java-5.1.42.jar


in7.sh脚本

#关闭防火墙
if [ "`rpm -qa|grep firewalld- |head -n 1`" = "" ];then
    yum install firewalld -y >/dev/null 2>&1
    if [ `echo $?` != 0 ];then
      echo_fun 5 firewalld安装失败!
      exit 9
    fi
  fi
systemctl  stop firewalld
#关闭开启自启
systemctl  disable firewalld

#关闭 seliunx
if [ `getenforce` != "Disabled" ];then
  setenforce 0
fi
#优化ulimit
cat >> /etc/security/limits.conf << EOF
*           soft   nofile       655350
*           hard   nofile       655350
*           soft   nproc        655350
*           hard   nproc        655350
EOF
sed -i 's#4096#65535#g'   /etc/security/limits.d/20-nproc.conf



#设置ssh
sed -i -e 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
sed -i 's/GSSAPIAuthentication yes/GSSAPIAuthentication no/' /etc/ssh/sshd_config
sed -i 's/#UseDNS yes/UseDNS no/' /etc/ssh/sshd_config
sed -i 's/#PermitEmptyPasswords no/PermitEmptyPasswords no/' /etc/ssh/sshd_config
#优化内核参数####
cat > /etc/sysctl.conf << EOF
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 60000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 1024 65535
EOF
sysctl -p >/dev/null 2>&1

in6.sh脚本


#!/bin/bash

#close servers
for i in `chkconfig --list |awk '{print $1}'`
do
chkconfig $i off;
done

#open servers
for i in crond network haldaemon messagebus udev-post ntpd sshd rsyslog sysstat
do
chkconfig $i on;
done

#close iptables
chkconfig iptables off
chkconfig ip6tables off
/etc/init.d/ip6tables stop
/etc/init.d/iptables stop

#close seliunx
if [ `getenforce` != "Disabled" ];then
  setenforce 0
fi

#about ssh
#sed -i 's/#Port 22/Port 3222/' /etc/ssh/sshd_config
sed -i -e 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
sed -i 's/GSSAPIAuthentication yes/GSSAPIAuthentication no/' /etc/ssh/sshd_config
sed -i 's/#UseDNS yes/UseDNS no/' /etc/ssh/sshd_config
#sed -i 's/X11Forwarding yes/X11Forwarding no/' /etc/ssh/sshd_config
sed -i 's/#PermitEmptyPasswords no/PermitEmptyPasswords no/' /etc/ssh/sshd_config

#modify max openfile and max process
cat >> /etc/security/limits.conf << EOF
*           soft   nofile       655350
*           hard   nofile       655350
*           soft   nproc        655350
*           hard   nproc        655350
EOF

cat >> /etc/security/limits.d/90-nproc.conf << EOF
*           soft   nproc        655350
*           hard   nproc        655350
root        soft    nproc     unlimited
EOF
sed -i 's#exec /sbin/shutdown -r now#\#exec /sbin/shutdown -r now#' /etc/init/control-alt-delete.conf

#modify kernel parameters
cat > /etc/sysctl.conf << EOF
#net.bridge.bridge-nf-call-ip6tables = 0
#net.bridge.bridge-nf-call-iptables = 0
#net.bridge.bridge-nf-call-arptables = 0
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 60000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 1024 65535
EOF
sysctl -p >/dev/null 2>&1

#echo "nameserver 219.141.140.10" >> /etc/resolv.conf


#yum install vim ntpdate lsof -y
#yum install R -y

#/usr/sbin/ntpdate ntp.api.bz

2、执行后的结果如下所示:



猜你喜欢

转载自blog.csdn.net/wyl9527/article/details/79706794