首頁  >  文章  >  後端開發  >  Python自動化部署工具Fabric的簡單上手指南

Python自動化部署工具Fabric的簡單上手指南

高洛峰
高洛峰原創
2017-01-16 17:43:161388瀏覽

Fabric 是基於 SSH 協定的 Python 工具,相較於傳統的 ssh/scp 方式,用 Python 的語法寫入管理指令更易讀也更容易擴展,管理單一或多台機器猶如本機操作一般。

官網位址:http://fabfile.org

安裝
省略python、pip管理工具安裝流程

pip install fabric

驗證是否安裝成功
進入python編輯模式,輸入程式碼,無錯誤即表示成功安裝

版hello world

fabric 預設檔fabfile.py,當然如果不想用這個名字,需要加上-f參數

建立fabfile.py檔

from fabric.api import local

編輯程式碼

vim fabrile.py

lee

#coding:utf-8
from fabric.api import local#
def hello():
   # local函数用来执行本地命令
   local('echo "hello wolrd!"')

編輯程式碼

fab hello

執行的任務,目前為hello函數

運行結果

[localhost] local: echo "hello world!"
hello world!
Done.

傳統維護方法:

$ ssh x.x.x.x 'uname -a' -- 输出略

Fabric 範例:

$ cat fabfile.py
from fabric.api import run
def uname():
  run('uname -a')
$ fab -H x.x.x.x uname -- 输出略

肉眼直觀看上去,貌似環節比較少,例如:你想判斷某服務是否已經啟動,沒有啟動則執行啟動等等操作。 ssh 命令式的做法稍顯麻煩。 (當然齷齪一點可以在被操作機器上寫好一個腳本,ssh 呼叫這個腳本)

說幾個Fabric 的優點吧:

角色定義

程式碼易讀

封裝了本地、遠端操作(

程式碼易讀

自己封裝system/popen/ssh操作麼? )

參數靈活(動態指定host/role 等,還有並發執行基於multiprocessing )

完整的日誌輸出

羅列的這些,其實日常工作裡基本上都有類似的封裝了,但是有現成的一個成熟的工具,乾啥不用呢?對吧。

常用的設定:

env.host           -- 主機ip,當然也可以-H參數指定

env.password  比如: {'web': ['x', 'y'], 'db': ['z']}

fab -l             -- 顯示可用的task(指令)🟠🠎fab -H 多重逗號分開

fab -R             -- 指定role,以支援多個

fab -P            -- warn_only,預設是碰到異常直接abort退出

fab -f             -- 指定入口文件,以fab預設入口文件是:fabfile/fabfile.py

更多請參考:fab --help

       -- 執行本地命令

lcd('/tmp')                      --  -- 切換遠端目錄

run('uname -a')                  -- 執行遠端指令

sudo('/etc /init.d/nginx start')  -- 執行遠端sudo,注意pty選項

範例1:管理遠端nginx 服務

$ cat fabfile.py
from fabric.api import *
@task
def nginx_start():
  ''' nginx start '''
sudo('/etc/init.d/nginx start')
 
@task
def nginx_stop():
  ''' nginx stop '''
  sudo('/etc/init.d/nginx stop')
$ fab --list   -- 查看可用命令
Available commands:
 
  nginx_start nginx start
  nginx_stop  nginx stop
 
$ fab -H x.x.x.x nginx_start -- 启动 nginx

範例2:基於角色

$ cat fabfile.py
from fabric.api import *
env.roledefs = {'nginx': ['x.x.x.x', 'y.y.y.y'], 'mysql': 'z.z.z.z'}
@task
def mysql_start()
  ''' mysql start '''
  sudo('/etc/init.d/mysql start')
$ fab --list   -- 查看可用命令
Available commands:
 
  nginx_start nginx start
  nginx_stop  nginx stop
  mysql_start mysql start
 
$ fab -R nginx nginx_start -- 启动 nginx
$ fab -R mysql mysql_start -- 启动 mysql

範例3:混合本地和遠端操作是混合本地和遠端操作是混合不是看起來都是像本地一樣?對吧。

範例4:多個目標伺服器

相同密碼或手動輸入:

$ cat fabfile

不同密碼或不想手動輸入(此方法也可定義不角色一組伺服器):

def hello():
  ''' test hello '''
  with lcd('/tmp'): # 切换到 /tmp 目录下
    local('svn co http://xxx xxx') # check 代码到本地
    local('tar czf xxx.tar.gz xxx/') # 压缩本地包
    put('xxx.tar.gz', '/tmp') # 上传压缩包到远程 /tmp 目录下
  with cd('/tmp'):  # 切换到远程 /tmp 目录
    run('tar zxf xxx.tar.gz') # 远程解压

更多Python自動化部署工具Fabric的簡單上手指南相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn