六、自動化部署工具fabric

  1. 之前的paramiko庫可以幫我們在python程序中連接遠(yuǎn)程服務(wù)器重抖,但步驟較為繁瑣,使用paramiko時需要花費比較多的時間在python編程上祖灰,fabric也是一個python編寫的基于ssh的庫钟沛,提供簡潔的api,可以讓運維人員專注于linux服務(wù)器的管理局扶,而不是python程序設(shè)計的細(xì)節(jié)
  2. 從簡單應(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
  3. 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í)行該過程伐坏。
  4. fabric的命令行參數(shù)



    在命令行執(zhí)行fab命令


  5. 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)
    
  6. 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
  7. 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í)行
  8. 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
  9. 其他有用函數(shù)
    • execute
      execute可以讓我們在一個task中執(zhí)行其他task
    • utils函數(shù) fabric.utils
      abort終止程序執(zhí)行,打印錯誤信息
      warn輸出警告信息
      puts打印輸出
    • color函數(shù) fabric.colors
      包含如下函數(shù)


  10. 最后看一個綜合性的例子盅粪,在服務(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)
    
最后編輯于
?著作權(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
  • 文/潘曉璐 我一進(jìn)店門影锈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人民晒,你說我怎么就攤上這事精居。” “怎么了潜必?”我有些...
    開封第一講書人閱讀 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)容