Fabric的安裝
Fabric支持pip,easy_install或源碼方式安裝,很方便解決包依賴問題,(根據用戶環境,自行選擇pip或ease_install)
pip install fabric
easy_install fabric
源碼安裝不介紹了。
校驗安裝結果,如果導入模塊沒有提示異常,則說明安裝成功:
root@Python_S6:~# python
Python 2.7.5+ (default, Sep 19 2013, 13:48:49)
[GCC 4.8.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import fabric
>>>
官網提供了一個簡單的入門示例:
root@Python_S6:/home/chart7/test/fabric# cat farbic.py #!/usr/bin/env python# -*- coding: utf-8 -*-from fabric.api import run def host_type(): #定義一個任務函數,通過run方法實現遠程執行'uname -s'命令 run('uname -s')
運行結果如果下圖所示
命令引用默認文件名為fabfile.py,如果使用非默認文件名稱,則需通過'-f'來制定,如:fab -H 192.168.1.23,192.168.1.24 -f host_type.py host_type,如果管理機與目標主機未配置密鑰認證信任,將提示會輸入目標主機對應賬戶登錄密碼。
一、fab的常用參數
fab作為Fabric程序的命令入口,提供了豐富的參數調用,命令格式如下:
fab [options] <command>[:arg1,arg2=val2,host=foo,hosts='h1;h2',....]
下面列舉了常用的幾個參數,更多參數可使用fab -help查看.
-l,顯示定義好的任務函數名;
-f,指定fab入口文件,默認入口文件名為fabfile.py;
-g,指定網關設備,比如堡壘機環境,填寫堡壘機IP即可;
-H,指定目標主機,多臺主機用','號分隔;
-P,以異步并行方式運行多個主機任務,默認為串行運行;
-R,指定role(角色),以角色名區分不同業務組設備;
-t,設置設備連接超時時間;
-T,設置遠程主機命令執行超時時間;
-w,當命令執行失敗,發出警告,而非默認終止任務
二、fabfile的編寫
fab命令是結合我們編寫的fabfile.py(其他文件名必須添加-f filename引用)來搭配使用,部分命令行參數可以通過相應的方法來代替,使之更加靈活,列如"-H 192.168.1.23,192.168.1.24",我們可以通過定義env.hosts來實現,如"env.hosts=[192.168.1.23,192.168.1.24]".fabfile的主體由多個自定義的任務函數組成,不同任務函數實現不同的操作邏輯,下面詳細介紹
三、全局屬性設定
env對象的作用是定義fabfile的全局設定,支持多個屬性,包括目標主機,用戶,密碼角色,各屬性說明如下:
@roles('webservers')def webtask(): run('/etc/init.d/nginx start')@roles('dbservers'):def dbtask(): run('/etc/init.d/mysql start')@roles('webservers','dbservers')def publictask(): run('uptime')def deploy(): execute(webtask) execute(dbtask) execute(publictask)
在命令執行fab deploy就可以實現不同角色執行不同的任務函數。
常用API
Fabric提供了一組簡單但功能強大的fabric.api命令集,簡單地調用這樣API就能完成大部分應用場景需求,Fabric支持常用的方法及說明如下:
示例1:查看本地與遠程主機信息
本示例調用local()方法執行本地命令,添加"@runs_once"修飾保證該任務函數只執行一次。調用run()方法執行遠程命令,
#!/usr/bin/env python# -*- coding: utf-8 -*-from fabric.api import *env.user = 'root'env.hosts = ['192.168.1.43','192.168.1.23','192.168.1.24']env.port = '22'env.password = '123456' @runs_once #查看本地系統信息,當有多臺主機時只運行一次def local_task(): #本地任務函數 local('uname -a') def remote_task(): with cd('/data'): #with的作用是讓后面的表達式語句繼承當前狀態,實現cd /var && ls -l的效果 run('ls -l')
通過fab命令分別調用local_task任務函數運行效果如下圖所示
結果中顯示了[192.168.1.23] Executing task 'local_task',但事實上并非在主機192.168.1.23上執行任務,而是返回Fabric主機本地的'uname -a'的執行效果
調用remtoe_task任務函數的執行結果如下圖所示
示例2;動態獲取遠程目錄列表
本示例使用"@task"修飾符標志入口函數go()對外部可以,配合"@runs_once"符等待接受用戶輸入,最后調用worktask()任務函數實現遠程命令執行,
#!/usr/bin/env python# -*- coding: utf-8 -*-from fabric.api import *env.user = 'root'env.hosts = ['192.168.1.23','192.168.1.24']env.password = '123456'@runs_once #在主機遍歷過程中,只有一臺出發此函數def input_raw(): return prompt("please input direcotry name:",default="/home") def worktask(dirname): run("ls -l %s" %dirname) @taskdef go(): getdirname = input_raw() worktask(getdirname)
該示例實現了一個動態輸入遠程目錄名稱,在獲取目錄列表的功能,由于我們只要求輸入一次,再顯示所有主機上該目錄的列表信息,調用了一個子函數input_raw(同時配置)@runs_once修飾符來達到此目的,執行結果如下圖
文件上傳與執行
#!/usr/bin/env python# -*- coding: utf-8 -*-from fabric.api import *from fabric.context_managers import *from fabric.contrib.console import confirmenv.hosts=['192.168.1.23','192.168.1.24']#假如所有主機密碼都不一樣,可以通過env.passwords字典變量一一指定env.passwords = { 'root@192.168.1.23:22': '123456', 'root@192.168.1.24:22': '123456',} lpackpath="/home/a.tar.gz"rpackpath="/tmp/install" @taskdef put_task(): run("mkdir -p /tmp/install") with settings(warn_only=True): result = put(lpackpath, rpackpath) if result.failed and not confirm("put file failed, Continue[Y/N]?"): abort("Aborting file put task!") @taskdef run_task(): with cd("/tmp/install"): run("tar -zxvf a.tar.gz") @taskdef go(): put_task() run_task()
新聞熱點
疑難解答
圖片精選