Fabric是基于Python(2.5及以上版本)實(shí)現(xiàn)的SSH命令行工具,簡化了SSH的應(yīng)用程序部署及系統(tǒng)管理任務(wù),它提供了系統(tǒng)基礎(chǔ)的操作組件,可以實(shí)現(xiàn)本地或遠(yuǎn)程shell命令,包括命令執(zhí)行、文件上傳、下載及完整執(zhí)行日志輸出等功能。Fab-ric在paramiko的基礎(chǔ)上做了更高一層的封裝,操作起來會(huì)更加簡單。Fabric官網(wǎng)地址為:http://www.fabfile.org
大豐網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。成都創(chuàng)新互聯(lián)從2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。
創(chuàng)新互聯(lián)公司長期為上1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為黎平企業(yè)提供專業(yè)的網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì),黎平網(wǎng)站改版等技術(shù)服務(wù)。擁有10余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
一:fab常用參數(shù)
fab作為Fabric程序的命令行入口,提供了豐富的參數(shù)調(diào)用,命令格式如下:
fab [options] [:arg1,arg2=val2,host=foo,hosts='h2;h3',...] ...下面列舉了常用的幾個(gè)參數(shù),更多參數(shù)可使用fab-help查看。
?-l,顯示定義好的任務(wù)函數(shù)名;
?-f,指定fab入口文件,默認(rèn)入口文件名為fabfile.py;
?-g,指定網(wǎng)關(guān)(中轉(zhuǎn))設(shè)備,比如堡壘機(jī)環(huán)境,填寫堡壘機(jī)IP即可;
?-H,指定目標(biāo)主機(jī),多臺(tái)主機(jī)用“,”號(hào)分隔;
?-P,以異步并行方式運(yùn)行多主機(jī)任務(wù),默認(rèn)為串行運(yùn)行;
?-R,指定role(角色),以角色名區(qū)分不同業(yè)務(wù)組設(shè)備;
?-t,設(shè)置設(shè)備連接超時(shí)時(shí)間(秒);
?-T,設(shè)置遠(yuǎn)程主機(jī)命令執(zhí)行超時(shí)時(shí)間(秒);
?-w,當(dāng)命令執(zhí)行失敗,發(fā)出告警,而非默認(rèn)中止任務(wù)。
有時(shí)候我們甚至不需要寫一行Python代碼也可以完成遠(yuǎn)程操作,直接使用命令行的形式,例如:
fab -p "shitouit@2018" -H 18.16.200.151 -- 'ls '
命令運(yùn)行結(jié)果如下圖
二:fabfile的編寫
fab命令是結(jié)合我們編寫的fabfile.py(其他文件名須添加-f filename引用)來搭配使用的,部分命令行參數(shù)可以通過相應(yīng)的方法來代替,使之更加靈活,例如“-H 192.168.1.21,192.168.1.22”,我們可以通過定義env.hosts來實(shí)現(xiàn),如“env.hosts=['192.168.1.21', '192.168.1.22']”。fab-file的主體由多個(gè)自定義的任務(wù)函數(shù)組成,不同任務(wù)函數(shù)實(shí)現(xiàn)不同的操作邏輯,下面詳細(xì)介紹。
1:全局屬性設(shè)定
evn對象的作用是定義fabfile的全局設(shè)定,支持多個(gè)屬性,包括目標(biāo)主機(jī)、用戶、密碼、角色等,各屬性說明如下:env.host,定義目標(biāo)主機(jī),可以用IP或主機(jī)名表示,以Python的列表形式定義,如env.hosts=['192.168.1.21', '192.168.1.22']。
?env.exclude_hosts,排除指定主機(jī),如env.exclude_hosts=['192.168.1.22']。
?env.user,定義用戶名,如env.user="root"。
?env.port,定義目標(biāo)主機(jī)端口,默認(rèn)為22,如env.port="22"。
?env.password,定義密碼,如env.pass-word='KSJ3548t7d'。
?env.passwords,與password功能一樣,區(qū)別在于不同主機(jī)不同密碼的應(yīng)用場景,需要注意的是,配置passwords時(shí)需配置用戶、主機(jī)、端口等信息,如:env.passwords = { 'root@192.168.1.21:22': 'SJk348ygd', 'root@192.168.1.22:22': 'KSh558j4f', 'root@192.168.1.23:22': 'KSdu43598'}
?env.gateway,定義網(wǎng)關(guān)(中轉(zhuǎn)、堡壘機(jī))IP,如env.gateway='192.168.1.23'。
?env.deploy_release_dir,自定義全局變量,格式:env.+“變量名稱”,如env.de-ploy_release_dir、env.age、env.sex等。
?env.roledefs,定義角色分組,比如web組與db組主機(jī)區(qū)分開來,定義如下:
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']}
引用時(shí)使用Python修飾符的形式進(jìn)行,角色修飾符下面的任務(wù)函數(shù)為其作用域,下面來看一個(gè)示例:
@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)
在命令行執(zhí)行#fab deploy就可以實(shí)現(xiàn)不同角色執(zhí)行不同的任務(wù)函數(shù)了。
2:常用api
Fabric提供了一組簡單但功能強(qiáng)大的fab-ric.api命令集,簡單地調(diào)用這些API就能完成大部分應(yīng)用場景需求。Fabric支持常用的方法及說明如下:
?local,執(zhí)行本地命令,如:local('uname-s');
?lcd,切換本地目錄,如:lcd('/home');
?cd,切換遠(yuǎn)程目錄,如:cd('/data/logs');
?run,執(zhí)行遠(yuǎn)程命令,如:run('free-m');
?sudo,sudo方式執(zhí)行遠(yuǎn)程命令,如:sudo('/etc/init.d/httpd start');
?put,上傳本地文件到遠(yuǎn)程主機(jī),如:put('/home/user.info', '/data/user.info');
?get,從遠(yuǎn)程主機(jī)下載文件到本地,如:get('/data/user.info', '/home/root.info');
?prompt,獲得用戶輸入信息,如:prompt('please input user password:');
?confirm,獲得提示信息確認(rèn),如:con-firm("Tests failed. Continue[Y/N]?");
?reboot,重啟遠(yuǎn)程主機(jī),如:reboot();
?@task,函數(shù)修飾符,標(biāo)識(shí)的函數(shù)為fab可調(diào)用的,非標(biāo)記對fab不可見,純業(yè)務(wù)邏輯;
?@runs_once,函數(shù)修飾符,標(biāo)識(shí)的函數(shù)只會(huì)執(zhí)行一次,不受多臺(tái)主機(jī)影響。
3:示例:查看本地與遠(yuǎn)程主機(jī)信息
使用local()方法執(zhí)行本地命令;@runs_once修飾符保證該任務(wù)函數(shù)只執(zhí)行一次;run()方法執(zhí)行遠(yuǎn)程命令;@task修飾符標(biāo)致入口函數(shù)
#!/usr/bin/env python from fabric.api import * env.usr='root' env.hosts=['18.16.200.150'] env.password="shitouit@2018" @runs_once def local_task(): local('ifconfig') @runs_once def input_raw(): return prompt('ples input the dir you want to lookup:',default='/root') def remote_task(dirname): with cd(dirname): run('ls -l') @task def go(): local_task() getdir = input_raw() remote_task(getdir)
執(zhí)行結(jié)果如下圖:
4:示例:網(wǎng)關(guān)模式文件上傳與執(zhí)行
本示例通過Fabric的evn對象定義網(wǎng)關(guān)模式,即俗稱的中轉(zhuǎn)、堡壘機(jī)環(huán)境。定義格式為“env.gateway='18.16.200.150'”,其中IP“18.16.200.150”為堡壘機(jī)IP,再結(jié)合任務(wù)函數(shù)實(shí)現(xiàn)目標(biāo)主機(jī)文件上傳與執(zhí)行的操作,詳細(xì)源碼如下:
#!/usr/bin/env python from fabric.api import * from fabric.context_managers import * from fabric.contrib.console import confirm env.usr='root' env.gateway='18.16.200.150' env.hosts=['18.16.200.151','18.16.200.152'] env.passwords={ "root@18.16.200.151:22": "shitouit@2018", "root@18.16.200.152:22": "shitouit@2018", "root@18.16.200.150:22": "shitouit@2018", } lpackpath = "/root/harbor-offline-installer-v1.4.0.tgz" rpackpath = "/tmp/install" @task def put_task(): run('mkdir '+ rpackpath) with settings(warn_only=True): result = put(lpackpath,rpackpath) if not result and not confirm("put file faild,Continue[Y/N]?"): abort("Aborting file put task!") @task def run_task(): with cd(rpackpath): run('tar zvxf harbor-offline-installer-v1.4.0.tgz') @task def go(): put_task() run_task()
執(zhí)行結(jié)果如下圖: