Flask实现软件自动安装

本文介绍如何使用Celery和Flask实现后台任务管理,具体实现将安装过程放入后台执行,通过Redis作为消息队列,并定时获取安装日志。

最近在开发一个使用系统下发开源软件,然后自动安装,最后把安装日志显示在网页上的一个功能。开发过程中,想把安装任务放到后台跑,本来打算使用linux命令nohup等能实现,但在Flask上却使用无法实现丢到后台去运行,后续在网上找到了celery。celery实现了把安装软件的程序放到后台执行,然后把执行日志打印到文件上。ajax定时去请求这个文件,并把日志展示在网页上,如下截图(图为自动化安装zabbix agent):

152146_7ez6_1588616.png

152232_ijSD_1588616.png

 

celery的安装跟flask的安装一样,使用pip install celery即可。我开发使用的是python 2.7版本的,使用2.6的celery无法使用redis做为队列,可能是我找的资料还不够全面。

celery安装完成后跟flask结合的代码如下,使用的队列是redis队列,所以python还要加个redis扩展:

from celery import Celery
app.config['CELERY_BROKER_URL'] = 'redis://127.0.0.1:6379/0'
celery = Celery(app.name, broker=app.config['CELERY_BROKER_URL'])
celery.conf.update(app.config)

 

celery放任务在flask的写法如下,这里是ssh远程到机器执行软件的安装脚本,然后把安装的日志记录重定向到web目录下的一个txt文件,ajax来获取安装的日志:

@celery.task
def my_background_task(ip, command):
    commands.getstatusoutput(
        '''ssh %s '%s' >/root/ops_web/ops_web/static/html/install_result.txt 2>&1'''
        % (ip, command))

 

celery任务需要启动celery进程,celery进程启动目前原理也不是太清楚,网上查到的启动方式如下(使用的redis,还需要启动redis进程):

/usr/local/python/bin/celery -A ops_web.celery worker

 

先把开源软件和安装脚本下放到需要安装的机器上,然后ssh登录到远程机器并运行安装软件的脚本,脚本和开源软件的下放可以使用Flask借用python的scp模块来实现,函数的实现如下:

from scp import SCPClient
import paramiko
def put_local_file(ip, user, pkey, port, remotefile, localfile):
    ip = ip
    user = user
    pkey = pkey
    port = port

    key=paramiko.RSAKey.from_private_key_file(pkey)
    ssh = paramiko.SSHClient()
    ssh.load_system_host_keys()

    ssh.connect(ip,port,user, pkey=key)

    scpclient = SCPClient(ssh.get_transport(), socket_timeout=15.0)
    remotepath=remotefile
    localpath=localfile
    scpclient.put(localpath, remotepath)
    ssh.close()

 

总体思路为:把软件源码和安装脚本scp到需要安装的机器上,然后ssh运行安装脚本,并把日志记录到文件中,最后ajax定时请求并把结果展示在网页上。其中运行安装脚本并记录日志需要放到后台运行。

 

最后附上本人的网络课堂地址,如有兴趣请点击: 实践哥

转载于:https://my.oschina.net/zhuangweihong/blog/851789

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值