fabric 發(fā)布項目

image

fabric 介紹

  • Fabic是一個python(2.5-2.7)庫,用于簡化使用ssh的應(yīng)用程序部署,或系統(tǒng)管理任務(wù)
  • 它提供的操作包括: 執(zhí)行本地或者遠程shell命令,上傳/下載文件,以及其他輔助的功能,如提示用戶輸入,中止執(zhí)行等
    Github主頁: http://github.com/fabric/fabric

fabric的安裝

shell 腳本實現(xiàn)

#!/bin/bash 
Install() { 
        yum install python-setuptools python-devel -y
        easy_install  pip
        pip  -v uninstall  pycrypto  
        pip  -v  install   pycrypto  --upgrade 
        pip   install  fabric
} 
Install
[  $? -eq 0 ]  &&  fab -V  || echo "Install fabric error!"

常用的fabric接口

  • local : 執(zhí)行本地命令,如local('uname -s')
  • lcd: 切換本地目錄, 如lcd('/home') ,進入到home目錄下
  • cd: 切換遠程的目錄, 如cd('/tmp')
  • run: 執(zhí)行遠程命令, 如run('free -m')
  • sudo: 以sudo的方式執(zhí)行遠程命令,如:sudo(/etc/init.d/httpd start)
  • put: 上傳本地文件到遠程主機,put('/etc/fstab','/tmp/fstab.info')
  • get: 從遠程主機下載本地文件到主機 ,get('/etc/fatab','/tmp/fstab.info')
  • prompt:獲得用戶輸入信息交互式,prompt('plese input user password:')
  • confirm: 獲得提示信息確認,confirm('please continue[y/n]')
  • reboot: 重啟遠程主機reboot()
  • colors: 輸入顏色用的

常用的命令

  • -l: 顯示定義好的任務(wù)函數(shù)名字
  • -f: 指定fab入口的文件,默入口文件名為fabile.py
  • -g: 指定網(wǎng)關(guān)設(shè)備,比如堡壘機環(huán)境,填寫堡壘機ip即可
  • -H:指定目標主機, 多臺主機用''號分隔
  • -P:以異步并行方式運行多個主機任務(wù),默認為串行運行
  • -R:指定role角色,以角色名字區(qū)分不同業(yè)務(wù)組設(shè)備
  • -T: 設(shè)定遠程主機命令執(zhí)行超時時間
  • -t: 設(shè)定設(shè)備的連接超時時間
  • -w: 當命令執(zhí)行時效,發(fā)出警告,而非默認終止任務(wù)

常用的裝飾器

  • @runs_once: 函數(shù)修飾符,標識符的函數(shù)只會執(zhí)行一次,不受多臺主機的影響
  • @task: 函數(shù)修飾符,標識符的函數(shù)為fab可調(diào)用,非標記的fab不可見,純屬業(yè)務(wù)邏輯
  • @hosts: 定義按照主機來執(zhí)行如hosts('user1@hostname','user2@hostname')
  • @roles: 函數(shù)修飾符,定義按照角色分組來執(zhí)行,如@roles('web','db')
  • @parallel 和@serial: 任務(wù)并行或串行執(zhí)行芍碧,如果任務(wù)同時被 serial 和 parallel 裝飾器裝飾饲握,parallel 的優(yōu)先級更高私杜。
  • @with_setting(warn_only=True): warn_only表示是否當在遠程機器上執(zhí)行命令,出現(xiàn)錯誤時救欧,fabric是否退出衰粹。將整個函數(shù)封裝起來,其效果類似于執(zhí)行在 settings 上下文管理器中笆怠。如果你想要修改函數(shù)的設(shè)置铝耻,但不愿改動其縮進時,它會很有用蹬刷。

