fabric2.0 使用說明

fabric2.0 使用說明

fabric框架腰懂,主要的目的就是用來遠(yuǎn)程自動化部署项秉。在最近,作者將fabric框架重寫了一遍怖喻,升級到了2.0版本岁诉。在我學(xué)習(xí)過程中,遇到了不少的坑哗蜈,最坑的一次就是python編譯器老是給我提示,fabric 導(dǎo)入 api失敗候生,沒有fabric.api绽昼。我不斷的懷疑自己是不是腦子瓦特了的時候须蜗,我pip list 查看了一下版本明肮,再看了一下github版本。

我謝謝作者嘔心瀝血的更新框架循未。

本說明秫舌,結(jié)合官方文檔,使用效果更佳嫂粟。

安裝

pip install fabric 

查看一下pip安裝fabric的版本號:

fabric 2.1.3

一切OK墨缘,開始練習(xí)镊讼。

初步的使用

準(zhǔn)備兩臺機(jī)器。一個pc护糖,一個虛機(jī)就行嚼松。我的是兩個虛機(jī),ip地址如下:

虛機(jī)1: 192.168.11.11 系統(tǒng):ubuntu

虛機(jī)2: 192.168.11.111 系統(tǒng):centos

確保兩個虛機(jī)都能使用SSH連接寝受。

我的操作都是在(虛機(jī)1)上進(jìn)行罕偎。。甩苛。

from fabric import Connection
In [3]: c = Connection('192.168.11.111', port=22, user='root', connect_kwargs={'password':'1'})

In [4]: result = c.run('uname -s')
Linux

代碼說明:

我們一切的遠(yuǎn)程shell命令的執(zhí)行都是基于Connection來實現(xiàn)的讯蒲。實現(xiàn)的原理,也就是SSH赁酝。

Connection中一些參數(shù):

  1. host 主機(jī)地址
  2. port 端口號
  3. user 用戶名

連接的一些其他參數(shù)都放到connect_kwargs中旭等。我這使用了密碼連接搔耕。(試了半天,查看api手冊才試對)

當(dāng)我們獲取到了Connection對象之后弃榨,我們就可以使用它來進(jìn)行一些命令惭墓。

result是執(zhí)行的結(jié)果,包含了許多屬性值划咐,如下:

In [8]: result.
result.command      result.connection   result.encoding     result.env          result.exited       result.failed       result.hide         result.ok           result.pty          result.return_code  result.shell        result.stderr       result.stdout   

關(guān)于c.run()命令:

Connection objects’ methods (like run) usually return instances of invoke.runners.Result (or subclasses thereof) exposing the sorts of details seen above: what was requested, what happened while the remote action occurred, and what the final result was.

                                                    -----引用 http://docs.fabfile.org/en/2.1/getting-started.html

也就是 Connection 對象的方法(例如run) 常常返回invoke.runners.Result的實例钧萍,這個實例暴露了一些細(xì)節(jié):

我們請求了什么风瘦,我們遠(yuǎn)程操作發(fā)生了什么,最終的結(jié)果又是什么胡桨。

以上是fabric的初步使用瞬雹。

自動回復(fù)

當(dāng)我們需要sudo操作的權(quán)限的時候酗捌,遠(yuǎn)程服務(wù)器會阻塞在那涌哲,直到我們輸入密碼尚镰,這肯定是不行的。如果這么low初烘,那我們使用這個框架做啥子敞曹?

我們開始試驗:(我centos是root權(quán)限澳迫,所以來個騷操作)

手動輸入版本:

