fabric的一些示例

fabric

項(xiàng)目發(fā)布和運(yùn)維的工作相當(dāng)機(jī)械瘾敢,頻率還蠻高救赐,導(dǎo)致時(shí)間浪費(fèi)在敲大量重復(fù)的命令上。

修復(fù)bug什么的切油,測(cè)試蝙斜,提交版本庫(kù)(2分鐘)。ssh到測(cè)試環(huán)境pull部署(2分鐘)白翻,rsync到線上機(jī)器
A,B,C,D,E(1分鐘),分別ssh到ABCDE五臺(tái)機(jī)器乍炉,逐一重啟(810分鐘)=1315分鐘

其中郁悶的是,每次操作都是相同得到滤馍,命令一樣岛琼,要命的是在多個(gè)機(jī)器上,很難再本機(jī)一個(gè)腳本搞定巢株,
主要時(shí)間都浪費(fèi)在ssh槐瑞,敲命令上了,寫成腳本阁苞,完全可以一鍵執(zhí)行困檩,花兩分鐘看下執(zhí)行結(jié)果

安裝:詳見(jiàn)安裝篇

from fabric.api import run

def host_test():
    run('uname -s')

fabric常用參數(shù)

  • -l:顯示定義好的任務(wù)函數(shù)名
  • -f:指定fab人口文件,默認(rèn)人口文件名為fabfile.py
  • -H:指定目標(biāo)主機(jī)那槽,多臺(tái)主機(jī)用“,”號(hào)分割

fabric常用API

  • local:執(zhí)行本地命令悼沿,如:local('uname -s')
  • lcd:切換本地目錄,如:lcd('/home')
  • cd:切換遠(yuǎn)程目錄骚灸,如:cd('/etc')
  • run:執(zhí)行遠(yuǎn)程命令糟趾,如:run('free -m')
  • sudo:sudo方式執(zhí)行遠(yuǎn)程命令,如:sudo('touch /abc')
  • put:上傳本地文件到遠(yuǎn)程主機(jī)甚牲,如:put('/hello', '/home/itcast/hello')
  • get:從遠(yuǎn)程主機(jī)下載文件到本地义郑,如:get('/home/python/world', '/home/itcase/world')
  • reboot:重啟遠(yuǎn)程主機(jī),如:reboot()
  • @task:函數(shù)裝飾器丈钙,標(biāo)識(shí)的函數(shù)為fab可調(diào)用的非驮,非標(biāo)記的對(duì)fab不可見(jiàn),純業(yè)務(wù)邏輯
  • @runs_once:函數(shù)裝飾器雏赦,標(biāo)識(shí)的函數(shù)只會(huì)執(zhí)行一次劫笙,不受多臺(tái)主機(jī)影響

fabric全局屬性設(shè)定

  • env.host:定義目標(biāo)主機(jī)芙扎,如:env.host=['192.168.17.192','192.168.17.193']
  • env.user:定義用戶名,如:env.user="root"
  • env.port:定義目標(biāo)主機(jī)端口邀摆,默認(rèn)為22纵顾,如:env.port=“22”
  • env.password:定義密碼,如:env.password="chuanzhi"
  • env.passwords:不同的主機(jī)不同的密碼栋盹,如:env.passowrds={'itcase@192.168.17.192:22':'chuanzhi','itcast@192.168.17.193:22':'python'}
示例1:動(dòng)態(tài)獲取遠(yuǎn)程目錄列表
from fabric.api import *
env.hosts=['192.168.17.192','192.168.17.193']
#env.password='python'
env.passwords = {
    'itcast@192.168.17.192:22':'python',
    'itcast@192.168.17.193:22':'python',
}

@runs_once:
def input_raw():
    return prompt("please input directory name",default="/home")
    
def workask(dirname):
    run('ls -l' + dirname)

@task
def go()
    print('start ...')
    getdirname = input_raw()
    workask(getdirname)
    print('end ...')
示例2:上傳文件并執(zhí)行
from fabric.api import *

env.user = 'itcast'
env.hosts = ['192.168.17.192', '192.168.17.193']
env.password = 'python'

@task
@runs_once
def tar_task():
    with lcd('/home/itcast/testdemo'):
        local('tar zcvf demo.tar.gz demo.py')

@task
def put_task():
    run('mkdir -p /home/itcast/testdemo')
    with cd('/home/itcast/testdemo'):
        put('/home/itcast/testdemo/demo.tar.gz', '/home/itcast/testdemo/demo.tar.gz')
        
@task
def check_task():
    lmd5 = local('md5sun /home/itcast/testdemo/demo.tar.gz', capture=Ture).split(' ')[0]
    rmd5 = run('md5sum /home/itcast/testdemo/demo.tar.gz').split(' ')[0]
    if lmd5 == rmd5
        print('OK ...')
    else:
        print('ERROR ... ')

@task
def run_task():
    with cd('/home/itcast/testdemo'):
        run('tar zxvf demo.tar.gz')
        run('python demo.py')

