Flask實現軟件自動安裝 原 薦

最近在開發一個使用系統下發開源軟件,然後自動安裝,最後把安裝日誌顯示在網頁上的一個功能。開發過程中,想把安裝任務放到後臺跑,本來打算使用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定時請求並把結果展示在網頁上。其中運行安裝腳本並記錄日誌需要放到後臺運行。

 

最後附上本人的網絡課堂地址,如有興趣請點擊: 實踐哥

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章