基於fabric和hg的自動化部署

2021-12-29 20:50:34 字數 2924 閱讀 9800

fabric是個很好用的自動化部署工具,雖然功能比起puppet,saltstack之類要弱一些,但勝在用python,而且免安裝服務端。

當然你要說docker更好我也同意,然而我是經常使用freebsd的,而且還有一些32位的低配系統,並不適合用docker。更不用說虛擬機器了。

自動化部署的目的主要是簡化手工部署的麻煩,包括初次安裝部署和**修改後的更新部署。初始部署主要是安裝基礎環境,初始化資料庫等。更新部署則更麻煩一些,需要修改基礎環境配置,變更資料庫結構等。相比之下**發布和更新反而是最簡單的,用乙個版本控制工具即可。

我是比較習慣用hg做**版本管理的,當然這裡要把hg換成git也可以,但我就是喜歡hg,你咬我啊。

fabric的官網是fabfile.org,基本用法都可以看官方文件,這裡只對幾種常用的用法作簡單說明。

安裝很簡單,只要在本地用pip安裝fabric即可,遠端只要有ssh服務即可,不需要安裝額外的東西,這點比puppet和saltstack省事。

使用上也很簡單,最關鍵的是部署指令碼是用python,比起puppet用的ruby來說,更合我口味。

預設的指令碼檔名為: fabfile.py,當然你也可以用別的名字,但用起來就不方便了,類似make要用預設的makefile檔名才方便一樣。

執行預設指令碼的命令為:fab 函式[

其中的函式名為fabfile.py中定義的任意函式(當使用@task裝飾器時就只能使用已經裝飾過的函式),也可以帶上引數。對於特定主機或使用者,還可以給函式加上角色裝飾器。

執行本地命令的例子如下:

from fabric.api import local

def deploy_1():

local(「hg commit」)

local(「hg push」)

fab deploy_1執行遠端命令的例子如下:

from fabric.api import run

def deploy_2():

run(「hg pull」)

run(「hg update」)

fab deploy_2 -h hostname_or_ip切換當前目錄:

with lcd(「path」) # 本地目錄

with cd(「path」) # 遠端錯誤處理:任何返回值不為0的操作都將導致異常,除非…

with settings(warn_only=true)並且用命令的.failed屬性來判斷執行結果

env用於儲存相關配置環境,比如ssh的key檔案:key_filename,還有主機名列表:hosts,角色定義:roledefs等

角色的使用:

env.roledefs=

@roles(「role1」)

def deploy_3():

pass以乙個簡單的python web應用為例來說明。

一次完整的手工初次部署大致包括以下內容(假設服務端系統已安裝必要軟體,比如hg, python, virtualenv, database, webserver,其中database和webserver已經配置好,單獨的virtualenv已建立)等:

在virtualenv環境中安裝必要的依賴包 pip install -r requirements.txt

通過hg發布要部署的** [local] hg push ssh://user@host/path; [remote] hg update

初始化資料庫

啟動(通過gunicorn, supervisord等)

**修改過以後再次部署則涉及以下一些內容:

更新依賴包

更新**

更新資料庫結構

重啟服務

再考慮到可能需要分別部署到測試環境和正式環境,又需要考慮以下問題:

測試環境和正式環境涉及不一樣的配置(比如連線不一樣的資料庫,配置不同的埠,甚至靜態檔案指向不同的路徑)

必須是測試環境中測試通過的版本才可以更新到正式環境中

正式環境有更嚴格的許可權管理(開發部門不可以直接部署到正式環境,甚至不能接觸正式環境的配置資訊)

由此,我們至少需要兩個**倉庫:乙個是開發**庫(repo_dev),包括測試配置,另乙個是正式配置倉庫(repo_prod)。

那麼,基本的fabfile.py的deploy_dev函式大致有以下內容:

local("hg push repo_dev")

with cd("/target"):

run("hg pull repo_dev")

run("hg update")

run("workon venv") # 切換到指定的virtualenv

run("pip install -r requirements.txt")

# 初始化資料庫或更新資料庫結構

sudo("supervisorctl restart ***") # gunicorn不能用supervisor重啟,因為停止需要等待一段時間,建議用kill訊號進行軟重啟可以通過角色配置使repo_dev指定的遠端伺服器為測試主機 testhost ,在測試主機上測試通過以後,測試部分可以部署到正式機 prodhost 上。

with cd("/prodconf"):

run("hg pull repo_prod")

with cd("/prod"):

run("hg pull testhost") # 從測試主機上更新**

run("hg update rev") # 注意,這裡要更新測試過的指定版本

run("cp /prodconf/config .") # 使用正式配置替換測試配置

run("workon venv")

run("pip install -r requirements.txt")

# 更新資料庫結構

sudo("supervisorctl restart ***")這個部署函式使用另乙個使用者角色,只要控制這個角色只有測試部門有許可權即可,開發部門即使不慎執行了這個部署函式,也會因為沒有許可權而失敗。

fabric 自動化部署

專案發布和運維的工作相當機械,頻率還蠻高,導致時間浪費在敲大量重複的命令上。修復bug什麼的,測試,提交版本庫 2分鐘 ssh到測試環境pull部署 2分鐘 rsync到線上機器a,b,c,d,e 1分鐘 分別ssh到abcde五颱機器,逐一重啟 8 10分鐘 13 15分鐘 其中鬱悶的是,每次操作...

有關自動化部署Fabric

要部署多台生產伺服器的時候,一台一台去配置不方便,所以我們需要自動化部署的方式來部署。本文採用的是fabric,在ubuntu 64 上實現。fabric python內建的模組,用來提高基於 ssh 的應用部署和系統管理效率。可以實現與遠端伺服器的自動化互動。一般使用情況為需要運維幾台至幾百台機器...

使用 Fabric 自動化部署

fabric 目前僅支援 python2,如果你的系統中只有 python3 版本,可以使用 fabric3,但是只能安裝低版本1.14.post1,高版本不支援api方法。接下就可以簡單地通過 pip 命令安裝 fabric 了。如果是 python 2 pip install fabric 如果...