Fabric的安裝
Fabric支援pip,easy_install或原始碼方式安裝,很方便解決套件依賴問題,(根據使用者環境,自行選擇pip或ease_install)
pip install fabric
easy_install fabric
校驗安裝結果,如果導入模組沒有提示異常,則表示安裝成功:
Python 2.7.5+ (default, Sep 19 2013, 13:48:49) 4. .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]下面列舉了常用的幾個參數,更多參數可使用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的全域設定,支援多個屬性,包括目標主機,用戶,密碼角色,各屬性說明如下:
env.host,定义目标主机,可以用IP或主机名表示,以Python的列表形式定义,如env.hosts=['192.168.1.23,192.168.1.24']. env.exculde_hosts,排除指定主机,如env.exclude_hosts=['192.168.1.23'] env.user,定义用户名,如env.user="root" env.port,定义目标主机端口,如env.port = '22' env.password,定义密码,如env.password='123456' env.passwords,与password功能一样,区别在于不同主机不同密码的应用场景,需要注意的是,配置passwords时需要配置用户,主机,端口等信息,如:env.passwords = {'root@192.168.1.21:22':'123456', 'root@192.168.1.23:22':'3234234', 'root@192.168.1.24:23':'09887', } env.gateway,定义网关(中转,堡垒机)IP,如env.gateway = '192.168.1.1' env.roledefs,定义角色分组,比如web组与db组主机区分开来,定义如下: env.roledefs = { 'webservers':['192.168.1.21','192.168.1.22','192.168.1.23'], 'dbservers':['192.168.1.24','192.168.1.25'], }
引用時使用python修飾符的形式進行,角色修飾符下面的任務函數為其作用域,下面來看一個範例:
@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支援常用的方法及說明如下:
local,执行本地命令,如local:('uname -s'); lcd,切换本地目录,如lcd:('/home'); cd,切换远程目录,如cd:('/data/logs/'); run,执行远程命令,如:run('free -m') sudo,sudo方式执行远程命令,如:sudo('/etc/init.d/httpd start'); put,上传本地文件到远程主机,如:put('/home/user.info','/data/user.info'); get,从远程主机下载文件到本地,如:get('/home/user.info','/data/user.info'); prompt,获得用户输入信息,如:prompt('please input user password:'); confirm,获得提示信息确认,如:confirm('Test failed,Continue[Y/N]'); reboot,重启远程主机,如reboot(); @task,函数修饰符,标识符的函数为fab可调用,非标记对fab不可见,纯业务逻辑; @runs_once,函数修饰符,标识符的函数只会执行一次,不受多台主机影响;
範例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,ask'上並非在主機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) @task def 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 confirm env.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" @task def 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!") @task def run_task(): with cd("/tmp/install"): run("tar -zxvf a.tar.gz") @task def go(): put_task() run_task()
更多維運管理器Fabric使用方法相關文章請關注PHP中文網!