fabric env 環(huán)境變量

  • env.host : 主機ip瓢捉,也可以使用fab選項-H參數(shù)來指定

  • env.roledefs : 角色分組,如:{'web': ['x', 'y'], 'db': ['z']}

  • env.all_hosts:Default 為 []办成,由 fab 設(shè)置的當前正在執(zhí)行命令的主機列表泊柬。僅用于顯示信息。

  • env.exclude_hosts : Default 為 []诈火,指定一個主機串列表兽赁, fab 執(zhí)行期間會跳過列表中的主機。例:env.exclude_hosts = [ '192.168.1.102' ]

  • env.port:定義目標主機端口冷守,默認為22刀崖。例:env.port = '80'。

  • env.password : SSH密碼拍摇,若已經(jīng)設(shè)置好無密碼登錄亮钦,則可以忽略

  • env.passwords:與 password 功能 一樣,區(qū)別在于不同主機不同密碼的應(yīng)用場景充活,需要注意的是蜂莉,配置passweords時需要配置用戶蜡娶,主機,端口等信息映穗。例:

  • env.passwords = {
    'root@192.168.1.104:22':'123',
    'root@192.168.1.86:22':'789',
    'root@222.24.51.147:22':'345643',
    }

  • env.parallel :全局并行參數(shù)窖张,例 env.parallel = True 。
    </code>

fabric 的簡單使用(-)

Fabric工具提供了一個簡單的構(gòu)建工具fab蚁滋,其作為Fabric程序的命令行入口宿接,提供了豐富的參數(shù)調(diào)用。

fab 默認會讀取當前目錄叫做fabfile.py名字的文件,這個是默認的, 如果當前目錄沒有,就去上級目錄
也就是父目錄中去找這個文件

[root@bdstravel fabric]# cat fabfile.py
#!/usr/bin/env python 

def hello():
        print("hello world")
[root@bdstravel fabric]# fab hello 
hello world

Done.
[root@bdstravel fabric]# 

如果不想以fabfile.py 命名文件的話 ,比如fuck.py 執(zhí)行的時候如下

[root@bdstravel fabric]# cat fuck.py
#!/usr/bin/env python 
def  fuck():
        print("hello world")
[root@bdstravel fabric]# fab -f fuck.py fuck 
hello world

Done.
@task  #如果定義了task,那么其他的任務(wù)也要定以,否則-l的時候任務(wù)不顯示,提示variable comment 
def mod():                 #本地任務(wù)函數(shù)
        with lcd('/tmp'):  #‘with’的作用是讓后面的表達式語句繼承當前狀態(tài)辕录,即實現(xiàn)‘cd('/tmp') && ls’ 的效果
                run('echo "budongshu" > bds.tmp') 
                run('ls')
[root@bdstravel fabric]# fab -f hostinfo.py mod
[127.0.0.1] Executing task 'mod'
[127.0.0.1] run: echo "budongshu" > bds.tmp
[127.0.0.1] run: ls
[127.0.0.1] out: anaconda-ks.cfg  deploy_git.sh        fabric       install.log.syslog  nohup.out
[127.0.0.1] out: bds.tmp                 dnspod_load_agent.sh  install.log  nginx-1.8.0.tar.gz  shadowsocks-libev
[127.0.0.1] out: 

Done.

fabric 的 簡單實用(二)

[root@bdstravel fabric]# cat hostinfo.py
#!/usr/bin/env python 

from fabric.api import * 
from fabric.colors import * 
import os 

env.user = 'root' 
env.hosts = ['127.0.0.1'] 
env.port = '22'
def hname():
        print('print hostname....') 
        local('hostname')
 
[root@bdstravel fabric]# fab -f hostinfo.py -l
Available commands:

    hname

[root@bdstravel fabric]# fab -f hostinfo.py hname
[127.0.0.1] Executing task 'hname'
print hostname....
[localhost] local: hostname
bdstravel

Done.

fabric 簡單實用進階

不想打印過程

[root@bdstravel fabric]# cat hostinfo.py
#!/usr/bin/env python 

from fabric.api import * 
from fabric.colors import * 
import os 

env.user = 'root' 
env.hosts = ['127.0.0.1'] 
env.port = '22'
def hname():
        print(red('print hostname....')) 
        with settings(hide('running'), warn_only=True):
                local('hostname')


[root@bdstravel fabric]# fab -f hostinfo.py hname
[127.0.0.1] Executing task 'hname'
print hostname....        #打印輸出的是紅色
bdstravel

Done.

