python自動化遠程部署-fabric

項目發(fā)布部署時袖瞻,往往需要花大量的時間去ssh多臺機器,然后逐一敲重復(fù)的命令煞躬,同樣的操作和同樣的命令反復(fù)做肛鹏,作為一個程序員是不能忍受的逸邦,這也是自動化存在的意義,可以大大節(jié)省不必要的時間在扰,python做為一個腳本語言本身就有這方面的優(yōu)勢缕减,fabric 這個庫可以很好的偷懶,本文使用python3芒珠。

安裝

會安裝一大堆包桥狡,提示 Successfully installed 等字樣表示安裝成功,安裝完后皱卓,系統(tǒng)有一個 fab 命令可以使用裹芝。想要了解更多,看 官方文檔 娜汁。

sudo pip3 install fabric3

簡單示例

1嫂易、先見識一下使用效果,然后再看常用的一些命令
例一:執(zhí)行遠程主機命令掐禁,查看主機操作系統(tǒng)炬搭, 'uname -o'
首先創(chuàng)建一個 check.py 文件

from fabric.api import run  # 導(dǎo)入api中的run
      
def look():     
     run('uname -o')        # 執(zhí)行run函數(shù),把用使用的命令傳入

然后使用 fab 命令執(zhí)行穆桂,輸入目標(biāo)主機用戶密碼后即可執(zhí)行命令,并打印結(jié)果

fab -f check.py -H 127.0.0.1 'look'     # -f指定文件融虽, -H 指定主機享完,這里我們直接用本地, look 是文件里面的任務(wù)函數(shù)名

輸出的結(jié)果如下:
例一執(zhí)行結(jié)果

這里只是一個小示例有额,當(dāng)然不可能每個都自己手動輸入密碼般又,通過配置都可以完成自動化。

例二:多臺遠程主機創(chuàng)建目錄 test 巍佑。

  1. 創(chuàng)建一個 mk_dir.py 文件:
from fabric.api import *
  
# 設(shè)置目標(biāo)主機
env.hosts = ['192.168.139.139', '192.168.139.141']
# 設(shè)置多臺主機用戶名及密碼
env.passwords = {
        'python@192.168.139.139:22': '12345678',     
        'python@192.168.139.141:22': '12345678'
    }
# 設(shè)置一個任務(wù)
@task
def start():
    run('mkdir test')
  1. 然后執(zhí)行任務(wù)
fab -f mk_dir.py start      # start 是任務(wù)名

結(jié)果如下茴迁,可以在兩個主機的 python 用戶家目錄看到 test 文件夾,這樣就可以實現(xiàn)自動連接遠程主機萤衰,并執(zhí)行相應(yīng)的任務(wù)了堕义。
例二執(zhí)行結(jié)果

例三:打包本地文件,上傳到目標(biāo)主機脆栋,并校驗 md5 倦卖,然后解壓并執(zhí)行這個文件(該例可以配合后面的命令說明測試)

場景:本地有一個 /home/python/test/test.py 文件,打包成 test.tar.gz 椿争,上傳到目標(biāo)主機的 /home/python/temp 目錄下怕膛,解壓并執(zhí)行。

  1. 創(chuàng)建一個本地的test.py如下秦踪,用來上傳后執(zhí)行:
print('===========')
print('hello world')
print('===========')
  1. 創(chuàng)建一個任務(wù)文件 uploadfile.py
from fabric.api import *
 
 
env.hosts = ['192.168.139.139', '192.168.139.141']
env.user = 'python'   # 多臺主機用戶名密碼相同可以只寫一次
env.password = '12345678'
 
# 打包
@runs_once            # 該裝飾器表示只執(zhí)行一次褐捻,沒有的話默認每臺主機都執(zhí)行一次
def task_tar():      # 該場景本地文件打包本身就只需要執(zhí)行一次
    with lcd('/home/python/test'):
        local('tar zcvf test.tar.gz test.py')
 
# 上傳
def task_upload():
    run('mkdir -p /home/python/temp')
    put('/home/python/test/test.tar.gz', '/home/python/temp/test.tar.gz')
 
# 驗證md5
def task_md5():
    # 計算本地的md5
    local_md5 = local('md5sum /home/python/test/test.tar.gz', capture=True).split('  ')[0]
    # 計算遠程主機md5
    remote_md5 = run('md5sum /home/python/temp/test.tar.gz').split('  ')[0]
    print(local_md5)
    print(remote_md5)
    if remote_md5 == local_md5:
        print('上傳成功')
    else:
        print('上傳出錯')
 
# 解包并執(zhí)行
def task_exc():
    with cd('/home/python/temp'):
        run('tar zxvf test.tar.gz')
        run('python3 test.py')
 
# 調(diào)度
@task
def start():
    task_tar()
    task_upload()
    task_md5()
    task_exc()
  1. 執(zhí)行任務(wù):
fab -f uploadfile.py start
  1. 屏幕輸出結(jié)果如下
[python@ubuntu Test]$ fab -f uploadfile.py start
[192.168.139.139] Executing task 'start'
[localhost] local: tar zcvf test.tar.gz test.py
test.py
[192.168.139.139] run: mkdir -p /home/python/temp
[192.168.139.139] put: /home/python/test/test.tar.gz -> /home/python/temp/test.tar.gz
[localhost] local: md5sum /home/python/test/test.tar.gz
[192.168.139.139] run: md5sum /home/python/temp/test.tar.gz
[192.168.139.139] out: d5e8f717b176270f4c1a4fa72493239a  /home/python/temp/test.tar.gz
[192.168.139.139] out: 
 
d5e8f717b176270f4c1a4fa72493239a
d5e8f717b176270f4c1a4fa72493239a
上傳成功
[192.168.139.139] run: tar zxvf test.tar.gz
[192.168.139.139] out: test.py
[192.168.139.139] out: 
 
