您的位置:首页 > 其它

Flask实现软件自动安装

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





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定时请求并把结果展示在网页上。其中运行安装脚本并记录日志需要放到后台运行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息