標籤:python fabric 模組 介紹及簡單應用
來源:《Python自動化營運》
Fabric的安裝Fabric支援pip、easy_install或源碼安裝方式,很方便解決包依賴的問題,具體安裝命令如下(根據使用者環境,自行選擇pip或easy_install):pip install fabriceasy_install fabricFabric依賴第三方的setuptools、Crypto、paramiko包的支援,源碼安裝步驟如下:# yum -y install python-setuptools# wget https://pypi.python.org/packages/source/F/Fabric/Fabric-1.8.2.tar.gz --no-check-certificate# tar -zxvf Fabric-1.8.2.tar.gz# cd Fabric-1.8.2# python setup.py install
fab的常用參數fab作為Fabric程式的命令列入口,提供了豐富的參數調用,命令格式如下:fab [options] <command>[:arg1,arg2=val2,host=foo,hosts=‘h1;h2‘,...]...下面列舉了常用的幾個參數,更多參數可使用fab-help查看。·-l,顯示定義好的任務函數名;·-f,指定fab入口檔案,預設入口檔案名稱為fabfile.py;·-g,指定網關(中轉)裝置,比如Bastion Host環境,填寫Bastion HostIP即可;·-H,指定目標主機,多台主機用","號分隔;·-P,以非同步並行方式運行多主機任務,預設為串列運行;·-R,指定role(角色),以角色名稱區分不同業務組裝置;·-t,設定裝置連線逾時時間(秒);·-T,設定遠程主機命令執行逾時時間(秒);·-w,當命令執行失敗,發出警示,而非預設中止任務。·-p,指定目標主機的密碼。有時候我們甚至不需要寫一行Python代碼也可以完成遠程操作,直接使用命令列的形式,例如:# fab -p Ksdh3458d(密碼) -H 192.168.1.21,192.168.1.22 -- ‘uname -s‘
全域屬性設定evn對象的作用是定義fabfile的全域設定,支援多個屬性,包括目標主機、使用者、密碼、角色等,各屬性說明如下:·env.host,定義目標主機,可以用IP或主機名稱表示, 以Python的列表形式定義,如env.hosts=[‘192.168.1.21‘,‘192.168.1.22‘]。·env.exclude_hosts,排除指定主機,如env.exclude_hosts=[‘192.168.1.22‘]。·env.user,定義使用者名稱,如env.user="root"。·env.port,定義目標主機連接埠,預設為22,如env.port="22"。·env.password,定義密碼,如env.password=‘KSJ3548t7d‘。·env.passwords,與password功能一樣,區別在於不同主機不同密碼的應用情境,需要注意的是,配置passwords時需配置使用者、主機、連接埠等資訊,如:env.passwords = {‘[email protected]:22‘: ‘SJk348ygd‘,‘[email protected]:22‘: ‘KSh458j4f‘,‘[email protected]:22‘: ‘KSdu43598‘}·env.gateway,定義網關(中轉、Bastion Host)IP,如env.gateway=‘192.168.1.23‘。·env.deploy_release_dir,自訂全域變數,格式:env.+"變數名稱",如env.deploy_release_dir、env.age、env.sex等。·env.roledefs,定義角色分組,比如web組與db組主機區分開來,定義如下:env.roledefs = { ‘webservers‘: [‘192.168.1.21‘, ‘192.168.1.22‘, ‘192.168.1.23‘,‘192.168.1.24‘], ‘dbservers‘: [‘192.168.1.25‘, ‘192.168.1.26‘]}
引用時使用Python修飾符的形式進行,角色修飾符下面的任務函數為其範圍,下面來看一個樣本:env.roledefs = { ‘webservers‘: [‘192.168.1.21‘, ‘192.168.1.22‘, ‘192.168.1.23‘,‘192.168.1.24‘], ‘dbservers‘: [‘192.168.1.25‘, ‘192.168.1.26‘]}@roles(‘webservers‘)def webtask(): run(‘/etc/init.d/nginx start‘)@roles(‘dbservers‘)def dbtask(): run(‘/etc/init.d/mysql start‘)@roles (‘webservers‘, ‘dbservers‘)def pubclitask(): run(‘uptime‘)def deploy(): execute(webtask) execute(dbtask) execute(pubclitask) ####################################fab -p [email protected] -f fa0.py -lfab -p [email protected] -f fa0.py webtaskfab -p [email protected] -f fa0.py deploy常用APIFabric提供了一組簡單但功能強大的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(‘/data/user.info‘,‘/home/root.info‘);·prompt,獲得使用者輸入資訊,如:prompt(‘please input user password:‘);·confirm,獲得提示資訊確認,如:confirm("Tests failed.Continue[Y/N]?");·reboot,重啟遠程主機,如:reboot();·@task,函數修飾符,標識的函數為fab可調用的,非標記對fab不可見,純商務邏輯;·@runs_once,函數修飾符,標識的函數只會執行一次,不受多台主機影響。##檔案名稱是fa.py#!/usr/bin/env pythonfrom fabric.api import *env.user=‘root‘env.hosts=[‘192.168.23.140‘,‘192.168.23.141‘]env.password=‘[email protected]‘@runs_once #查看本地系統資訊,當有多台主機時只運行一次def local_task(): #本地任務函數 local("uname -a")def remote_task(): with cd("/tmp"): #"with"的作用是讓後面的運算式的語句繼承目前狀態,實現 run("ls -l") # "cd /data/logs && ls -l"的效果##用法,執行下面命令#fab -p [email protected] -f fa.py local_task#fab -p [email protected] -f fa.py remote_task動態擷取遠程目錄列表本樣本使用“@task”修飾符標誌入口函數go()對外部可見,配合“@runs_once”修飾符接收使用者輸入,最後調用worktask()任務函數實現遠程命令執行,詳細源碼如下:【/home/test/fabric/simple2.py】#!/usr/bin/env pythonfrom fabric.api import *env.user=‘root‘env.hosts=[‘192.168.23.140‘,‘192.168.23.141‘]env.password=‘LKs934jh3‘@runs_once #主機遍曆過程中,只有第一台觸發此函數def input_raw(): return prompt("please input directory name:",default="/home")def worktask(dirname): run("ls -l "+dirname)@task #限定只有go函數對fab命令可見def go(): getdirname = input_raw() worktask(getdirname)[[email protected] fabric]# fab -p [email protected] -f fa2.py -lAvailable commands: go[[email protected] fabric]# fab -p [email protected] -f fa2.py go。。。。。。。。。網關模式檔案上傳與執行本樣本通過Fabric的env對象定義網關模式,即俗稱的中轉、Bastion Host環境。定義格式為“env.gateway=‘192.168.1.23‘”,其中IP“192.168.1.23”為Bastion HostIP,再結合任務函數實現目標主機檔案上傳與執行的操作,詳細源碼如下:【/home/test/fabric/simple3.py】from fabric.api import *from fabric.context_managers import *from fabric.contrib.console import confirmenv.user = ‘root‘env.gateway = ‘192.168.10.11‘ # 定義Bastion HostIP,作為檔案上傳、執行的中轉裝置env.hosts = [‘192.168.23.140‘, ‘192.168.23.141‘]# 假如所有主機密碼都不一樣,可以通過env.passwords字典變數一一指定env.passwords = { ‘[email protected]:22‘: ‘LKs934jh3‘, ‘[email protected]:22‘: ‘LKs934jh3‘, ‘[email protected]:22‘: ‘UI7384hg6‘ # Bastion Host帳號資訊}lpackpath = "/home/install/lnmp0.9.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(): # 執行遠程命令,安裝lnmp環境 with cd("/tmp/install"): run("tar -zxvf lnmp0.9.tar.gz") with cd("lnmp0.9/"): # 使用with繼續繼承/tmp/install目錄位置狀態 run("./centos.sh")@taskdef go(): # 上傳、安裝組合 put_task() run_task()樣本通過簡單的配置env.gateway=‘192.168.1.23‘就可以輕鬆實現Bastion Host環境的檔案上傳及執行,相比paramiko的實現方法簡潔了很多,編寫的任務函數完全不用考慮Bastion Host環境,配置env.gateway即可。
本文出自 “奮鬥吧” 部落格,請務必保留此出處http://lvnian.blog.51cto.com/7155281/1873451
Python Fabric 模組 介紹及簡單應用