[192.168.139.139] run: python3 test.py
[192.168.139.139] out: ===========
[192.168.139.139] out: hello world
[192.168.139.139] out: ===========
[192.168.139.139] out: 
 
[192.168.139.141] Executing task 'start'
[192.168.139.141] run: mkdir -p /home/python/temp
[192.168.139.141] put: /home/python/test/test.tar.gz -> /home/python/temp/test.tar.gz
[localhost] local: md5sum /home/python/test/test.tar.gz
[192.168.139.141] run: md5sum /home/python/temp/test.tar.gz
[192.168.139.141] out: d5e8f717b176270f4c1a4fa72493239a  /home/python/temp/test.tar.gz
[192.168.139.141] out: 
 
d5e8f717b176270f4c1a4fa72493239a
d5e8f717b176270f4c1a4fa72493239a
上傳成功
[192.168.139.141] run: tar zxvf test.tar.gz
[192.168.139.141] out: test.py
[192.168.139.141] out: 
 
[192.168.139.141] run: python3 test.py
[192.168.139.141] out: ===========
[192.168.139.141] out: hello world
[192.168.139.141] out: ===========
[192.168.139.141] out: 
 
 
Done.
Disconnecting from 192.168.139.139... done.
Disconnecting from 192.168.139.141... done.

常用命令

常用參數(shù)

  • -l : 列出指定文件的任務(wù)函數(shù)名掸茅,只有使用了裝飾器 @task 的才會列出
  • -H : 指定目標(biāo)主機,多臺主機用","號分割
  • -u:指定遠程用戶名
  • -f : 指定fab的任務(wù)文件柠逞,默認的任務(wù)文件名是fabfile.py昧狮,即文件直接命名 fabfile.py ,可以不用 -f 指定文件
  • -t:設(shè)置超時時間边苹,單位秒
  • -V:查看版本

API

  • @task : 函數(shù)裝飾器陵且,裝飾的函數(shù)fab才能調(diào)用
  • @runs_once : 函數(shù)裝飾器,裝飾的函數(shù)只執(zhí)行一次
  • local : 執(zhí)行本地命令个束,例:local('ls -la')
  • run : 執(zhí)行遠程命令慕购,例:run('ls -la')
  • lcd : 切換本地目錄,例:lcd('/home/python')
  • cd : 切換遠程目錄茬底,例:cd('/home/python')
  • put : 上傳本地文件到遠程主機沪悲,例:put('test', '/home/python/')
  • get : 從遠程主機下載文件到本地,例:get('/home/python/test', './')
  • reboot : 重啟遠程主機阱表,例:reboot()
  • sudo : sudo執(zhí)行遠程命令殿如,例:sudo('service nginx start')

主機設(shè)置

  • env.host : 設(shè)置目標(biāo)主機
  • env.user : 設(shè)置用戶名
  • env.port : 設(shè)置目標(biāo)主機端口,默認是22
  • env.password : 設(shè)置密碼
  • env.passwords : 設(shè)置多臺主機不同的密碼最爬。

個人博客:python遠程自動化部署

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涉馁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子爱致,更是在濱河造成了極大的恐慌烤送,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件糠悯,死亡現(xiàn)場離奇詭異帮坚,居然都是意外死亡,警方通過查閱死者的電腦和手機互艾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門试和,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纫普,你說我怎么就攤上這事阅悍。” “怎么了局嘁?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵溉箕,是天一觀的道長。 經(jīng)常有香客問我悦昵,道長肴茄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任但指,我火速辦了婚禮寡痰,結(jié)果婚禮上抗楔,老公的妹妹穿的比我還像新娘。我一直安慰自己拦坠,他們只是感情好连躏,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贞滨,像睡著了一般入热。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晓铆,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天勺良,我揣著相機與錄音,去河邊找鬼骄噪。 笑死尚困,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的链蕊。 我是一名探鬼主播事甜,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼滔韵!你這毒婦竟也來了逻谦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤陪蜻,失蹤者是張志新(化名)和其女友劉穎跨跨,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體囱皿,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年忱嘹,在試婚紗的時候發(fā)現(xiàn)自己被綠了嘱腥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡拘悦,死狀恐怖齿兔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情础米,我是刑警寧澤分苇,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站屁桑,受9級特大地震影響医寿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蘑斧,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一靖秩、第九天 我趴在偏房一處隱蔽的房頂上張望须眷。 院中可真熱鬧,春花似錦沟突、人聲如沸花颗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扩劝。三九已至,卻和暖如春职辅,著一層夾襖步出監(jiān)牢的瞬間棒呛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工罐农, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留条霜,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓涵亏,卻偏偏與公主長得像宰睡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子气筋,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理拆内,服務(wù)發(fā)現(xiàn),斷路器宠默,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • http://python.jobbole.com/85231/ 關(guān)于專業(yè)技能寫完項目接著寫寫一名3年工作經(jīng)驗的J...
    燕京博士閱讀 7,575評論 1 118
  • fabric 介紹 Fabic是一個python(2.5-2.7)庫,用于簡化使用ssh的應(yīng)用程序部署,或系統(tǒng)管理...
    bdslinux閱讀 2,854評論 3 4
  • 五麸恍、Docker 端口映射 無論如何,這些 ip 是基于本地系統(tǒng)的并且容器的端口非本地主機是訪問不到的搀矫。此外抹沪,除了...
    R_X閱讀 1,748評論 0 7
  • 序言第1章 并行和分布式計算介紹第2章 異步編程第3章 Python的并行計算第4章 Celery分布式應(yīng)用第5章...
    SeanCheney閱讀 12,504評論 3 35