我們的業務使用了nginx、mysql、php、和tomcat,寫了一個自動化安裝這些軟體的指令碼,雖然網上類似的自動安裝指令碼很多,但這個是自己寫的,特此mark一下,希望能給別人一些參考,同時也灰常歡迎看到的朋友們提些改進意見。話不多說,直接上指令碼。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
#!/bin/sh
    alias echo=`echo -e`
    ###判斷系統,此指令碼只適用於64位系統
    machine=`uname -m`
    if [ $machine != x86_64 ] ;then
       echo "e[1;31m 
your system is 32bit,but this script is only run on 64bit !
 e[0m"
       exit -1
    fi 
    ###建立儲存下載檔案的目錄
    mkdir /usr/local/src/auto_install &> /dev/null
    source_dir=/usr/local/src/auto_install
    ###定義一個互動式的選擇提示
function interact {
    echo "Please input "yes" or "no""
    read choice
    case "$choice" in
       no)
          exit 0;;
       yes)
          echo;;
        *)
      echo "e[1;31mInput Errot! e[0m"
          exit -1;;
    esac
}
     ### 定義一個函式檢查上一條命令的執行狀態
function check {
   if [ $? -ne 0 ];then
        echo  "e[1;31m
 the last commond exec failed,please check it !e[0m 
"
    sleep 1
    exit -1
   fi
}
### 定義下載各軟體的函式(此處我隱藏了我們的下載地址,需各位自行設定下載地址)
function download_install_epel {
    cd $source_dir
    rm -f epel* &> /dev/null
    echo "e[1;32m ---yum install epel repo--- e[0m 
"
        
    sys_version=`uname -r|cut -d `.` -f 4`
    if [ $sys_version = el7 ];then
       rpm -qa|grep -i epel > /dev/null
       if [ $? -ne 0 ];then
          wget -nv http://www.example.com/epel-release-7-2.noarch.rpm
          rpm -ivh $source_dir/epel-release-7-1.noarch.rpm
          check;
       fi
    elif [ $sys_version = el6 ];then
       rpm -qa|grep -i epel > /dev/null
       if [ $? -ne 0 ];then
          wget -nv http://www.example.com/epel-release-6-8.noarch.rpm
          rpm -ivh $source_dir/epel-release-6-8.noarch.rpm
          check;
       fi
    fi
}
function download_nginx {
   cd $source_dir
   echo  "e[1;32m
 ---download nginx-1.4.7---e[0m 
"
   ls  nginx-1.4.7.tar.gz &> /dev/null
    if [ $? -ne 0 ];then
          wget -nv  http://www.example.com/nginx-1.4.7.tar.gz
          check;
    fi
}
function download_mysql {
   cd $source_dir
   echo  "e[1;32m
 ---download MySQL-5.5.39---e[0m 
"
   ls mysql-5.5.39-linux2.6-x86_64.tar.gz &> /dev/null
    if [ $? -ne 0 ];then
          wget -nv  http://www.example.com/mysql-5.5.39-linux2.6-x86_64.tar.gz
          check;
    fi
}
function download_php {
   cd $source_dir
   echo  "e[1;32m
 ---download php-5.3.28---e[0m 
"
   ls php-5.3.28.tar.gz &> /dev/null
    if [ $? -ne 0 ];then
           wget -nv  http://www.example.com/php-5.3.28.tar.gz
           check;
    fi
}
function download_jre {
    cd $source_dir
    echo "e[1;32m ---download jre-6u33-linux-x64.bin---e[0m"
    sleep 1
    ls jre-6u33-linux-x64.bin &> /dev/null
    if [ $? -ne 0 ];then
       wget -nv  http://www.example.com/jre-6u33-linux-x64.bin
       check;
    fi
}
       ###定義依賴包安裝函式
function dependence_install {
    download_install_epel;
    echo "e[1;32m ---yum install the Dependencies software--- e[0m 
"
  
    sleep 1
    pgrep yum|xargs kill -9 > /dev/null
    rm -f /var/run/yum.pid > /dev/null
    echo "yum install gcc zlib cmake libxml2 libxml2-devel bzip2 bzip2-devel curl curl-devel libjpeg libjpeg-devel libpng libpng-devel freetype-devel pspell-devel libmcrypt libm
crypt-devel freetype pcre-devel openssl openssl-devel libaio*"
    yum -y install gcc zlib cmake libxml2 libxml2-devel bzip2 bzip2-devel curl curl-devel libjpeg libjpeg-devel libpng libpng-devel freetype-devel pspell-devel libmcrypt libmcry
pt-devel freetype pcre-devel openssl openssl-devel libaio* >/dev/null 2>&1
    check;
}
       ### 定義mysql安裝函式###
function mysql_install {
     
       ###判斷本機是否已在執行mysql,或者開機啟動項有沒有mysql###
       ###判斷機器上是否以執行mysql例項
    echo "e[1;32m 
 ---check if there is already installed mysql instence---e[0m
"
    ps -ef|grep -w mysqld|grep -v "grep" &> /dev/null
    if [ $? -eq 0 ];then
       mysqlbasedir=`ps -ef|grep -w "mysqld"|grep -v "grep"|awk `{print $9}`|tr -d `--``
       mysqldatadir=`ps -ef|grep -w "mysqld"|grep -v "grep"|awk `{print $10}`|tr -d `--``
       echo "e[1;32m your system has run a mysql instance already 
 mysqlbasedir is: "
$mysqlbasedir"
 mysqldatadir is: "
$mysqldatadir"
 do you still want to install a new mysql-server? e[0m
"
       interact;
    fi
        ###判斷系統是否已經有rpm方式安裝的mysql
     echo "MySQL-server-5.5.39-2.el6.x86_64.rpm"|while read line
     do
         prefix=`echo "$line"|awk -F "-" `{print $1"-"$2}``                             ##to get like "MySQL-server"
         rpm -qa|grep -i "$prefix" &> /tmp/check_mysql.log
     if [ $? -eq 0 ];then
           already_install=`cat /tmp/check_mysql.log|awk -F "-" `{print $1"-"$2"-"$3}``   ##to get the already installed mysql version
           echo "e[1;31m ---the $already_install is already installed by rpm!--- 
 ---Do you really want to install a new mysql?--- e[0m
"
           interact;
         fi
      done
        ###判斷chkconfig裡面是否有mysql啟動指令碼並且為開機啟動
    chkconfig |grep mysql|awk `{print $5" "$7}`|grep -e "啟用" -e "on" &> /dev/null
    if [ $? -eq 0 ];then
       echo " there is a bootstart mysql script in the chkconfig,please check"
       exit 0
    fi
        
        ###判斷/etc/rc.local檔案裡是否有mysql啟動命令
    cat /etc/rc.local|grep "mysqld" &> /dev/null
    if [ $? -eq 0 ];then
       echo " there is a bootstart mysql commond in the /etc/rc.local,please check it"
       exit 0
    fi   
        ######判斷結束######
     
    ###檢查是否有系統自帶的mysql-lib-5.1,有則刪除
    rpm -qa|grep -i -e "mysql.*5.1.*"|xargs rpm -e --nodeps 2> /dev/null
        ###互動式選擇mysql安裝路徑
    echo  "e[1;31m where do you want to install mysql(default is /usr/local/mysql)e[0m"
    read mybasedir
    if "$mybasedir" "" ];then
       mybasedir=/usr/local/mysql
    fi
       ###選擇data目錄
    echo  "e[1;31m where do you want to storage mysql data(default is /usr/local/mysql/data)e[0m"
    read mydatadir
    if "$mydatadir" "" ];then
       mydatadir=/usr/local/mysql/data
    fi    
     
       ###開始安裝mysql
    echo "e[1;32m ---now start to install mysql---e[0m
"
    sleep 1
    #dependence_install;
    echo "e[1;32m ---add user mysql---e[0m"
    useradd mysql -s /sbin/nologin
     
    echo "e[1;32m
 ---unpack mysql-5.5.39-linux2.6-x86_64.tar.gz---e[0m"
    cd $source_dir
    tar zxf mysql-5.5.39-linux2.6-x86_64.tar.gz
    check;
    rm -rf $mybasedir
    mv mysql-5.5.39-linux2.6-x86_64 $mybasedir
     
       ###判斷/etc下是否有my.cnf,若有,重新命名為my.cnf.bak
    ls /etc/my.cnf &> /dev/null
    if [ $? = 0 ];then
       mv /etc/my.cnf /etc/my.cnf.bak
       echo "e[1;32m
 ---detected /etc/my.cnf is already exit,rename it to /etc/my.cnf.bak--- e[0m 
"
    fi
    cp $mybasedir/support-files/my-huge.cnf /etc/my.cnf
       ###拷貝開機啟動指令碼到/etc/init.d/
    ls /etc/init.d/mysql &> /dev/null
    if [ $? = 0 ];then
       mv /etc/init.d/mysql /etc/init.d/mysql.bak
       echo "e[1;32m ---detected /etc/init.d/mysql is already exit,rename it to /etc/init.d/mysql.bak---e[0m"
    fi
    cp $mybasedir/support-files/mysql.server /etc/init.d/mysql
       ###修改/etc/init.d/mysql指令碼里面basedir和datadir
    sed -i -e "/^basedir*=$/iasedir=$mybasedir" -e "/^datadir*=$/idatadir=$mydatadir" /etc/init.d/mysql
    sed -i -e `/^basedir*=$/d` -e `/^datadir*=$/d` /etc/init.d/mysql   
       ###初始化資料庫
    echo "e[1;32m
 ---initialize mysql database---e[0m"
    sleep 1
    chown -R mysql $mydatadir $mybasedir >/dev/null 2>&1
    $mybasedir/scripts/mysql_install_db --defaults-file=/etc/my.cnf --user=mysql --basedir=$mybasedir --datadir=$mydatadir
    check;
       ###將basedir/bin/新增到PATH
    echo "PATH=$PATH:$mybasedir/bin" >> /etc/profile
    export PATH=$PATH:$mybasedir/bin
     
    echo "e[1;32m install mysql success,you can run "service mysql start" to start the mysql 
 do not forget to set a password for mysql e[0m"
    ###至此mysql安裝完畢
}
    ### 定義nginx安裝函式
function nginx_install {
    echo
    echo "e[1;32m ---start installing nginx,it`s basedir is /usr/local/nginx--- e[0m 
"
    sleep 1
    cd $source_dir
    ls -l |grep "^d"|grep nginx|xargs rm -rf &> /dev/null
    tar zxf nginx-1.4.7.tar.gz
    check;
    cd nginx-1.4.7
echo "e[1;32m ---configure: configure information in /tmp/configure_nginx.log--- e[0m 
"
    sleep 1
    ./configure --with-http_stub_status_module  --prefix=/usr/local/nginx &> /tmp/configure_nginx.log
    check;
echo "e[1;32m ---make: make information in /tmp/make_nginx.log--- e[0m 
"
    sleep 1
    make &> /tmp/configure_nginx.log
    check;
echo "e[1;32m ---make install: install into /usr/local/nginx--- e[0m 
"
    sleep 1
    make install &> /tmp/make_install.log
    check;
    echo "e[1;32m nginx is installed successfully e[0m 
"
}
    ### 定義php安裝函式
function php_install {
    dependence_install;
    cd $source_dir
    ls -l |grep "^d"|grep php|xargs rm -rf &> /dev/null
    tar zxvf php-5.3.28.tar.gz &> /dev/null
    check;
    cd php-5.3.28
    echo
    echo "e[1;32m ---configure php: information in /tmp/php_configure.log--- e[0m 
"
    echo "./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-mysql --with-mysqli  --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-discard-path --enable-safe-mode --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curlwrappers --enable-mbregex --enable-fastcgi --enable-fpm --enable-force-cgi-redirect --enable-mbstring --with-mcrypt --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-iconv-dir=/usr/local --with-zlib --enable-zip --with-curl"
    ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-mysql --with-mysqli  --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-discard-path --enable-safe-mode --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curlwrappers --enable-mbregex --enable-fastcgi --enable-fpm --enable-force-cgi-redirect --enable-mbstring --with-mcrypt --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-iconv-dir=/usr/local --with-zlib --enable-zip --with-curl &> /tmp/php_configure.log
    check;
     
    ###make
    echo "e[1;32m ---make php: information in /tmp/php_make.log--- e[0m 
"
    make &> /tmp/php_make.log
    check;
    ###make install
    echo "e[1;32m ---make install php: install into /usr/local/php--- 
 ---php cofigure file in the /usr/local/php/etc--- e[0m 
"
    make install /tmp/make_install_php.log
    check;
     
    echo "e[1;32m ---prepare php configure files--- e[0m 
"
    echo "cp $source_dir/php-5.3.28/php.ini-production /usr/local/php/etc/php.ini"
    cp php.ini-production /usr/local/php/etc/php.ini
    echo "cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf"
    cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
    echo "e[1;32m
 php is installed successfully!
 now,please start php and modification the php.ini e[0m"
}
    ###安裝jre
function jre_install {
    ###刪除系統自帶的java
    rpm -qa|grep java|xargs rpm -e --nodeps
     
    cd $source_dir
    rm -rf jre1.6.0_33 &> /dev/null
    chmod +x jre-6u33-linux-x64.bin &> /dev/null
    ./jre-6u33-linux-x64.bin >/dev/null 2>&1
    check;
    ls -d /usr/java
    if [ $? -ne 0 ];then
       mkdir /usr/java &> /dev/null
    else
       echo echo "e[1;31m /usr/java has already exits,move to /usr/java_bak !e[0m"
       mkdir /usr/java_bak  &> /dev/null
       mv /usr/java//usr/java_bak/
    fi
    mv  jre1.6.0_33 /usr/java/
    echo "e[1;32m
 ---add java path to /etc/profile---e[0m"
    sleep 1
     
    echo  >>/etc/profile
    echo `JAVA_HOME=/usr/java/jre1.6.0_33`>>/etc/profile
    echo `CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/rt.jar`>>/etc/profile
    echo `PATH=$JAVA_HOME/bin:$PATH:$HOME/bin:$JAVA_HOME/jre/bin`>>/etc/profile
    echo `export  PATH JAVA_HOME`>>/etc/profile
    source /etc/profile
    echo "e[1;32m
 JRE is installed success !e[0m"
    echo "e[1;32m
 ---install cronolog---e[0m"
    wget -nv http://www.example.com/cronolog-1.6.2.tar.gz
    dependence_install;
    tar zxf cronolog-1.6.2.tar.gz
    cd cronolog-1.6.2
    ./configure &> /tmp/cronolog_configure.log && make /dev/null && make install /dev/null
    check;
    echo "e[1;32m cronolog is installed successe[0m
"
}
    ###下面開始選擇那些軟體需要安裝
echo "e[1;31m
 ---選擇哪些軟體需要安裝--- e[0m 
"
echo "e[1;32m "Nginx"      INPUT "1" e[0m 
"
echo "e[1;32m "Mysql"      INPUT "2" e[0m 
"
echo "e[1;32m "Php"        INPUT "3" e[0m 
"
echo "e[1;32m "JRE"        INPUT "4" e[0m 
"
#echo "e[1;32m "Tomcat"     INPUT "5" e[0m 
"
read -p "please choice which software do you want to install ?" input
     
    if [ $input = 1 ];then
           download_nginx;
           dependence_install;
           nginx_install;
    elif [ $input = 2 ];then
       download_mysql;
           mysql_install;
    elif [ $input = 3 ];then
           echo "e[1;32m
 php needs mysqlclient e[0m"
           echo "e[1;32m so if you had already install a mysqlclient
 please make a softlink for all "libmysqlclient.so.*" file to both /var/lib64 and /var/lib e[0m
"
           echo "e[1;31m Please input your choice
e[0m e[1;32m1: go on by default(install mysql-client-5.5.39)
 2: I will check my "libmysqlclient.so.*" file and redo this script later
 3: I had make the softlinks and I want to going on e[0m"
           read choice
           case "$choice" in
             1)
               cd $sourcedir
               echo "e[1;32m ---download mysql-client rpm files---e[0m"
               wget -nv http://www.example.com/MySQL-client-5.5.39-2.el6.x86_64.rpm
               wget -nv http://www.example.com/MySQL-devel-5.5.39-2.el6.x86_64.rpm
               wget -nv http://www.example.com/MySQL-shared-5.5.39-2.el6.x86_64.rpm
               echo "e[1;32m
 ---install mysql-client in the way of rpm---e[0m"
               sleep 1
               rpm -ivh MySQL-client-5.5.39-2.el6.x86_64.rpm MySQL-devel-5.5.39-2.el6.x86_64.rpm MySQL-shared-5.5.39-2.el6.x86_64.rpm
               download_php;
               ###make soft link from /usr/lib64/libmysqlclient* to /usr/lib/
               ls -l /usr/lib64/libmysqlclient*|grep -v "^l"|awk `{print $NF}`|while read line
                 do
                   usrlib_fulldir=`ls -l /usr/lib64/libmysqlclient*|grep -v "^l"|awk `{print $NF}`|sed `s/lib64/lib/``
                   ln -s $line $usrlib_fulldir
                 done
                
               php_install;
               ;;
            2)
               exit 0;;
            3)
               download_php;
               php_install;
               ;;
            *)
               echo "Input Errot!" && exit -1;;
          esac
     
     elif [ $input = 4 ];then
           download_jre;
           jre_install;
     else
       echo "e[1;31m your input is worng!e[0m"
       sleep 1
       exit -1
     fi