@task
def go():
    tar_task()
    put_task()
    check_task()
    run_task()
示例3:代碼自動(dòng)化部署
from fabric.api import *

env.user = 'itcast'
env.hosts = ['192.168.17.192', '192.168.17.193']
env.passoword = 'python'

@runs_once
@task
def local_update():
    with lcd("/home/itcast/tmp/itcasthello"):
        local("git add -A")
        local("git commit -m 'update'")
        local("git pull origin master")
        local("git push origin master")

@task
def remotr_update():
    with cd("/home/itcast/tmp/itcasthello"):
        run("git checkout master")
        run("git pull origin master")

@task
def deploy():
    local_update()
    remote_update()

Pexpect
Pexpect是Don Libes的Expect語(yǔ)言的一個(gè)Python實(shí)現(xiàn)施逾,是一個(gè)用來(lái)啟動(dòng)子程序,并使用正則表達(dá)式對(duì)程序輸出做出特定響應(yīng)例获,
以此實(shí)現(xiàn)與其自動(dòng)交互的Python模塊汉额,Pexpect的使用范圍很廣,可以用來(lái)實(shí)現(xiàn)與ssh榨汤、ftp蠕搜、telnet等程序的自動(dòng)交互;
可以用來(lái)自動(dòng)復(fù)制軟件安裝包并在不同機(jī)器自動(dòng)安裝收壕;還可以用來(lái)實(shí)現(xiàn)軟件測(cè)試中與命令行交互的自動(dòng)化妓灌。

import pexpect
import sys

child = pexpect.spawn('ssh root@192.168.1.64')
child.logfile = sys.stdout
child.expect('password:')
child.sendline('111111')
child.expect('root.*')
child.sendline('ll')
child.expect('root.*')
child.sendline('date -R')
child.expect('root.*')
child.sendline('exit')
#coding=utf_8

import sys
from pexpect import pxssh

s = pxssh.pxssh()
s.logfile = sys.stdout
hostname = '192.168.1.64'
username = 'root'
password = '111111'
s.login(hostname, username, password)
s.sendline('ll')
s.prompt()
s.sendline('whoami')
s.prompt()
s.logout
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蜜宪,隨后出現(xiàn)的幾起案子虫埂,更是在濱河造成了極大的恐慌,老刑警劉巖圃验,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掉伏,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡澳窑,警方通過(guò)查閱死者的電腦和手機(jī)斧散,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)摊聋,“玉大人鸡捐,你說(shuō)我怎么就攤上這事÷椴茫” “怎么了闯参?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)悲立。 經(jīng)常有香客問(wèn)我,道長(zhǎng)新博,這世上最難降的妖魔是什么薪夕? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮赫悄,結(jié)果婚禮上原献,老公的妹妹穿的比我還像新娘馏慨。我一直安慰自己,他們只是感情好姑隅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布写隶。 她就那樣靜靜地躺著,像睡著了一般讲仰。 火紅的嫁衣襯著肌膚如雪慕趴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天鄙陡,我揣著相機(jī)與錄音冕房,去河邊找鬼。 笑死趁矾,一個(gè)胖子當(dāng)著我的面吹牛耙册,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播毫捣,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼详拙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蔓同?” 一聲冷哼從身側(cè)響起饶辙,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎牌柄,沒(méi)想到半個(gè)月后畸悬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡珊佣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年蹋宦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咒锻。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡冷冗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惑艇,到底是詐尸還是另有隱情蒿辙,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布滨巴,位于F島的核電站思灌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏恭取。R本人自食惡果不足惜泰偿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蜈垮。 院中可真熱鬧耗跛,春花似錦裕照、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至羔砾,卻和暖如春负间,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蜒茄。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工唉擂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人檀葛。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓玩祟,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親屿聋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子空扎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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

  • fabric 介紹 Fabic是一個(gè)python(2.5-2.7)庫(kù),用于簡(jiǎn)化使用ssh的應(yīng)用程序部署,或系統(tǒng)管理...
    bdslinux閱讀 2,854評(píng)論 3 4
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)润讥,斷路器转锈,智...
    卡卡羅2017閱讀 134,656評(píng)論 18 139
  • fabric學(xué)習(xí)和實(shí)驗(yàn) 安裝package:virtualenv [root@BIGDATA1 pip-9.0.1...
    jianwbj閱讀 800評(píng)論 0 0
  • 部分內(nèi)容轉(zhuǎn)載自搜狗百科 cmd是command的縮寫.即命令提示符(CMD),是在OS / 2 楚殿, Windows...
    青冥之上閱讀 2,392評(píng)論 0 24
  • 致老婆: 昨天在車上我在聽(tīng)手機(jī)上的有聲書撮慨,書中的內(nèi)容講的就是哈耶克流派的自由主義經(jīng)濟(jì)學(xué)觀點(diǎn)。并結(jié)合了中國(guó)現(xiàn)實(shí)中是例...
    whatcanhumando閱讀 261評(píng)論 1 1