Fabric 是基於 SSH 協定的 Python 工具,相較於傳統的 ssh/scp 方式,用 Python 的語法寫入管理指令更易讀也更容易擴展,管理單一或多台機器猶如本機操作一般。
官網位址:http://fabfile.org
安裝
省略python、pip管理工具安裝流程
pip install fabric
驗證是否安裝成功
進入python編輯模式,輸入程式碼,無錯誤即表示成功安裝
fabric 預設檔fabfile.py,當然如果不想用這個名字,需要加上-f參數
from fabric.api import local編輯程式碼
vim fabrile.pylee
#coding:utf-8 from fabric.api import local# def hello(): # local函数用来执行本地命令 local('echo "hello wolrd!"')編輯程式碼
fab 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中文網!