基於fab自動化部署

fab是一個python庫,強大好使,能夠作不少幫助你減輕工做量的事情,好比在多臺服務器上部署web項目,這裏就講講使用它簡單的方法來執行部署的過程。html

關於fab的安裝的基本使用,網上一搜一大把,內容都差很少,因此這裏就不介紹,下載去官網:http://www.fabfile.org/python

本文會涉及到如下幾個內容:git

  1. 自動SSH登陸
  2. 運行命令
  3. 錯誤處理
  4. 帶顏色輸出

自動ssh登陸

通常自動部署都不會只有一臺機器,因此這裏主要說多臺機器,固然,一臺也是同樣的web

首先,導入庫api

1 from fabric.api import *

fabric.api裏封裝了不少的方法,用來作通常的事情,兩個方法就夠了tomcat

1. run() 用於執行命令
2. cd() 用於進入目錄

跑題了,基本操做用這兩個就能夠了,具體操做後面再講,回到ssh登陸上,咱們知道,登陸3要素,用戶,地址和密碼,因此先就定義一下。固然,不能隨便定義,得按fab的方法來服務器

 

1 # 定義host
2 # 方法 env.hosts = ['user@host1', 'user@host2']
3 # 示例
4 env.hosts = ['onlyfu@unjs.dinlei.com', 'root@unjs.dinlei.com']
5 
6 # 設置密碼
7 # 方法 env.passwords = {'host1:22': 'password1', 'host2:22': 'password2'}
8 # 示例
9 env.passwords = {'onlyfu@unjs.dinlei.com:22': '1234565', 'root@unjs.dinlei.com': 'ojoajewpb'}

這裏要特別說明一下,在passwords裏host必定要帶上端口,默認端口自己來說是不用帶的,但在這裏,若是要讓密碼跟host對上,就必須帶着端口號才能成功。app

env.passwords用於服務器的密碼不一至的狀況,若是幾臺服務器的密碼都是相同的,能夠直接使用env.password = '123456'ssh

運行命令

正如前面所說,主要命令是run,它能夠執行命令,如webapp

 1 # 執行單條命令
 2 run("ls -l")
 3 run("echo 'hello'")
 4 
 5 # 執行多條命令
 6 run("ls -l; echo 'hello'")
 7 
 8 # 帶變量的也同樣,看看kill tomcat進程的命令
 9 # 獲取到pid,而後執行kill命令,就這麼簡單
10 run("pid=`(ps -ef | grep tomcat | grep -v \"grep\") | awk '{print $2}'`; kill -9 $pid")

再來講說cd命令,可能有人會說,既然run能夠運行命令,那直接run("cd deploy")不就能夠了嘛。事實證實,看上去對的,不必定真對,這個命令沒錯,是執行了,但它沒進去,真的,很假,等因而告訴你:哥,我進去了哦,但沒動,因此後面要作的操做,仍是在當前目錄下的,不信能夠試

1 run('cd deploy')
2 run('ls -l')

看輸出的目錄是哪兒就明白了。不過雖然沒進去,但若是執行run('cd deploy')時,沒有deploy這個目錄,程序是會報錯的,有病,是否是。那要怎麼作呢,這裏就到cd方法出場了,不過光是它也不行,還要和with一塊兒用:

1 with cd('deploy'):
2     run('ls -l')

看看輸出,是否是已經到deploy目錄了,這樣就能夠執行艇做用於該目錄的命令了

錯誤的處理

標準Python程序,出錯程序就中止結束了,不少時間,也許並不想讓它就此結束,想讓它跳過繼續執行後面的,那這裏就要用到fab的錯誤處理方法了

使用錯誤處理,首先得告訴fab,我要進行這樣的處理,它纔會去處理,因此先得說一下:

1 with settings(warn_only = true):
2     pass

warn_only = true就是在告訴fab這個事情,有了這一句,後面的語句都能享受到。

