场景是这样的,新接手的项目,在国外的服务器有10多台,国内的几台,部署要求在ant代码前必须全备份上一个版本,早上登录了国内的几台机器操作后,一阵烦躁,看到四川人民在受苦受难,自己的家人也遭受了几次余震,远方的人可能更加担心。尝试了下 ssh 执行远程命令,无奈于仅有的普通用户权限,写了个 sh脚本,可以ssh到每台机器执行进行备份,但是每次都要输入密码,郁闷非常。先贴一下这个 备份脚本
echo "start dump tomcat source " # config your web project name project_name=test # default you can rewrite date_str=$(date +%Y%m%d) # config path extdir='/data/apache-tomcat/webapps/' cd $extdir # default sudo tar -zcvf $project_name$date_str.tar.gz $project_name echo "dump success the file at "$extdir$project_name$date_str".tar.gz"
这个会在你的工程文件夹下生成部署文档要求的备份文件,然后通过scp 命令将该文件都下载到了20台机器中,又一阵吐血
当要一个个ssh执行脚本,但是每次都要输入密码,就胃疼的厉害,于是有了下面的偷懒脚本
#!/usr/bin/expect -f set time 30 set ipaddr "192.168.1.111" set ipport "212" set username "duplicatedcode" set password "duplicatedcode" set sh_path "/home/duplicatedcode/script/dumpTomcatSource.sh" spawn /usr/bin/ssh -p $ipport $username@$ipaddr "sh $sh_path" expect { "yes/no" {send "yes\r";exp_continue} "password:" {send "$password\r"} } expect "*]#" exit
此时新的问题又出现了,我每次多要更改此文件,ip,端口,用户名,密码,地址,所有就有了下面的脚本
dumpFunction.sh
#!/usr/bin/expect -f set time 30 set ipaddr [lindex $argv 0] set ipport [lindex $argv 1] set username [lindex $argv 2] set password [lindex $argv 3] set sh_path [lindex $argv 4] spawn /usr/bin/ssh -p $ipport $username@$ipaddr "sh $sh_path" expect { "yes/no" {send "yes\r";exp_continue} "password:" {send "$password\r"} } expect "*from*"
其实就是封装了一个方法,然后传入动态的参数,能够批量执行,又有下面的脚本
#!/bin/bash # config syscofle file_path=dump.conf #config sh path sh_dir=/home/duplicatedcode/script/dumpFunction.sh #i # ipaddr for i in `awk '{print $1}' $file_path` do # ipport j=`awk -v I="$i" '{if(I==$1)print $2}' $file_path` #username k=`awk -v I="$i" '{if(I==$1)print $3}' $file_path` #password l=`awk -v I="$i" '{if(I==$1)print $4}' $file_path` #sh_path m=`awk -v I="$i" '{if(I==$1)print $5}' $file_path` expect $sh_dir $i $j $k $l $m done
awk 很久之前用过处理文件,现在又还回去了,这个sh脚本肯定有优化的空间,但是时间紧迫,就先这么着吧,虽然写的萌些,但是易读,大体的意思是读取dump.conf 文件,然后分解出需要的参数,一个for循环 执行代码,配置文件如下:
192.168.162.1 222 username password /home/duplicatedcode/script/dumpTomcatSource.sh 192.168.162.2 222 username password /home/duplicatedcode/script/dumpTomcatSource.sh 192.168.162.3 222 username password /home/duplicatedcode/script/dumpTomcatSource.sh
配置文件中格式是
ip 端口 用户名 密码 脚本地址
就是这么简单,然后我在一台机器上执行 dumpAll.sh 全部机器就按照部署规范进行备份了
知识点:一个是自动填充密码的,except 具体使用方法可自行google
简单的sh脚本
扩展支持:
如果你的应用服务器是用tomcat 那你可以找一个tomcat自启动脚本,然后像上述的思路中替换sh脚本,就可以达到全服务器重启tomcat了,当然要一台台启动,顺序来,不然蛋疼的是你自己,想想你kill掉所有的tomcat 然后启动不来的场景,启动后,最重要的就是服务的可用性,那你可以写个wget脚本,每台机器load数据,看看数据库连接,tomcat是否启动成功等也是可以的。
上面的有点像自动部署了,上面只是服务器端的自动部署的思路,包括备份,重启 ,最蛋疼的是代码的增量同步,全量覆盖谁多会做,难点在增量,我想可以结合svn的版本号来搞,服务器上直接源代码,然后增量同步代码,全量编译代码。ps:一些自动同步代码的工具列如rsync都可以实现增量,但是对比文件的时候cpu很高,基本是处于down掉的情况下,如果你的目录很多的话,你也可以取个巧,利用vi命令,在变化的目录中维护一个readme的文件,利用vi命令可以使文件夹最后修改时间的传递性,达到检查文件也能增量来比较,或者比较多不用了,直接覆盖,这样或许你需要修改rsync的源代码了,可能不可取。
另外一种比较好的策略是,分流,做三级的rsync,1-3-9这种模式,每台机器管理同步3台机器,减少每台机器的压力,或者你自己实现一个jsp来检查文件修改时间,然后通过ftp覆盖也都是可以的,最终的目的都是在利用少量的成本下达到代码的分发效果。
或许我有兴趣搞个可以用的自动部署方案出来。(待续)