python fabric實(shí)現(xiàn)遠(yuǎn)程部署
python fabric實(shí)現(xiàn)遠(yuǎn)程部署
需求描述
在多人協(xié)同開發(fā)項(xiàng)目的過(guò)程中,幾乎每天我們都要提交代碼到git服務(wù)器,然后部署到測(cè)試服務(wù)器,每天都在敲那重復(fù)的幾行命令,實(shí)在是無(wú)趣。怎么辦?運(yùn)維自動(dòng)化!接下來(lái)就說(shuō)說(shuō)fabric這玩意兒,替我們完成一些重復(fù)繁雜的工作,相信你會(huì)跟我一樣喜歡上它的!
本文項(xiàng)目背景
我們這次做的項(xiàng)目是用的django框架,每天我們提交代碼到git服務(wù)器后,都要手動(dòng)上傳代碼到測(cè)試服務(wù)器,然后執(zhí)行一系列django框架的命令。每天都要浪費(fèi)10多分鐘的時(shí)間,做著重復(fù)的勞動(dòng),這些工作實(shí)在不是一個(gè)程序員該干的。。。
解決方案
借助Python的fabric模塊可以將自動(dòng)化部署或者多機(jī)操作的命令固化到一個(gè)腳本里,然后通過(guò)此腳本去執(zhí)行。
安裝fabric
注意:本機(jī)和目標(biāo)服務(wù)器都要安裝一下
sudo easy_install fabric
或者用pip安裝:
pip install fabric
編寫腳本
local 是在本機(jī)執(zhí)行;run 是在遠(yuǎn)程機(jī)執(zhí)行
from fabric.api import hosts, run, env, local, cd, get, lcd
from fabric.tasks import execute
env.hosts = ["fab@192.168.1.101:22", "root@192.168.1.101:22"]
env.passwords = {"fab@192.168.1.101:22": "fab", "root@192.168.1.101:22": "tofabor"}
@hosts("ktv@192.168.1.101:22")
def update():
"""更新測(cè)試服務(wù)器代碼"""
with cd("/opt/project/project"): # 進(jìn)入測(cè)試服務(wù)器的項(xiàng)目目錄
run("git pull origin master") # 從git服務(wù)器的master分支下拉最新代碼
run("/usr/local/bin/python2.7 /opt/project/project/manage.py makemigrations") # 這是django框架檢測(cè)數(shù)據(jù)庫(kù)變動(dòng)的命令
run("/usr/local/bin/python2.7 /opt/project/project/manage.py migrate") # 這是django框架執(zhí)行數(shù)據(jù)庫(kù)變更的命令
@hosts("ktv@192.168.1.101:22")
def restart():
"""重啟服務(wù)"""
execute('stop')
execute('start')
@hosts("root@192.168.1.101:22")
def start():
"""開始服務(wù)"""
with cd("/opt/project/project"):
run("supervisorctl start dev")
@hosts("ktv@192.168.1.101:22")
def stop():
"""停止服務(wù)"""
pids = run("ps -ef |grep '9001'| awk '{print $2}'")
pid_list = pids.split('\r\n')
for i in pid_list[:-2]:
run('kill -9 %s' % i) # 殺掉運(yùn)行服務(wù)進(jìn)程
如上腳本保存為fabfile.py (也可保存為其他名稱,只是運(yùn)行命令不一樣,下面會(huì)詳述)
執(zhí)行腳本
如果你的腳本名稱為fabfile.py,那么可以在終端進(jìn)入你fabfile.py的目錄,敲入如下命令回車:
fab update
緊接著,你會(huì)看到終端提示你輸入git賬號(hào)及密碼,待你輸入成功后,將自動(dòng)下拉git服務(wù)器的代碼到測(cè)試服務(wù)器。
之后運(yùn)行如下命令,重啟服務(wù):
fab restart
如果你的文件名為其他名稱,比如ab.py, 那么執(zhí)行 fab update /restart是錯(cuò)誤的,怎么云運(yùn)行呢?
fab -f ab update
fab -f ab restart
注:fabric相當(dāng)強(qiáng)大,此文只是列舉一小功能。如需深入學(xué)習(xí),請(qǐng)參見官方文檔http://docs.fabfile.org/en/1.6/
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python skimage 連通性區(qū)域檢測(cè)方法
今天小編就為大家分享一篇python skimage 連通性區(qū)域檢測(cè)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
python實(shí)現(xiàn)從pdf文件中提取文本,并自動(dòng)翻譯的方法
今天小編就為大家分享一篇python實(shí)現(xiàn)從pdf文件中提取文本,并自動(dòng)翻譯的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
Python操作Mongodb數(shù)據(jù)庫(kù)的方法小結(jié)
這篇文章主要介紹了Python操作Mongodb數(shù)據(jù)庫(kù)的方法,結(jié)合實(shí)例形式總結(jié)分析了Python針對(duì)MongoDB數(shù)據(jù)庫(kù)的基本模塊導(dǎo)入、連接、增刪改查及排序等相關(guān)操作技巧,需要的朋友可以參考下2019-09-09
Python?4種實(shí)現(xiàn)定時(shí)任務(wù)的方案
這篇文章主要給大家分享了Python?4種實(shí)現(xiàn)定時(shí)任務(wù)的方案,運(yùn)用 while True: + sleep()、Timeloop 庫(kù)、threading.Timer 、內(nèi)置模塊 sched ,下面就來(lái)看看具體的實(shí)現(xiàn)過(guò)程吧2021-12-12
Python關(guān)于實(shí)參隨形參改變而改變的問(wèn)題
本文通過(guò)實(shí)驗(yàn)總結(jié)了Python中可變和不可變數(shù)據(jù)類型的區(qū)別,并提出了通過(guò)使用.copy()方法或deepcopy()函數(shù)來(lái)保持可變數(shù)據(jù)不變的解決方案2024-11-11
Python Matplotlib繪制動(dòng)畫的代碼詳解
使用matplotlib可以很容易地創(chuàng)建動(dòng)畫框架。在本文中我們就將利用Matplotlib制作幾個(gè)簡(jiǎn)單的動(dòng)畫,文中的示例代碼講講詳細(xì),感興趣的可以了解下2022-05-05