對上一步操作做出判斷

[root@bdstravel fabric]# cat hostinfo.py
#!/usr/bin/env python 
#coding:utf-8
from fabric.api import * 
from fabric.colors import * 
import os 
env.user = 'root' 
env.hosts = ['127.0.0.1'] 
env.port = '22'
def hname():
        print(red('print hostname....')) 
        with settings(hide('running'), warn_only=True):
                res = local('hostname')
                if res.return_code == 0: 
                        print (red('-'*30)) 
                        print (green('打印成功')) 
                        print (red('-'*30))
                else: 
                        print (blue('#'* 30 )) 
                        print (red('打印失敗')) 
                        print (blue('#'* 30 ))
[root@bdstravel fabric]# vim hostinfo.py          
[root@bdstravel fabric]# fab -f hostinfo.py  hname
[127.0.0.1] Executing task 'hname'
print hostname....
bdstravel
------------------------------
打印成功
------------------------------

Done

res = local('hostname') 修改為 res = local(red('hostname')) 就是為了讓他報出一個錯誤

[root@bdstravel fabric]# fab -f hostinfo.py  hname
[127.0.0.1] Executing task 'hname'
print hostname....
/bin/sh: hostname: command not found

Warning: local() encountered an error (return code 127) while executing 'hostname'

##############################
打印失敗
##############################

Done.

fabric部署lnmp

#!/usr/bin/env python 
#coding:utf-8

from fabric.colors import *
from fabric.api import *
"""
自動化部署lnmp環(huán)境 
"""
env.roledefs = {
        'web':['128.199.177.154']
        'db':['127.0.0.1']
}
env.passwords = {
        'root@128.199.177.154:22':'centos',
        'root@127.0.0.1:22':'centos'
}
@roles('web')
def webtask():                                  #部署nginx php php-fpm等環(huán)境
        print('install nginx php php-fpm...')
        with settings(warn_only=True):
                run('yum install nginx -y')
                run('yum install php-fpm php-mysql php-mbstring php-xml php-mcrypt php-gd -y')
                run('chkconfig --levels 35 php-fpm on')
                run('chkconfig --levels 35 nginx on')
@roles('db')
def dbtask():                                   #部署mysql環(huán)境
        print(yellow('install mysql...'))
        with settings(warn_only=True):
                run('yum install mysql-server -y')
                run('chkconfig --levels 35 on')
@roles('web','db')
def default_task():
        print(yellow('install epel ntp ...'))
        with settings(warn_only=True):
                run('wget -P   /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/Centos-6.repo')
                run('yum install ntp')
def deploy():                                     #部署入口
        execute(default_task)
        execute(webtask)
        execute(dbtask)
最后編輯于
?著作權(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é)果婚禮上,老公的妹妹穿的比我還像新娘月帝。我一直安慰自己躏惋,他們只是感情好,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布嚷辅。 她就那樣靜靜地躺著簿姨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扁位,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天准潭,我揣著相機與錄音,去河邊找鬼域仇。 笑死刑然,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的殉簸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼沽讹,長吁一口氣:“原來是場噩夢啊……” “哼般卑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起爽雄,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蝠检,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后挚瘟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叹谁,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年乘盖,在試婚紗的時候發(fā)現(xiàn)自己被綠了焰檩。 大學時的朋友給我發(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
  • 正文 我出身青樓谎亩,卻偏偏與公主長得像炒嘲,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子匈庭,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

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

  • 更多Fabric的介紹和使用教程夫凸,可以訪問 官方教程地址 一. Hello, Fabric首先用vim fabfi...
    TyiMan閱讀 7,199評論 2 11
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)阱持,斷路器夭拌,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • fabric學習和實驗 安裝package:virtualenv [root@BIGDATA1 pip-9.0.1...
    jianwbj閱讀 800評論 0 0
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數(shù)據(jù)革命閱讀 12,163評論 2 33
  • 感情有時候來得很簡單,比如一句話衷咽,一條短信鸽扁,或是一次偶然的聊天。只是你自己不知道镶骗,然后日久生情桶现,隨著時間推移,可能...
    安痞兒閱讀 189評論 0 1