In [13]: c.run('ssh tly@192.168.11.11', pty=True)
The authenticity of host '192.168.11.11 (192.168.11.11)' can't be established.
ECDSA key fingerprint is SHA256:vDOg8wbz0RSFDPGJGEmMc6lT32eR13xW9NxOPxRO2t0.
ECDSA key fingerprint is MD5:f7:77:c8:bf:e0:ba:bd:8b:4d:48:6a:86:f0:3a:dc:31.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.11.11' (ECDSA) to the list of known hosts.
tly@192.168.11.11's password: 
Welcome to Ubuntu 16.04 LTS (GNU/Linux 4.4.0-130-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

350 packages can be updated.
0 updates are security updates.

Last login: Wed Jul 11 14:11:36 2018 from 192.200.41.46
tly@tly-dev:~$ exit
logout
Connection to 192.168.11.11 closed.
Out[13]: <Result cmd='ssh tly@192.168.11.11' exited=0>

pty=True橄登,我的理解就是將遠(yuǎn)程終端的stdout輸出到本地讥此。如果不添加會報錯。

上面卒稳,我們連接了192.168.11.111 他巨,然后又用ssh連接到了192.168.11.11(要不是測試染突,我想我腦子瓦特了),之后也榄,命令返回了終端需要我們輸入密碼的字眼司志。我手動的輸入密碼,操作成功囚霸。

自動輸入的版本:

In [14]: from invoke import Responder 

In [15]: sudopass = Responder(
   ....: pattern=r"'s password:",
   ....: response='1\n',
   ....: )

In [16]: c.run('ssh tly@192.168.11.11', pty=True, watchers=[sudopass])
tly@192.168.11.11's password: 
Welcome to Ubuntu 16.04 LTS (GNU/Linux 4.4.0-130-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

350 packages can be updated.
0 updates are security updates.

Last login: Wed Jul 11 15:11:53 2018 from 192.168.11.111
tly@tly-dev:~$ exit
logout
Connection to 192.168.11.11 closed.
Out[16]: <Result cmd='ssh tly@192.168.11.11' exited=0>

分析如下:

引入了invoke中的Responder庫邮辽。這個庫將用來匹配字符串,并自動回復(fù)吨述。

從終端發(fā)回來的數(shù)據(jù)來看揣云,我們阻塞的地方就是我們需要填寫密碼的地方。即:

tly@192.168.11.11's password:

所以在創(chuàng)建Responder對象的時候刘莹,匹配的字符串就選擇“ 's password:” 來匹配焚刚。 

response參數(shù)也就是我們需要自動回復(fù)的文本矿咕。

sudo幫手

我遠(yuǎn)程終端是centos 根用戶運行的。不需要root, 所以我切換到centos下使用fabric捡絮。

使用如下:

In [1]: import getpass
In [3]: sudo_pass = getpass.getpass("What's your sudo password?")
What's your sudo password?

In [5]: from fabric import Config

In [6]: from fabric import Connection

In [7]: sudo_pass = getpass.getpass("What's your sudo password?")
What's your sudo password?

In [8]: config = Config(overrides={'sudo': {'password': sudo_pass}})
In [11]: c = Connection('192.168.11.11', port=22, user='tly', config=config, connect_kwargs={'password':'1'})

In [12]: c.sudo('whoami', hide='stderr')
root
Out[12]: <Result cmd="sudo -S -p '[sudo] password: ' whoami" exited=0>

分析如下:

getpass 只是用來獲取密碼使用的福稳。(私密處理了一下吧)

sudo_pass中就是你輸入的文本值。

傳輸文件

遠(yuǎn)程部署的最常用的命令了吧瑞侮。  (巨坑爹的來了)

命令如下:

In [20]: c
Out[20]: <Connection host=192.168.11.11 user=tly>

In [21]: result = c.put('mysql-rc.yaml', '/home/tly/mysql-rc.yaml')

只要使用put命令就能將文件推送過去了的圆。 

參數(shù):
  1. 為本機(jī)路徑
  2. 為遠(yuǎn)程路徑
    現(xiàn)在這個版本一定要指定遠(yuǎn)程文件名!G凇略板!不然會報錯
    本機(jī)默認(rèn)目錄就是你執(zhí)行腳本的目錄。如果要切換怎么辦慈缔?
    暫時還沒有找到比較方便的方式叮称。所以先建議使用絕對路徑。

如果只是在本地運行命令藐鹤,可以使用

In [27]: from invoke import run

In [28]: run('ls')
anaconda-ks.cfg
mysql-rc.yaml
test_dir
Out[28]: <Result cmd='ls' exited=0>

如何去配置configure文件瓤檐,官方文檔例子問題太大,看完還是不太明白娱节。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市肄满,隨后出現(xiàn)的幾起案子谴古,更是在濱河造成了極大的恐慌质涛,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掰担,死亡現(xiàn)場離奇詭異汇陆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)带饱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門毡代,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人勺疼,你說我怎么就攤上這事教寂。” “怎么了执庐?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵酪耕,是天一觀的道長。 經(jīng)常有香客問我耕肩,道長因妇,這世上最難降的妖魔是什么问潭? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任猿诸,我火速辦了婚禮,結(jié)果婚禮上狡忙,老公的妹妹穿的比我還像新娘梳虽。我一直安慰自己,他們只是感情好灾茁,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布窜觉。 她就那樣靜靜地躺著,像睡著了一般北专。 火紅的嫁衣襯著肌膚如雪禀挫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天拓颓,我揣著相機(jī)與錄音语婴,去河邊找鬼。 笑死驶睦,一個胖子當(dāng)著我的面吹牛砰左,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播场航,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼缠导,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了溉痢?” 一聲冷哼從身側(cè)響起僻造,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤憋他,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后髓削,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體举瑰,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年蔬螟,在試婚紗的時候發(fā)現(xiàn)自己被綠了此迅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡旧巾,死狀恐怖耸序,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鲁猩,我是刑警寧澤坎怪,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站廓握,受9級特大地震影響搅窿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜隙券,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一男应、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧娱仔,春花似錦沐飘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盹憎,卻和暖如春筛峭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背陪每。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工影晓, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人奶稠。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓俯艰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親锌订。 傳聞我的和親對象是個殘疾皇子竹握,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容