Python 模組之fabric

來源:互聯網
上載者:User

標籤:python   fabric   

Fabric是一個Python庫和命令列工具,旨在為應用部署和系統管理任務的SSH的流水線式操作,使之更加高效和方便。Fabric提供了一套基本的執行本地和遠程shell命令、上傳和下載檔案的操作,包括一些輔助函數,例如驅動正在啟動並執行使用者輸入或者放棄執行。

Fabric通過把大量頻繁使用的SSH操作寫入到一個指令碼中(fabric.py),來遠程執行一些應用部署或者系統維護的任務。Fabric是類似paramiko的一個庫,是對paramiko的再次封裝,所以比使用paramiko更簡單。


Fabric的優點:


角色定義

代碼易讀

封裝了本地、遠程操作

參數靈活,能偶動態指定host/role等,還有並發執行(基於multiprocessing)

完整的日誌輸出


在Linux下安裝方法:

使用pip來安裝 

yum install python-pip -ypip install fabric


Fabric通過命令列工具fab來執行定義在fabfile.py中的任務,常用的配置和函數如下:

常用的fab命令選項和參數:

-l    顯示可用的task

-H    指定host,多個host用逗號分開

-R    指定role,多個role用逗號分開

-P    並分數,預設是串列

-w    warn_only,預設為遇到異常直接放棄執行並退出

-f    指定入口檔案,fab預設入口檔案是:fabfile.py


fabfile.py檔案中常用配置和函數:


env.host        主機ip,也可以使用fab選項-H參數來指定

env.password    SSH密碼,若已經設定好無密碼登入,則可以忽略

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

local(‘pwd‘)    執行本地命令

lcd(‘/tmp‘)        切換本地目錄

cd(‘/tmp‘)        切換遠程目錄

run(‘uname -s‘)        執行遠程命令

sudo(‘service httpd restart‘)    執行遠程sudo,注意pty選項

env.exclude_hosts=[‘10.1.6.159‘] 排除10.1.6.159 

fabric.operations.open_shell() 開啟遠程shell介面。

get 是下載

put 是上傳


下面來一些例子:

#/usr/bin/python#coding:utf8from fabric.api import *from fabric.colors import *from fabric.context_managers import * env.hosts=[‘10.1.6.186‘,‘10.1.6.159‘]env.password=‘xxxxxx‘ def task1():    with cd(‘/home/guol‘):        run(‘ls -l‘)

不同的機器執行不同的task:

#!/usr/bin/pythonfrom fabric.api import *from fabric.colors import *from fabric.context_managers import * env.roledefs={‘web1‘:[‘10.1.6.186‘],‘web2‘:[‘10.1.6.159‘]}env.password=‘xxxxxx‘  ##需要配置密碼相同,,,, @roles(‘web1‘)def task1():    with cd(‘/home/guol‘):        run(‘ls -l‘)@roles(‘web2‘)def task2():    print(green("I‘m fabric")) def deploy():    execute(task1)    execute(task2)執行結果:[email protected]:/tmp# fab deploy[10.1.6.186] Executing task ‘task1‘[10.1.6.186] run: ls -l[10.1.6.186] out: total 0[10.1.6.186] out: -rw-r--r-- 1 root root 0 Dec 21 13:32 186-local[10.1.6.186] out:  [10.1.6.159] Executing task ‘task2‘I‘m fabric Done.Disconnecting from 10.1.6.186... done.


farbic的環境變數:

fabric的環境變數有很多,存放在一個字典中,

fabric.state.env,而它包含在fabric.api中。

為了方便,我們一般使用env來指代環境變數。

env環境變數可以控制很多fabric的行為,一般通過env.xxx可以進行設定。

 

fabric預設使用本機使用者通過ssh進行串連遠程機器,不過你可以通過env.user變數進行覆蓋。

當你進行ssh串連時,fabric會讓你互動的讓你輸入遠程機器密碼,如果你設定了env.password變數,則就不需要互動的輸入密碼。

下面介紹一些常用的環境變數:

abort_on_prompts    設定是否運行在互動模式下,例如會提示輸入密碼之類,預設是false

connection_attempts    fabric嘗試串連到新伺服器的次數,預設1次

cwd    目前的工作目錄,一般用來確定cd命令的上下文環境

disable_known_hosts    預設是false,如果是true,則會跳過使用者知道的hosts檔案

exclude_hosts    指定一個主機列表,在fab執行時,忽略列表中的機器

fabfile    預設值是fabfile.py在fab命令執行時,會自動搜尋這個檔案執行。

host_string    當fabric串連遠程機器執行run、put時,設定的user/host/port等

hosts    一個全域的host列表

keepalive    預設0 設定ssh的keepalive

loacl_user    一個唯讀變數,包含了本地的系統使用者,同user變數一樣,但是user可以修改

parallel    預設false,如果是true則會並行的執行所有的task

pool_size    預設0 在使用parallel執行任務時設定的進程數

password    ssh遠端連線時使用的密碼,也可以是在使用sudo時使用的密碼

passwords    一個字典,可以為每一台機器設定一個密碼,key是ip,value是密碼

path    在使用run/sudo/local執行命令時設定的$PATH環境變數

port    設定主機的連接埠

roledefs    一個字典,設定主機名稱到規則群組的映射

roles    一個全域的role列表

shell    預設是/bin/bash -1 -c 在執行run命令時,預設的shell環境

skip_bad_hosts    預設false,為ture時,會導致fab跳過無法串連的主機

sudo_prefix    預設值"sudo -S -p ‘%(sudo_prompt)s‘ " % env 執行sudo命令時調用的sudo環境

sudo_prompt    預設值"sudo password:"

timeout    預設10 網路連接的逾時時間

user   ssh使用哪個使用者登入遠程主機


設定主機列表的方法:


hosts,在上下文環境中我們稱hosts為"host strings"

strings指定了username、hostname、port等 

組合[email protected]:port。username和port可以省略,則預設使用本機使用者和22連接埠。

 

strings映射單個主機,但是有時候你想把一批主機加入一個組中

roles則提供了一個定義一系列主機的方法,這個映射可以通過env.rolesdefs來設定

它必須通過fabfile進行設定才可以使用。env.roledefs[‘webservers‘] = [‘www1‘, ‘www2‘, ‘www3‘]


fabric 中傳參數的類型,下面是一個例子:

#!/usr/bin/pythonfrom fabric.api import *import fabric.operationsfrom fabric.colors import *from fabric.context_managers import *import datetime env.passwords = {‘[email protected]:22‘:‘redhat123456‘,‘[email protected]:22‘:‘redhat‘} @hosts(‘[email protected]:22‘)def task1():    filename = run(‘ls /root/my/‘) #查看遠程目錄上的檔案(此例子中這個目錄下只有一個a.txt) 把這個檔案名稱傳到task2上中去    get(‘/root/my/*‘,‘/root/my‘) #下載到本地的/root/my目錄下    local(‘fab task2:name=%s‘ % filename) #執行本地命令,並傳遞filename這個參數給task2@hosts(‘[email protected]:22‘)def task2(name=‘‘): #定義帶參數的函數    put(‘/root/my/%s‘ % name, ‘/root/my‘) #把本地的/root/my/a.txt上傳到192.168.1.2的/root/my目錄下  ####運行:fab task1單獨運行task2的命令:fab task2:name=‘a.txt‘


最後再來一個例子:

#!/usr/bin/env python# -*- coding:utf-8 -*- from fabric.api import env,run,local,hosts,put,puts, cdimport fabric.operationsfrom fabric.colors import *import datetime  # env.hosts =  []#下面定義三個主機env.passwords = {‘[email protected]:22‘:‘password‘,                 ‘[email protected]:22‘:‘password‘,                 ‘[email protected]:22‘:‘password‘} @hosts(‘[email protected]:22‘)def uploadmusic():    put(‘./data/*.mp3‘,‘/var/www/html/music/‘) #把本地/data/目錄下的mp3檔案上傳到192.168.10.91 @hosts(‘[email protected]:22‘)def rsyncmusic():    with cd("/usr/local/tomcat/webapps/"):  #遠程執行cd 命令,,下面是run執行的命令        run(‘pwd‘)        run(‘ls /root/‘)        bak_webapi = ‘tar -zcf webapi_%s.tar.gz webapi‘ % datetime.datetime.now().strftime("%Y%m%d%H%M")        run(bak_webapi)        put("./data/*.txt","webapi/WEB-INF/classes/data/")        run("rm -rf webapi/WEB-INF/classes/data/index")        run("echo ‘‘>/usr/local/tomcat/webapps/webapi/WEB-INF/classes/data/a.txt")        #fabric.operations.open_shell("python /root/zhou.py") @hosts(‘[email protected]119.1:22‘)def shellhost():    fabric.operations.open_shell() #遠程到119.1上,並開啟shell




本文出自 “linux學習” 部落格,請務必保留此出處http://zhou123.blog.51cto.com/4355617/1670055

Python 模組之fabric

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.