设为首页 收藏本站
查看: 1211|回复: 0

[经验分享] 使用python构建一个简单的发布系统

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-11-23 09:01:38 | 显示全部楼层 |阅读模式
                      一、流程

  通过前端上传要发布的压缩包,逻辑端获取后将压缩包分发到远程服务器上,并执行远程服务器上使用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)





效果图
wKioL1gz72aR3fhsAABK27kRcDw286.jpg
更新历史

wKioL1gz8APjVzwTAABPFmpHFAE501.jpg



                   


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-304265-1-1.html 上篇帖子: 用python实现子网掩码地址与位长的相互转换 下篇帖子: python 之根据自己的需求配置hostname python
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表