|
一、流程
通过前端上传要发布的压缩包,逻辑端获取后将压缩包分发到远程服务器上,并执行远程服务器上使用shell编写的发布脚本,实现代码发布。
二、前端文件上传代码
1
2
3
4
5
6
7
8
9
| <form id="codeForm" method='post' action='/code/' class="form-horizontal nice-validator n-yellow" novalidate="novalidate" enctype='multipart/form-data'>
<div class="form-group">
<label for="package" class="col-sm-2">需要上传的包<span class="red-fonts">*</span></label>
<br>
<div class="col-sm-12">
<input id="package" name="package" type="file" datatype='*'/><!-- 上传时type为file -->
</div>
</div>
</form>
|
三、逻辑端
1、保存文件到指定位置
1
2
3
4
5
6
7
8
| import os
fpath = '/usr/local/zip/'
file = request.files.get('package') # 获取压缩包
filename = secure_filename(file.filename) # 确保文件格式正确
if '.' in filename and filename.split('.',1)[1] == 'zip': # 确保文件是*.zip格式
where = os.path.join(fpath,filename)
file.save(where) # 保存为where指定的路径
|
2、将文件分发到远程服务器,并执行远程命令
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
| app.config.from_object(RemoteHost)
hosts = []
for i in app.config:
if re.findall('HOST.',i): # 正则匹配HOST.类型
hosts.append(app.config.get(i))
# hosts格式为[['192.168.1.100', 22, 'root', '123456'],['192.168.1.101', 22, 'root', '123456'],...]
def trans(where,filename):
ssh = paramiko.SSHClient() # 初始化ssh对象
comm = '/root/test.sh '+where # 远程服务器上要执行的命令
for i in hosts:
# 文件传输
tus = (i[0],i[1])
t = paramiko.Transport(tus)
t.connect(username=i[2],password=i[3])
sftp = paramiko.SFTPClient.from_transport(t) # 初始化sftp对象
sftp.put(where,'/tmp'+filename) # 传输到'/tmp'下
t.close()
# 执行远程命令
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 允许连接不在know_hosts文件中的主机(可选项)
ssh.connect(i[0],i[1],i[2],i[3],timeout=10)
stdin,stdout,stderr = ssh.exec_command(comm) # 执行远程命令
ssh.close()
|
四、数据端
将前端获取的一些其他数据保存到数据库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| data = dict((k,v[0]) for k,v in dict(request.form).items()) # message, key, project
key = data.pop('key')
data['update_persion'] = session.get('name') # 添加执行人
data['package'] = filename # 添加上传的包名
conditions = [ "%s='%s'" % (k,v) for k,v in data.items()]
if key == 'abcde': # 许可码正确就执行操作
try:
trans(where,filename)
db.add('code',conditions) # 写入数据库
return render_template('/code/code.html',result='更新成功!',role = role)
except Exception, e:
errmsg = '失败信息 error: '+str(e)
return render_template('/code/code.html',result=errmsg,role = role)
else:
return render_template('/code/code.html',result='许可码无效!',role = role)
|
效果图
更新历史
|
|