?Fabric 是一個 Python 的庫,同時它也是一個命令行工具。它提供了豐富的同 SSH 交互的接口,可以用來在本地或遠程機器上自動化、流水化地執行 Shell 命令。使用 fabric 提供的命令行工具,可以很方便地執行應用部署和系統管理等操作。因此它非常適合用來做應用的遠程部署及系統維護。其上手也極其簡單,你需要的只是懂得基本的 Shell 命令。
fabric 依賴于 paramiko 進行 ssh 交互,fabric 的設計思路是通過幾個 API 接口來完成所有的部署,因此 fabric 對系統管理操作進行了簡單的封裝,比如執行命令,上傳文件,并行操作和異常處理等。
paramiko 是一個用于做遠程控制的模塊,使用該模塊可以對遠程服務器進行命令或文件操作,fabric 和 ansible 內部的遠程管理就是使用的 paramiko 來現實。
fabric 簡介 和 各個版本差異比較:http://www.mamicode.com/info-detail-2337088.html
1、Python 官網發布的地址
Fabric1:https://pypi.org/project/Fabric/
Fabric2:https://pypi.org/project/fabric2/
Fabric3:https://pypi.org/project/Fabric3/
2、區別
1). Fabric1、Fabric和fabric2:Fabric 和 Fabric2 在 Pypi 中就是同一個東西,fabric2 只是 Fabric 的替代名稱,為了便于使用備用名稱進行安裝。Fabric2 和之前的 Fabric1 相比,完全重寫了,接口和功能都有很大改動,官網也不建議繼續用 Fabric1,建議升級到 Fabric2?!钚掳嬉苍缇椭С?Python 3.4+、Python2.7 了。
2). Fabric3:Fabric3 是非官網的,是之前使用 Fabric 時,沒有支持 Python3 的版本,有人fork 出來,加了 Python3 的支持,但現在應該已經不維護了。
3、總結
盡量使用最新的 Fabric2。
Fabric 在升級 2.x 之后,幾乎就是重寫了。很多以前的用法都變了,然后在 1.x 時代,本地和遠程都是用一套代碼處理,但是 2.x 的時候將 local 處理部分和遠程處理部分分別拆分為 fab 和 invoke了,拆分的理由可以參考 這里。
Linux
sudo pip3 install fabric
如果是windows系統, 假設你下載安裝的就是python3的軟件, 那么當你使用 pip install 的時候, 這個pip 就是3的版本. 所以不需要再多設置
pip install fabric -i "https://pypi.doubanio.com/simple/"
conn = fabric.Connection(host , user = 'root',port = 22, config = None, geteway = None, connect_kwargs={"password": "123456"})
Connection類屬性
def __init__( self, host, #主機ip user=None, #用戶名 port=None, #ssh端口,默認是22 config=None, #登錄配置文件 gateway=None, #連接網關 forward_agent=None, #是否開啟agent forwarding connect_timeout=None, #設置超時 connect_kwargs=None, #設置 密碼登錄connect_kwargs={"password": "123456"}) 還是 密鑰登錄connect_kwargs={"key_filename": "/home/myuser/.ssh/private.key"} inline_ssh_env=None, )
Conection類方法:
cnn獲取Connetction對象后,有很多屬性方法可以使用,介紹下幾個常用的:
run: #執行遠程命令,如:run('uname -a')cd: #切換遠程目錄,如:cd('/root'); with conn.cd('/root'):繼承這個狀態put: #上傳本地文件到遠程主機,如:put('/root/test.py','/root/test.py')get: #獲取服務器上文件,如:get('/root/project/test.log')sudo: #sudo方式執行遠程命令,如:sudo('service docker start')
對多臺機器使用時,Connection
import fabricdef get_hostname(): for host in ['192.168.2.250', '192.168.2.224', '192.168.2.219']: conn = fabric.Connection(host, user='root', connect_kwargs={"password": "123456"}) print("%s:" % host) conn.run("hostname")get_hostname()
連接多個服務器,組成一個group,一個group同時執行run命令時,會返回一個 GroupResult-dict,包含了每個服務器的運行結果。
from fabric2 import SerialGroupclass fra_utils: def get_Ip_BySC(self, *host): pool = SerialGroup(*host, connect_kwargs={'password': '123456'}) pool.run('cd /opt && touch fabric2.txt')if __name__ == '__main__': hosts = ('root@192.168.2.250', 'root@192.168.2.224') results=fra_utils().get_Ip_BySC(*hosts) for connection, result in results.items():print("{0.host}: {1.stdout}".format(connection, result))
import invoke invoke.run('ls')
pip install fabric3
fab 是 fabric 程序的命令行入口,在命令行使用!!!
,語法:
fab [options] <command>[arg1,arg2:val2,host=foo]
fab 命令的執行,默認依賴一個 fabfile.py 的文件
,可以對該文件進行編輯,也可以執行其他的文件,用 -f 參數指定文件即可
可以使用 fab -help 查看具體參數:
-l, 顯示定義好的任務函數名-f, 指定 fab 入口文件,默認 fabfile.py-g, 指定網關設備,比如堡壘機環境,填寫堡壘機 ip 即可-H, 指定目標主機,多臺用逗號隔開-P 以異步并行方式運行多主機任務,默認串行運行-R, 指定 role,以角色名區分不同業務組設備-t 設置設備連接超時時間-T 設置遠程主機命令執行超時時間-w 當命令失敗的時候,發出警告,而不是終止任務-p 指定密碼
fabric 執行本地命令和遠程命令,必須先導入 fabric 對應的 api 接口。
from fabric.api import *env.hosts = 'localhost'def hello(): local('echo hello world')def check(): local('ls /Users/')def remote(): run('ping www.baidu.com')
導入 env 變量
from fabric.api import envenv.hosts, 定義目標主機,多個主機用列表的形式體現env.exclude_hosts, 排除指定的主機,env.exclude_hosts=['192.168.184.2']env.user, 定義用戶名env.port, 定義目標主機端口env.password, 定義密碼env.passwords, 與 password 功能一樣,需要指定主機。env.passwords = {'user1@host':'password','user2@host':'password'}env.gateway, 定義網關(中轉、堡壘機)IPenv.roledefs, 定義角色分組。env.roledefs = {'webserver':['host1','host2'], 'dbserver':['db1','db2']}env.deploy_release_dir 自定義全局變量,env.deploy_release_dir, env.age, env.sex 等等
fab 依賴的 fabric.py 文件中創建函數。import fabric.apidef hello(): fabric.api.local('echo hello world')def check(): fabric.api.local('ls /Users/')def remote(cmd): fabric.api.run(cmd)
在命令行執行命令的時候,使用 fab + fun函數即可。
$ fab hello$ fab check
此時執行remote任務時,就要傳入參數值:
$ fab remote:cmd='ifconfig'
from fabric.api import *env.user = 'root'env.hosts = ['192.168.184.2', '192.168.184.22']env.password = 'yourpassword'env.passwords = { 'staging': '11111', 'build': '123456'}env.roledefs = { 'webserver': ['bjhee@example1.com','bjhee@example2.com'], 'dbserver': ['build@example3.com']}@roles('webserver')def remote_task(): with cd('/data/logs'): # with 的左右是讓后面的表達式,繼承前面的狀態 run('ls -l') # 實現 'cd /data/logs/ && ls -l' 的效果@roles('dbserver')def remote_build(): with cd('/tmp/citizen_wang'): run('git pull')def remote_deploy(): run('tar zxvf /tmp/fabric.tar.gz') run('mv /tmp/fabric/setup.py /home/www/')def task(): execute(remote_build) execute(remote_deploy)
如果不使用execute這個函數去執行remote_build,則remote_build只能用 【 fab -f fabric.py remote_build】的方式執行。用了execute后就可以用'python3 fabric.py'的方式執行了
命令行調用:
$ fab task$ fab remote_build
如果某一任務上沒有指定某個角色,但是你又想讓這個角色的服務器也能運行該任務,你可以通過”-R”來指定角色名,多個角色用逗號分隔
$ fab -R webserver remote_deploy
1. sudo: 以超級用戶權限執行遠程命令
功能類似于”run()”方法,區別是它相當于在Shell命令前加上了”sudo”,所以擁有超級用戶的權限。使用此功能前,你需要將你的用戶設為sudoer,而且無需輸密碼。
from fabric.api import *env.hosts = ['192.168.201.169']env.password = '123456'env.user = 'root'@taskdef hello(): sudo('hostname')if __name__ == '__main__': execute(hello)
它的工作原理是基于scp命令,使用的方法如下:
@taskdef get_file(): get('/opt/sun.txt', 'sun1.txt')
3.put(local, remote): 從本地上傳文件到遠程機器上
同get一樣,put方法也是基于scp命令,使用的方法如下:
@taskdef put_file(): put('sun1.txt', '/root')
該方法類似于Shell中的”read”命令,它會在終端顯示一段文字來提示用戶輸入,并將用戶的輸入保存在變量里:
@taskdef download_file(): filename = prompt('請輸入文件名:') get('/opt/sun.txt', '%s.log' % filename)
現在下載后的文件名將由用戶的輸入來決定。我們還可以對用戶輸入給出默認值及類型檢查:
port = prompt('Please input port number: ', default=8080, validate=int)
執行任務后,終端會顯示:
Please input port number: [8080]
如果你直接按回車,則port變量即為默認值8080;如果你輸入字符串,終端會提醒你類型驗證失敗,讓你重新輸入,直到正確為止
5. reboot: 重啟服務器
看方法名就猜到了,有時候安裝好環境后,需要重啟服務器,這時就要用到”reboot()”方法,你可以用”wait”參數來控制其等待多少秒后重啟,沒有此參數則代表立即重啟:
@taskdef reboot_server(): reboot(wait=60)
Fabric的上下文管理器是一系列與Python的”with”語句配合使用的方法,它可以在”with”語句塊內設置當前工作環境的上下文。讓我們介紹幾個常用的:
1. cd: 設置遠程機器的當前工作目錄
“cd()”方法在之前的范例中出現過,”with cd()”語句塊可以用來設置遠程機的工作目錄:
from fabric.api import env, cd, put env.hosts = ['bjhee@example1.com', ]env.password = '111111' def hello(): with cd('/var/www/'): put('/tmp/myapp-0301.tar.gz', 'myapp.tar.gz')
上例中的文件會上傳到遠程機的”/var/www/”目錄下。出了”with cd()”語句塊后,工作目錄就回到初始的狀態,也就是”bjhee”用戶的根目錄
2. lcd: 設置本地工作目錄
“lcd()”就是”local cd”的意思,用法同”cd()”一樣,區別是它設置的是本地的工作目錄:
from fabric.api import env, cd, lcd, put env.hosts = ['bjhee@example1.com', ]env.password = '111111' def hello(): with cd('/var/www/'): with lcd('/tmp/'): put('myapp-0301.tar.gz', 'myapp.tar.gz')
這個例子的執行效果跟上個例子一樣。
3. path: 添加遠程機的PATH路徑
from fabric.api import env, run, path env.hosts = ['bjhee@example1.com', ]env.password = '111111' def hello(): with path('/home/bjhee/tmp'): run('echo $PATH') run('echo $PATH')
假設我們的PATH環境變量默認是”/sbin:/bin”,在上述”with path()”語句塊內PATH變量將變為”/sbin:/bin:/home/bjhee/tmp”。出了with語句塊后,PATH又回到原來的值。
2. settings: 設置Fabric環境變量參數
Fabric環境變量即是我們例子中一直出現的”fabric.api.env”,它支持的參數可以從官方文檔中查到。
from fabric.api import env, run, settings env.hosts = ['bjhee@example1.com', ]env.password = '111111' def hello(): with settings(warn_only=True): run('echo $USER')
我們將環境參數”warn_only”暫時設為True,這樣遇到錯誤時任務不會退出。
3. shell_env: 設置Shell環境變量
可以用來臨時設置遠程和本地機上Shell的環境變量。
from fabric.api import env, run, local, shell_env env.hosts = ['bjhee@example1.com', ]env.password = '111111' def hello(): with shell_env(JAVA_HOME='/opt/java'): run('echo $JAVA_HOME') local('echo $JAVA_HOME')
4. prefix: 設置命令執行前綴
from fabric.api import env, run, local, prefix env.hosts = ['bjhee@example1.com', ]env.password = '111111' def hello(): with prefix('echo Hi'): run('pwd') local('pwd')
在上述”with prefix()”語句塊內,所有的”run()”或”local()”方法的執行都會加上”echo Hi && “前綴,也就是效果等同于:
run('echo Hi && pwd')local('echo Hi && pwd')
配合后一節我們會講到的錯誤處理,它可以確保在”prefix()”方法上的命令執行成功后才會執行語句塊內的命令。
我們在介紹執行遠程命令時曾提到過多臺機器的任務默認情況下是串行執行的。Fabric支持并行任務,當服務器的任務之間沒有依賴時,并行可以有效的加快執行速度。怎么開啟并行執行呢?辦法也是兩個:
fab -P hello
? 2. 設置”env.parallel”環境參數為True
from fabric.api import env env.parallel = True
如果,我們只想對某一任務做并行的話,我們可以在任務函數上加上”@parallel”裝飾器:
from fabric.api import parallel @paralleldef runs_in_parallel(): pass def runs_serially(): pass
這樣即便并行未開啟,”runs_in_parallel()”任務也會并行執行。反過來,我們可以在任務函數上加上”@serial”裝飾器:
from fabric.api import serial def runs_in_parallel(): pass @serialdef runs_serially(): pass
這樣即便并行已經開啟,”runs_serially()”任務也會串行執行。
這個部分用來補充Fabric的一些特別功能:
我們習慣上認為綠色表示成功,黃色表示警告,而紅色表示錯誤,Fabric支持帶這些顏色的輸出來提示相應類型的信息:
from fabric.colors import * def hello(): print green("Successful") print yellow("Warning") print red("Error")
通過”execute()”方法,可以在一個”fab”命令中多次調用同一任務,如果想避免這個發生,就要在任務函數上加上”@runs_once”裝飾器。
from fabric.api import execute, runs_once @runs_oncedef hello(): print "Hello Fabric!" def test(): execute(hello) execute(hello)
現在不管我們”execute”多少次hello任務,都只會輸出一次”Hello Fabric!”字樣
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
select是什么牌子?Select是丹麥品牌。Selected是世界上最大的時裝集團之一。是凌志時尚著名的商務休閑男裝品牌。1997年在丹麥成立,2008年引入中國市場。Selected在全球25多個國家擁有自己的分店。select是哪個鍵急?打開游戲最上面一行,左邊第三個是“意見”第一個是“模擬設置”點擊彈出框頂部的“控制”“鍵盤”右欄下面有“選擇”,鍵盤上對應的鍵是“選擇”。所有的鑰匙都可以...
214暗示什么意思 214啥意思?214的含義? 214愛情的意思愛一生因為阿拉伯數字214普通話拼音諧音特別明顯是愛一世!也就是說,兩個情人要去一輩子,永遠相愛。!如果在2月14日西方情人節到來之際,能給情人一個214元的愛情紅包,那就代表著對情人的深深感情 214是什么意思? 214是什么意思?214(24)是23和25之間的自然數,是一個合數,素因數為2和3。是阿拉伯數字,雙數,合數...
霸王洗發膏怎么用?其實我也是最近才好好洗頭的??梢钥纯聪旅娴模赫_的洗發步驟:你總是覺得洗頭更容易嗎?每次洗完澡,順便把頭發弄濕,把洗發水抹在頭上,然后用水沖干凈。我相信這是大多數人的做法。但是,我必須很遺憾也很嚴肅地告訴你,你的洗頭工藝真的不對。正確的步驟應該是這樣的:洗頭前先梳頭。這樣可以讓你頭皮上的污垢和鱗片(也就是死細胞)松動,以便于下一步的清潔。第二步:3360打濕頭發,直到底層頭發和頂...