- 之前的paramiko庫可以幫我們在python程序中連接遠(yuǎn)程服務(wù)器重抖,但步驟較為繁瑣,使用paramiko時需要花費比較多的時間在python編程上祖灰,fabric也是一個python編寫的基于ssh的庫钟沛,提供簡潔的api,可以讓運維人員專注于linux服務(wù)器的管理局扶,而不是python程序設(shè)計的細(xì)節(jié)
- 從簡單應(yīng)用中看fabric
pip install fabric --user
使用fabric時恨统,需要編寫一個python文件,文件中包含一些函數(shù)详民,在fabric中稱為task
fab命令執(zhí)行時延欠,默認(rèn)從當(dāng)前文件夾下的fabfile.py文件中讀取內(nèi)容,也可以在運行時使用-f選項指定fabfile文件沈跨,編寫fabfile文件如下from fabric.api import run, sudo from fabric.api import env env.hosts=['192.168.56.101', '192.168.56.104'] env.port = 22 env.user = 'root' env.password = 'wodemima' def hostname(): run('hostname') def ls(path='.'): run('ls {}'.format(path)) def tail(path='/etc/passwd', line=10): sudo('tail -n {} {}'.format(line, path))
其中run是遠(yuǎn)程命令的封裝由捎,sudo是以sudo權(quán)限執(zhí)行,env是全局的配置字典饿凛,使用--list查看當(dāng)前的task
執(zhí)行任務(wù)hostname
像函數(shù)一樣執(zhí)行task
- fabric的執(zhí)行模型
創(chuàng)建任務(wù)列表狞玛,即fabric中的task列表,fabfile中的系列python函數(shù)涧窒,對每個任務(wù)構(gòu)建其目標(biāo)主機心肪,可以通過role裝飾器指定(下面會講),通過env.hosts指定纠吴,通過-H參數(shù)指定硬鞍,之后遍歷任務(wù)列表,對每個任務(wù)列表在相應(yīng)的目標(biāo)主機上執(zhí)行,可以理解為兩層for循環(huán)固该,外層是task锅减,內(nèi)層是host。默認(rèn)的fabric會串行執(zhí)行該過程伐坏。 -
fabric的命令行參數(shù)
在命令行執(zhí)行fab命令
- fabric的env字典
fabric的配置信息除了可以在命令行指定以外怔匣,還可以使用env字典來配置,就像一開始給出的例子一樣桦沉,在env中配置ssh信息每瞒。常用的配置有
可以使用下面的方式查看env配置信息
fab show_env
import json from fabric.api import env def show_env(): print(json.dumps(env, indent=4)
- fabric提供的命令
- run遠(yuǎn)程執(zhí)行命令
- sudo以sudo權(quán)限執(zhí)行命令
- local在本地執(zhí)行命令,如果要執(zhí)行復(fù)雜的命令可以使用subprocess
- get獲取遠(yuǎn)程文件纯露,指明remote_path與local_path即可
- put上傳文件剿骨,知名remote_path,local_path,與遠(yuǎn)程文件權(quán)限mode
- fabric上下文管理器
有時候我們只想在執(zhí)行某些命令時改變系統(tǒng)設(shè)置,而不是全局修改苔埋,當(dāng)命令執(zhí)行完畢后返回至之前的環(huán)境中懦砂,上下文管理器可以幫我們完成類似請求- cd切換遠(yuǎn)程目錄
with cd('/etc/'): run('ls')
- lcd切換本地目錄
-
path用于設(shè)置遠(yuǎn)程服務(wù)器的環(huán)境變量,三種行為可選
- prefix命令前綴组橄,即對之后的操作的每一條命令荞膘,都加上該前綴
- shell_env用于設(shè)置shell環(huán)境變量
- settings用于臨時覆蓋env
-
hide隱藏輸出,可供隱藏的信息類型如下
- quiet隱藏全部輸出
- warn_only settings(warn_only=True)當(dāng)命令出錯時僅給出警告玉工,繼續(xù)執(zhí)行
- cd切換遠(yuǎn)程目錄
- fabric裝飾器
裝飾器的使用與原生python裝飾器的使用相同- task裝飾器
task是fabric的執(zhí)行單元羽资,默認(rèn)情況下,fabfile中的每一個函數(shù)都是task遵班,當(dāng)我們指定了一個某一個函數(shù)為task(使用裝飾器@task修飾該函數(shù))時屠升,其他函數(shù)將不會被認(rèn)為是task - hosts裝飾器
fabric指定目標(biāo)主機的方式有三種,可以在命令行中使用-H選項指定主機狭郑,可以在env設(shè)置hosts中指定主機腹暖,可以使用hosts裝飾器指定task主機
通過hosts指定該task的目標(biāo)主機
類似于
fab task:hosts='host1;host2'
- role裝飾器
介紹裝飾器之前先理解role的概念,role即角色翰萨,在一個web集群中脏答,可能有數(shù)據(jù)庫服務(wù)、緩存服務(wù)亩鬼、dns服務(wù)殖告、web頁面服務(wù),每個服務(wù)又可能包含有多臺主機雳锋,將相同功能的主機組定義為一個角色黄绩,分配一個角色名稱,在task前使用role裝飾器選定該role玷过,可以讓task在該role指定的主機上運行爽丹,歸根結(jié)底還是為了方便主機的選取筑煮。定義role時,使用env.roledefs這個字典來定義习劫,將內(nèi)容賦值給該字典咆瘟,即可用@role裝飾器使用其中的role嚼隘,看下面的例子from fabric.api import run, sudo,env env.hosts=['192.168.56.101', '192.168.56.102'] env.port=22 env.user='root' env.password='wodemima' env.roledefs={ 'test1':['192.168.56.101'], 'test2':['192.168.56.102'] } @roles('test1') @task def ls(path='./'): run('ls {}'.format(path))
- parallel
在目標(biāo)服務(wù)器列表上并行執(zhí)行task诽里,可以理解為同時在多臺服務(wù)器上執(zhí)行task,fabric中的執(zhí)行模型在之前提到飞蛹,串行執(zhí)行的方式對一些執(zhí)行時間較長的任務(wù)會花費我們許多時間谤狡,這些進(jìn)程間本來沒有任何的聯(lián)系,并行執(zhí)行更符合需求卧檐。要并行執(zhí)行task墓懂,只需要使用parallel裝飾器即可。另外可以使用fab命令的-P參數(shù)(--parallel)通知程序并行執(zhí)行程序霉囚,另外還可以使用env.parallel變量來指定是否并行執(zhí)行 - run_once
這個裝飾器可以讓被修飾的task僅運行一次捕仔,比如打包本地文件上傳至服務(wù)器,打包本地文件的行為應(yīng)該僅需運行一次盈罐,而不管其他task多次調(diào)用該task - serial
和parallel相反榜跌,serial強制fabric串行執(zhí)行task
- task裝飾器
- 其他有用函數(shù)
- execute
execute可以讓我們在一個task中執(zhí)行其他task - utils函數(shù) fabric.utils
abort終止程序執(zhí)行,打印錯誤信息
warn輸出警告信息
puts打印輸出 -
color函數(shù) fabric.colors
包含如下函數(shù)
- execute
- 最后看一個綜合性的例子盅粪,在服務(wù)器組部署redis服務(wù)
編輯fabfile文件from fabric.api import * from fabric.contrib.console import confirm from fabric.colors import green from fabric.utils import abort env.hosts = ['192.168.56.101', '192.168.56.102'] env.user = 'root' env.password = 'wodemima' env.port = 22 @task @runs_once def local_test(): local("tar -xf redis-4.0.9.tar.gz") with lcd('redis-4.0.9'), settings(warn_only=True): result = local("make && make test", capture=True) if result.failed and not confirm("Tests failed, continue anyway?"): abort("Aborting at user request!") else: print green("all tests passed without error") @task def put_file(): put('redis-4.0.9.tar.gz', '/tmp/redis-4.0.9.tar.gz') @task def install(): with cd('/tmp'): run('tar -xf redis-4.0.9.tar.gz') with cd('/tmp/redis-4.0.9'): run('make && make install') @task def clean_local(): local("rm -rf redis-4.0.9") @task def install_process(): execute(local_test) execute(put_file) execute(install) execute(clean_local)
六、自動化部署工具fabric
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門影锈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人民晒,你說我怎么就攤上這事精居。” “怎么了潜必?”我有些...
- 文/不壞的土叔 我叫張陵靴姿,是天一觀的道長。 經(jīng)常有香客問我磁滚,道長佛吓,這世上最難降的妖魔是什么宵晚? 我笑而不...
- 正文 為了忘掉前任,我火速辦了婚禮维雇,結(jié)果婚禮上淤刃,老公的妹妹穿的比我還像新娘。我一直安慰自己吱型,他們只是感情好逸贾,可當(dāng)我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著津滞,像睡著了一般铝侵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上触徐,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼崔慧!你這毒婦竟也來了拂蝎?” 一聲冷哼從身側(cè)響起,我...
- 正文 年R本政府宣布营密,位于F島的核電站,受9級特大地震影響目锭,放射性物質(zhì)發(fā)生泄漏评汰。R本人自食惡果不足惜纷捞,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望被去。 院中可真熱鬧主儡,春花似錦、人聲如沸惨缆。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽踪央。三九已至臀玄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間畅蹂,已是汗流浹背。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理示损,服務(wù)發(fā)現(xiàn),斷路器嚷硫,智...
- 最近公司給了臺web測試服務(wù)器检访,最近正好學(xué)習(xí)python語言的flask框架,琢磨著搭個小博客玩玩仔掸,但是每次修改代...
- Python 面向?qū)ο驪ython從設(shè)計之初就已經(jīng)是一門面向?qū)ο蟮恼Z言脆贵,正因為如此,在Python中創(chuàng)建一個類和對...
- 不會。實際上负懦,隔離見證的設(shè)計目標(biāo)中有一條就是筒捺,要避免由于用戶費率估計以及礦工最優(yōu)費率區(qū)塊建構(gòu),而迫使用戶進(jìn)行多維度...