Python Fabric 模組 介紹及簡單應用

來源:互聯網
上載者:User

標籤: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 模組 介紹及簡單應用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.