再說一個,run的每一條命令都有返回,成功或失敗,判斷,若是失敗,執行confirm方法,來提示確認要不要繼續,如:

1 # 導入confirm
2 from fabric.contrib.console import confirm
3 
4 res = run('cd deploy') # 沒有deploy這個目錄
5 if res.failed and not confirm("cd deploy failed, Continue?"):
6     abort('Abort')

運行上面的程序,res就會獲得返回,這時候用res.failed來判斷是否失敗,若是失敗,執行comfirm等待確認,若是選擇N,執行abort終止程序

帶顏色輸出

這個其沒什麼用,只是想讓輸出漂亮一點,因此就說一下,方法很簡單,使用colors包

1 # 導入包
2 from fabric.colors import *
3 
4 print green('green txt')
5 print red('red txt')
6 print yellow('yellow txt')

太簡單了

看一個完整一點的示例

應用場景:
共有4臺服務器,要作Java Spring項目部署,服務器使用的tomcat
1. 登陸第一臺服務器
2. 進入jar包的目錄
3. 使用git拉取新的jar包
4. 中止tomcat
5. 刪除web目錄,有可能多個
6. 將jar包拷到服務目錄中,有可能性於多個不一樣的目錄
7. 啓動tomcat

登陸下一臺服務器循環
# -*- coding:utf-8 -*-
from fabric.api import *
from fabric.contrib.console import confirm
from fabric.colors import *

env.hosts = ['host1', 'host2', 'host3', 'host4']
env.passwords = {'host1:22': 'password1', 'host2:22': 'password2', 'host3:22': 'password3', 'host4:22': 'password4'}

def getRedMessage(txt, t):
    return "[%s] faield, Continue?" % txt if t == 'msg' else "Aborting at [%s]" % txt

def gitPull():
    
    actionName = "get pull"

    res = run('git pull origin master')
    if res.failed and not confirm(getRedMessage(actionName, 'msg')):
        abort(getRedMessage(actionName, 'abort'))

def copyFile():
    
    actionName = "copy file"

    res = run('cp -rf jar/* /jardir/; cp -rf war/* /warjar/')
    if res.failed and not confirm(getRedMessage(actionName, 'msg')):
        abort(getRedMessage(actionName, 'abort'))
        
def delWeb():
    
    actionName = "delete web"

    res = run('rm -rf /webapps/*')
    if res.failed and not confirm(getRedMessage(actionName, 'msg')):
        abort(getRedMessage(actionName, 'abort'))

def stopTomcat():
    
    actionName = "stop tomcat"

    res = run("pid=`(ps -ef | grep tomcat | grep -v \"grep\") | awk '{print $2}'`; kill -9 $pid")
    if res.failed and not confirm(getRedMessage(actionName, 'msg')):
        abort(getRedMessage(actionName, 'abort'))
        
def startTomcat():
    
    action = "start tomcat"

    res = run("set -m; /sh/start.sh") # 啓動另外的程序,需加上set -m;由於若是不加,啓動會隨着python進程的結束而結束,達不到啓動的目的。關於set -m,能夠去查查資料
    if res.failed and not confirm(getRedMessage(actionName, 'msg')):
        abort(getRedMessage(actionName, 'abort'))

def doploy():
    
    with settings(warn_only = true):
        with cd('cd deploy'):
            res = run('ls -l')
            if res.failed and not confirm(getRedMessage('cd deploy', 'msg')):
                abort(getRedMessage('cd deploy', 'abort'))

            gitPull()

            stopTomcat()

            delWeb()

            copyFile()

            startTomcat()

 

將上面的代碼保存爲fabfile.py文件,只有這個文件名,fab默認才能找到它,否則就要使用參數-f來加載文件名,在終端裏運行:

fab deploy

好了,fab還有不少方法能夠實現一些更加方便的操做,沒事能夠翻翻Docs,http://docs.fabfile.org/en/latest/tutorial.html

相關文章
相關標籤/搜索