一键安装配置tomcat脚本的多层考虑
对于这个一键脚本,我最初的想法是比较简单的,就是将所有安装的命令都一行行的写好,然后使用固定的命令,一键执行就等于成功了,第一版的内容如下:
#!/bin/bash user=$1 dr=$2 #关闭防火墙 sudo systemctl stop firewalld.service sudo systemctl disable firewalld.service sudo systemctl disable firewalld.service #修改内核参数 sudo cp /etc/security/limits.conf /etc/security/limits.conf_bak sudo echo "* soft nproc 65535" >> /etc/security/limits.conf sudo echo "* hard nproc 65535" >> /etc/security/limits.conf sudo echo "* soft nofile 65536" >> /etc/security/limits.conf sudo echo "* hard nofile 65536" >> /etc/security/limits.conf #创建运行用户和目录 sudo groupadd $user;useradd -g $user $user sudo echo "tom!23cat" | passwd $user --stdin sudo chown -R $user:$user /$dr/* sudo chmod 755 -R /$dr/* sudo mkdir -p /$dr/software/ sudo chmod 777 /$dr/software/ #修改防火墙参数 cp /etc/selinux/config /etc/selinux/config_bak se1=`grep ^SELINUX= /etc/selinux/config | grep -v "#"|awk -F'=' '{print $NF}'` sed -i -e "s/$se1/disabled/g" /etc/selinux/config grep ^SELINUX= /etc/selinux/config | grep -v "#"
然而,当我给上司看了的时候,瞬间惊呆了,因为太烂了,运维5年写出如此幼稚的安装脚本,有如下的问题需要判断:
1、若是运行用户或者安装目录已存在,有做判断?不存在,又有做判断?
2、怎么确定你limits配置没有错误?
3、若是给了多个参数,脚本又如何判断是否执行?
4、若是执行创建的用户名称或者目录,包含特殊字符,执行是否停止,有做判断?如何限制只允许用户使用数字或者字母创建?
5、怎么判断tomcat安装成功?
6、是否有安装完成后,就能让人知道那些账号密码还有访问路径等信息?
7、/这个符号的问题,如何保证目录名称无论是是/a/b 或者ab/sb/等,都可以正常创建?
8、若是脚本跟安装文件,不在同一个目录下,是否做了执行判断?如安装脚本是调用当前目录下的,tomcat目录文件,若是当前目录没有,又会怎么样?
涵盖了上述的问题,一直修改了很多次,最终完成了下面这个可用的版本,跟最初的版本差距甚大,脚本里面涵盖的命令不难,只是没有深思,之前完全没有考虑那么多,导致出版写那么糟糕
同时主要原因是之前考虑的层面太浅显了,没有多层次的,深入去思考,各个方面的可能引发安装失败的问题,希望以此为鉴。
1 #!/bin/bash 2 ###安装目录文件检测,确认安装文件跟脚本是在同一个目录下## 3 for i in {tomcat,jdk1.8.0_251} 4 do 5 Path=`pwd`/$i 6 if [[ -d "$Path" ]] 7 then 8 echo $i 9 else 10 eche “$i,不存在,请确认执行脚本所在的目录是否存在安装文件” 11 exit 1; 12 fi 13 done 14 ###安装前判断命名,只能输入两个参数,多或者少都会退出##### 15 [ $# -ne 2 ] && { 16 echo “缺少参数,不要使用特殊字符命名,请使用这个格式执行安装命令: sh install.sh 运行用户名 运行目录名,且只允许使用字母或者数字命名用户或者目录,如sh install.sh ap123ps /abc/abs/ 或 sh install.sh apps /abc/ 或 sh install.sh ags /ab/c/等“; 17 exit 1; 18 } 19 ###这行是为了去掉/这个符号,方便去确认目录名称,是否包含特殊符号 20 dr_tmp=`echo $2| sed -e 's/\///g'` 21 for i in {$1,$dr_tmp} 22 do 23 ####$i这个字符串里面是否只有一个或者多个的数字、大或小写的字母,如果有那么命名正确##### 24 if [[ $i =~ ^[a-z\|A-Z\|0-9]+$ ]] 25 then 26 echo $i 命名正确 27 else 28 echo $i 命名有误,请用字母或数字,重新执行安装 29 exit 1; 30 fi 31 done 32 user=$1 33 #####这行就是为了清楚 目录名称首尾的/,避免下面的代码里面出现//a//这样的情况出现#### 34 dr=`echo $2 | sed -e "s/^\///g" |sed -e "s/\/$//g"` 35 echo "开始安装,预计两分钟内完成" 36 echo "安装用户 $user " 37 38 ##函数设置,判断用户是否存在,使用mkdir -p 不管目录是否存在都可以执行成功,所不需要加判断## 39 user_create_check(){ 40 b=`cat /etc/passwd | awk -F':' '{print $1}' | grep ^$user$` 41 if [[ $user == $b ]] 42 then echo “用户已经存在” 43 sudo mkdir -p /$dr/ 44 sudo mv jdk1.8.0_251 tomcat /$dr/ 45 sudo chown -R $user:$user /$dr/* 46 sudo chmod 755 -R /$dr/* 47 sudo mkdir -p /$dr/software/ 48 sudo chmod 777 /$dr/software/ 49 echo “运行tomcat用的户和目录准备完成” 50 else 51 sudo groupadd $user;useradd -g $user $user 52 sudo echo "tom#123cat" | passwd $user --stdin 53 sudo mkdir -p /$dr/ 54 sudo mv jdk1.8.0_251 tomcat /$dr/ 55 sudo chown -R $user:$user /$dr/* 56 sudo chmod 755 -R /$dr/* 57 sudo mkdir -p /$dr/software/ 58 sudo chmod 777 /$dr/software/ 59 echo “运行tomcat用的户和目录准备完成” 60 fi 61 } 62 63 limit_wirte_check(){ 64 limit=`tail -4 /etc/security/limits.conf | grep ^\*| awk -F" " '{print $NF}' | awk '{sum += $1};END {print sum}'` 65 limi_sum=262142 66 if [[ $limit -eq $limi_sum ]] 67 then echo “内核参数配置完成” 68 else 69 echo “内核参数配置未完成,请手动向/etc/security/limits.conf 添加:* soft nproc 65535 ,* hard nproc 65535 ,* soft nofile 65536 ,* hard nofile 65536,这四行配置” 70 fi 71 } 72 #创建用户和修改tomcat目录权限 73 user_create_check 74 #关闭防火墙 75 sudo systemctl stop firewalld.service 76 sudo systemctl disable firewalld.service 77 sudo systemctl disable firewalld.service 78 #修改内核参数 79 sudo cp /etc/security/limits.conf /etc/security/limits.conf_bak 80 sudo echo "* soft nproc 65535" >> /etc/security/limits.conf 81 sudo echo "* hard nproc 65535" >> /etc/security/limits.conf 82 sudo echo "* soft nofile 65536" >> /etc/security/limits.conf 83 sudo echo "* hard nofile 65536" >> /etc/security/limits.conf 84 limit_wirte_check 85 #修改防火墙参数 86 cp /etc/selinux/config /etc/selinux/config_bak 87 se1=`grep ^SELINUX= /etc/selinux/config | grep -v "#"|awk -F'=' '{print $NF}'` 88 sudo sed -i -e "s/$se1/disabled/g" /etc/selinux/config 89 sudo grep ^SELINUX= /etc/selinux/config | grep -v "#" 90 #修改环境参数 91 sudo cp /etc/profile /etc/profile_bak 92 sudo echo "export JAVA_HOME=/$dr/jdk1.8.0_251" >> /etc/profile 93 sudo echo "export JAVA_BASE=/$dr/jdk1.8.0_251" >> /etc/profile 94 sudo echo "export PATH=\$PATH:\$JAVA_HOME/bin" >> /etc/profile 95 96 #创建运行用户,配置运行环境参数 97 sudo cp /home/$user/.bash_profile /home/$user/.bash_profile_bak 98 sudo echo "export CATALINA_HOME=/$dr/tomcat" >> /home/$user/.bash_profile 99 sudo echo "export CATALINA_BASE=/$dr/tomcat" >> /home/$user/.bash_profile 100 ###这里$里面多一个\是为了转义,让它以字符串的形式重定向到文件里面,这样写入的和看到的内容才会一致### 101 sudo echo "export PATH=\$PATH:\$CATALINA_HOME/bin" >> /home/$user/.bash_profile 102 sudo chmod 755 /home/$user/.bash_profile 103 sudo chown $user.$user -R /home/$user/ 104 echo $user passwd:"tom!23cat" 105 su - $user -c "source ~/.bash_profile" 106 su - $user -c "startup.sh" 107 sleep 10s 108 su - $user -c "curl localhost:8880" 109 echo -e 110 echo “web访问测试路径 http://服务器公网访问地址:8080,本地访问localhost:8880“ 111 echo “tomcat运行用户$user ,如果它是新建的用户,那么$user访问密码tom#123cat” 112 echo “tomcat安装目录 /$dr/”