您好,登錄后才能下訂單哦!
Fabric是基于Python(2.5及以上版本)實現(xiàn)的SSH命令行工具,簡化了SSH的應用程序部署及系統(tǒng)管理任務,它提供了系統(tǒng)基礎的操作組件,可以實現(xiàn)本地或遠程shell命令,包括命令執(zhí)行、文件上傳、下載及完整執(zhí)行日志輸出等功能。Fab-ric在paramiko的基礎上做了更高一層的封裝,操作起來會更加簡單。Fabric官網(wǎng)地址為:http://www.fabfile.org
一:fab常用參數(shù)
fab作為Fabric程序的命令行入口,提供了豐富的參數(shù)調(diào)用,命令格式如下:
fab [options] [:arg1,arg2=val2,host=foo,hosts='h2;h3',...] ...下面列舉了常用的幾個參數(shù),更多參數(shù)可使用fab-help查看。
?-l,顯示定義好的任務函數(shù)名;
?-f,指定fab入口文件,默認入口文件名為fabfile.py;
?-g,指定網(wǎng)關(guān)(中轉(zhuǎn))設備,比如堡壘機環(huán)境,填寫堡壘機IP即可;
?-H,指定目標主機,多臺主機用“,”號分隔;
?-P,以異步并行方式運行多主機任務,默認為串行運行;
?-R,指定role(角色),以角色名區(qū)分不同業(yè)務組設備;
?-t,設置設備連接超時時間(秒);
?-T,設置遠程主機命令執(zhí)行超時時間(秒);
?-w,當命令執(zhí)行失敗,發(fā)出告警,而非默認中止任務。
有時候我們甚至不需要寫一行Python代碼也可以完成遠程操作,直接使用命令行的形式,例如:
fab -p "shitouit@2018" -H 18.16.200.151 -- 'ls '
命令運行結(jié)果如下圖
二:fabfile的編寫
fab命令是結(jié)合我們編寫的fabfile.py(其他文件名須添加-f filename引用)來搭配使用的,部分命令行參數(shù)可以通過相應的方法來代替,使之更加靈活,例如“-H 192.168.1.21,192.168.1.22”,我們可以通過定義env.hosts來實現(xiàn),如“env.hosts=['192.168.1.21', '192.168.1.22']”。fab-file的主體由多個自定義的任務函數(shù)組成,不同任務函數(shù)實現(xiàn)不同的操作邏輯,下面詳細介紹。
1:全局屬性設定
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.pass-word='KSJ3548t7d'。
?env.passwords,與password功能一樣,區(qū)別在于不同主機不同密碼的應用場景,需要注意的是,配置passwords時需配置用戶、主機、端口等信息,如: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)、堡壘機)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組主機區(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']}
引用時使用Python修飾符的形式進行,角色修飾符下面的任務函數(shù)為其作用域,下面來看一個示例:
@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就可以實現(xiàn)不同角色執(zhí)行不同的任務函數(shù)了。
2:常用api
Fabric提供了一組簡單但功能強大的fab-ric.api命令集,簡單地調(diào)用這些API就能完成大部分應用場景需求。Fabric支持常用的方法及說明如下:
?local,執(zhí)行本地命令,如:local('uname-s');
?lcd,切換本地目錄,如:lcd('/home');
?cd,切換遠程目錄,如:cd('/data/logs');
?run,執(zhí)行遠程命令,如:run('free-m');
?sudo,sudo方式執(zhí)行遠程命令,如: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,獲得提示信息確認,如:con-firm("Tests failed. Continue[Y/N]?");
?reboot,重啟遠程主機,如:reboot();
?@task,函數(shù)修飾符,標識的函數(shù)為fab可調(diào)用的,非標記對fab不可見,純業(yè)務邏輯;
?@runs_once,函數(shù)修飾符,標識的函數(shù)只會執(zhí)行一次,不受多臺主機影響。
3:示例:查看本地與遠程主機信息
使用local()方法執(zhí)行本地命令;@runs_once修飾符保證該任務函數(shù)只執(zhí)行一次;run()方法執(zhí)行遠程命令;@task修飾符標致入口函數(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)、堡壘機環(huán)境。定義格式為“env.gateway='18.16.200.150'”,其中IP“18.16.200.150”為堡壘機IP,再結(jié)合任務函數(shù)實現(xiàn)目標主機文件上傳與執(zhí)行的操作,詳細源碼如下:
#!/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é)果如下圖:
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。