产品经理提出需求,公司的开放平台有三个模块,分别是openweb、openapi、openhls、opencms,他们每一次部署都会被放到一个“Lecheng_Open.1.0.1.日期.tar.gz”的压缩包里,以openweb模块和opencms模块为例,他俩都是java模块,而zk也是java模块,整个安装的过程如下:
第一步将安装包放到/mnt/下 (注:其实除了放在/mnt/hswx下面外,其他服务器的任何路径上都可以放这个安装包)
第二步解压包文件:tar –xzvf Lecheng_Open.1.0.1.日期.tar.gz
第三步进入解压后的文件夹:cd Lecheng_Open.1.0.1.日期
第四步执行openweb启动脚本:sh install.sh openweb.zip (前提是需要先启动 zk)
整个脚本如下:
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 | #################################################################################### #coding=utf-8 #脚本用途:OPENWEB和OPENCMS服务自动化安装脚本 #编写时间:2016年9月18日 #脚本作者:乐橙运维组 #################################################################################### #!/usr/bin/env python #载入模块 import commands import os import time import glob #确认安装包的版本号和本机的模块名称 name = commands.getoutput( 'cat /etc/role_install|head -1' ) os.environ[ 'name' ] = str (name) bagname = glob.glob( "/share/yunwei/Lecheng_Open*" ) bagname = ''.join(bagname) path = bagname[ 14 : 41 ] os.environ[ 'path' ] = str (path) print "本次的部署包名字是:" + path print "请检查,如果大包版本号不正确,请ctrl+c退出本脚本。" time.sleep( 5 ) #将原有的hswx保存成备份,方便回滚 def CopyHswx(): if os.path.exists( "/mnt/hswx" ) = = True : os.system( "mv /mnt/hswx /mnt/hswx+$(date +%y%m%d)" ) os.system( "rm -rf /mnt/Lecheng_Open*" ) else : os.system( 'echo "*/1 * * * * source /etc/profile && python /share/yunwei/script/watchDog/open/$name/$name-Check.py > /dev/null 2>&1">> /var/spool/cron/root' ) print ( "crontab 已经添加..." ) time.sleep( 2 ) #判断并且获取本机角色文件内容 def GetName(): if os.path.exists( "/etc/role_install" ) = = False : print ( "本台机器不存在模块名文件/etc/role_install,脚本将跳出!" ) exit( 0 ) else : print ( "本台机器所安装的模块名是:" ) + name print ( "请检查,如果模块名不匹配,请ctrl+c退出本脚本。" ) time.sleep( 5 ) #杀死之前启动的zk和进程 def KillProcess(): os.system( "pkill -9 java" ) print ( "zk停止完毕,现在停止原有进程..." ) time.sleep( 3 ) #将安装包放到/mnt/下,并且拆包解压缩 def CopyFile(): os.system( "tar -zxvf /share/yunwei/Lecheng_Open*.tar.gz -C /mnt" ) print ( "整个大包已经解压,并且把zkclient和所需模块复制到/mnt/hswx!" ) time.sleep( 3 ) #进入解压后的文件夹,执行文件启动脚本 def Start(): os.system( "mkdir /mnt/hswx" ) os.system( "unzip /mnt/$path/zkclient.zip -d /mnt/hswx" ) os.system( "cp -rf /mnt/hswx/build/* /mnt/hswx" ) os.system( "chmod u+x /mnt/hswx/zkclient/* *.* ; sh /mnt/hswx/zkclient/start_zkclient.sh" ) print ( "现在进入" ) + path print ( "启动" ) + name + ( "模块" ) time.sleep( 3 ) os.system( "cd /mnt/$path ; sh install.sh $name.zip" ) #展示进程 def Show(): if name = = "openweb" : print "openweb的进程情况如下" os.system( "ps -ef | grep java" ) if name = = "opencms" : print "opencms的进程情况如下" os.system( "ps -ef | grep java" ) if __name__ = = '__main__' : CopyHswx() GetName() KillProcess() CopyFile() Start() Show() print ( "整个脚本执行完毕,感谢您的使用~" ) |
这个脚本有一个小瑕疵,就是先从/etc/role_install里获取模块名,而后来判断/etc/role_install是否存在,但是这个不耽误事儿。主要是懒得转换全局变量了。
新的知识点!(敲黑板)
1) python判断文件是否存在,普遍使用的是os.path.exists("文件的绝对路径"),但是这种方法是不支持模糊查询的,也就是不支持*和?,但是在实际生产中,产品经理给你的包往往前面是相同的,但是后缀不同(因为后缀是版本号),于是遇到这样的问题。就不能使用os.path.exists,而是要使用glob。如图:
2)python和shell之间互相传递变量是很常见的行为,一般来说python----〉shell都是使用os.environ。
比如在python建立的变量叫“abc”,那么os.environ("abc")=str(abc),就可以在shell语言里使用了。
但是要注意,这个os.environ只能传递字符串!!!
在本文的例子里,我先建立了一个叫name的,这个name是字符串,是可以直接传递的。后来我又建立了一个叫bagname,这个bagname是从glob上获取的,他不是字符串,而是list,所以不能通过os.environ传递。
list如何转化成str? 答案是:str="".join(list)
3)shell下单引号会取消掉变量的意思,也就是说假如有一个变量是name,如果是‘$name',那么打印出来的就是$name,而双引号不会抹杀掉$的特殊性。这一点在本案例中添加看门狗那一段表现的很清楚。
本文转自 苏幕遮618 51CTO博客,原文链接:http://blog.51cto.com/chenx1242/1853959