产品经理提出需求,公司的开放平台有三个模块,分别是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