W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
Fabric 是一個 Python 下類似于 Makefiles 的工具,但是能夠在遠程服務(wù)器上 執(zhí)行命令。如果您有一個良好配置過的 Python 軟件包 (大型應(yīng)用) 且 對“配置”概念的理解良好,那么在外部服務(wù)器上部署 Flask 應(yīng)用將會非常容易。
開始之前,請先檢查如下列表中的事項是否都已經(jīng)滿足了:
Fabfile 用于指定 Fabric 執(zhí)行的命令,它通常被命名為 fabfile.py 并使用 fab 命令運行。文件中所有的函數(shù)將被當(dāng)做 fab 的子命令顯示出來,他們可以在一個或 多個主機上運行。這些主機要么在 fabfile 當(dāng)中定義,要么在命令輸入時指定。在本文中 我們將他們定義在 fabfile 里。
這是第一個基礎(chǔ)的例子,能夠?qū)F(xiàn)有源代碼上傳到指定服務(wù)器并將它們安裝進如 一個已經(jīng)存在的虛擬環(huán)境中:
from fabric.api import *
# 遠程服務(wù)器登陸使用的用戶名
env.user = 'appuser'
# 需要進行操作的服務(wù)器地址
env.hosts = ['server1.example.com', 'server2.example.com']
def pack():
# 以 tar 歸檔的方式創(chuàng)建一個新的代碼分發(fā)
local('python setup.py sdist --formats=gztar', capture=False)
def deploy():
# 之處發(fā)布產(chǎn)品的名稱和版本
dist = local('python setup.py --fullname', capture=True).strip()
# 將代碼歸檔上傳到服務(wù)器當(dāng)中的臨時文件夾內(nèi)
put('dist/%s.tar.gz' % dist, '/tmp/yourapplication.tar.gz')
# 創(chuàng)建一個文件夾,進入這個文件夾,然后將我們的歸檔解壓到那里
run('mkdir /tmp/yourapplication')
with cd('/tmp/yourapplication'):
run('tar xzf /tmp/yourapplication.tar.gz')
# 使用我們虛擬環(huán)境下的 Python 解釋器安裝我們的包
run('/var/www/yourapplication/env/bin/python setup.py install')
# 現(xiàn)在我們的代碼已經(jīng)部署成功了,可以刪除這個文件夾了
run('rm -rf /tmp/yourapplication /tmp/yourapplication.tar.gz')
# 最終生成 .wsgi 文件,以便于 mod_wsgi 重新加載應(yīng)用程序
run('touch /var/www/yourapplication.wsgi')
上面的代碼例子注釋很清晰,應(yīng)該很容易明白,下面是 fabric 常用命令的一個歸納:
如何執(zhí)行 fabfile 呢?您應(yīng)該使用 fab 命令。若要發(fā)布當(dāng)前版本的代碼到遠程 服務(wù)器上,您只需執(zhí)行如下命令:
$ fab pack deploy
然而這需要您的服務(wù)器已經(jīng)創(chuàng)建過 /var/www/yourapplication 文件夾 而且 /var/www/yourapplication/env 是一個可用的虛擬環(huán)境。而且, 我們還沒有在服務(wù)器上創(chuàng)建配置文件或者 .wsgi 文件。因此,我們怎么樣 把一個新的服務(wù)器轉(zhuǎn)換為可以使用基礎(chǔ)設(shè)備呢。
這視我們想要配置的服務(wù)器數(shù)量的不同,實現(xiàn)起來有所差別。如果我們只有一個 遠程應(yīng)用服務(wù)器(大部分應(yīng)用都是都屬于此類),那么 fabfile 里添加一個專門 負責(zé)此類的命令有些小題大做。但是顯然我們可以這么做。在這里,您可以會 運行命令 setup 或者 bootstrap 。然后將服務(wù)器的地址詳細地在命令行 當(dāng)中指定:
$ fab -H newserver.example.com bootstrap
初始化一個新的服務(wù)器,您大概需要執(zhí)行如下幾個步驟:
在 /var/www 目錄下創(chuàng)建目錄結(jié)構(gòu):
$ mkdir /var/www/yourapplication
$ cd /var/www/yourapplication
$ virtualenv --distribute env
上傳一個新的 application.wsgi 文件以及為應(yīng)用程序準(zhǔn)備的配置 文件(例如: application.cfg)等到服務(wù)器上
為 yourapplication 創(chuàng)建一個新的 Apache 配置,并激活它。請確保 激活了對 .wsgi 改變的監(jiān)視功能,這樣在我們創(chuàng)建或改變這個文件時 Apache 可以自動重新加載應(yīng)用 (詳細內(nèi)容請參考 mod_wsgi (Apache))
現(xiàn)在的問題是, application.wsgi 和 application.cfg 文件 從何而來。
WSGI 文件應(yīng)導(dǎo)入這個應(yīng)用并且設(shè)定一個環(huán)境變量,這個環(huán)境變量指定了應(yīng)用程序應(yīng) 到哪里尋找配置文件。下面是一個完全完成上述功能的短例:
import os
os.environ['YOURAPPLICATION_CONFIG'] = '/var/www/yourapplication/application.cfg'
from yourapplication import app
應(yīng)用程序本身則應(yīng)該向下面這樣,通過查詢環(huán)境變量來查找配置,以此初始化自己:
app = Flask(__name__)
app.config.from_object('yourapplication.default_config')
app.config.from_envvar('YOURAPPLICATION_CONFIG')
這種方法在本文檔的 配置處理 這節(jié)中進行了詳細介紹。
正如上文所屬,應(yīng)用程序?qū)ㄟ^查找 YOURAPPLICATION_CONFIG 環(huán)境變量以 找到正確的配置文件。因此我們必須將配置文件放在應(yīng)用程序可以找到的地方。 配置文件有在不同電腦上表現(xiàn)出不同效果的特質(zhì),所以您不應(yīng)該以普通的方式 對它進行版本控制。
一個流行的做法是將不同服務(wù)器的配置文件保存在不同的版本控制倉庫里,然后 在不同的服務(wù)器中分別抽取出來。然后建立到從配置應(yīng)該在的地點 (如: /var/www/yourapplication)到這個文件實際位置的符號鏈接。
我們預(yù)計只有一個或兩個服務(wù)器需要部署,因此我們采用另一種方法,也就是 提前手動將配置文件上傳到需要的未知。
現(xiàn)在我們可以開始進行第一次部署了。我們已經(jīng)初始化了服務(wù)器以使它擁有正確的 虛擬環(huán)境和已經(jīng)激活的 Apache 配置文件。現(xiàn)在我們可以把應(yīng)用打包然后部署了:
$ fab pack deploy
Fabric 現(xiàn)在就會連接到所有服務(wù)器,然后運行在 fabfile 文件中所指定的命令。 最初他會執(zhí)行打包工作,為我們創(chuàng)建代碼歸檔,然后他部署和上傳代碼到所有的 服務(wù)器,并在那里安裝他們。歸功于 setup.py ,所有引用依賴的包和庫都將 自動被下載和安裝到我們的虛擬環(huán)境中。
從現(xiàn)在開始,我們可以做的事情變得如此之多,以至于部署代碼實際上可以 看做一種樂趣:
使用 Fabric 是相當(dāng)有趣,鍵入 fab deploy 并看到您的應(yīng)用自動 部署到一個或多個服務(wù)器上,您會有“簡直像是魔術(shù)”這樣的感覺。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: