標籤: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