Fabric 是一個 Python (2.5-2.7) 的庫和命令行工具,用來提升基於 SSH 的應用部署和系統管理效率。
更具體地說,Fabric 是:python
天然而然地,大部分用戶把這兩件事結合着用,使用Fabric來寫和執行Python函數或task,以實現與遠程服務器的自動化交互。讓咱們一睹爲快吧。git
建立.pip目錄和配置文件:shell
cd ~ mkdir .pip cd .pip touch pip.conf
編輯文件pip.conf以下windows
[global] index-url=http://mirrors.zte.com.cn/pypi/simple [install] trusted-host=mirrors.zte.com.cn
安裝依賴包(若是是centos的,須要使用yum安裝)centos
sudo apt-get update sudo apt-get upgrade sudo apt-get install python-dev sudo apt-get install libffi-dev
用pip安裝fabricapi
sudo pip install fabric
編寫fabfile.py以下:bash
def hello(): print("hello world!") def helloEx(name): print("hello ", name, "!")
在fabfile文件所在目錄執行以下命令:服務器
wld@trusty:~/fabric$ fab hello hello world! Done.
編寫fabfile.py以下:app
def hello(name): print("hello "+name+" !")
在fabfile文件所在目錄執行以下命令:ssh
wld@trusty:~/fabric$ fab hello:name=wld hello wld! Done.
fabric.api包裏的local()方法能夠用來執行本地Shell命令:
from fabric.api import local def hello(): local('ls -l ~')
local()方法有一個」capture」參數用來捕獲標準輸出,好比:
def hello(): output = local('ls -l ~', capture=True)
這樣,Hello字樣不會輸出到屏幕上,而是保存在變量output裏。
Fabric真正強大之處不是在執行本地命令,而是能夠方便的執行遠程機器上的Shell命令。它經過SSH實現,你須要的是在腳本中配置遠程機器地址及登陸信息:
from fabric.api import * env.passwords = { "user@10.1.1.1:22":"password" } @hosts("user@10.1.1.1:22") def hello(): run("ls -l ~")
咱們能夠經過設置env.passwords來避免在運行過程當中輸密碼,注意ip後面須要加端口號,示例中的22是ssh的端口號。
有時候咱們須要經過一臺中起色器才能登陸內網機器,這種狀況須要設置env.gateway
from fabric.api import * env.gateway = "user@10.1.1.2:22" env.passwords = { "user@10.1.1.1:22":"password1" "user@123.1.1.1:22":"password2" } @hosts("user@123.1.1.1:22") def hello(): run("ls -l ~")
首先windows機器須要安裝ssh服務,注意ssh服務所用的帳戶須要設置可以運行exec的權限,不然沒法啓動windwos程序。
其次因爲fabric默認使用bash,所以須要設置變量env.shell="cmd /c",不然會報錯。
若是對於不一樣的服務器,咱們想執行不一樣的任務,咱們要對服務器定義角色:
from fabric.api import env, roles, run, execute, cd env.roledefs = { 'staging': ['bjhee@example1.com','bjhee@example2.com'], 'build': ['build@example3.com'] } env.passwords = { 'staging': '11111', 'build': '123456' } @roles('build') def build(): with cd('/home/build/myapp/'): run('git pull') run('python setup.py') @roles('staging') def deploy(): run('tar xfz /tmp/myapp.tar.gz') run('cp /tmp/myapp /home/bjhee/www/') def task(): execute(build) execute(deploy)
如今讓咱們執行fab task,這時Fabric會先在一臺build服務器上執行build任務,而後在兩臺staging服務器上分別執行deploy任務。」@roles」裝飾器指定了它所裝飾的任務會被哪一個角色的服務器執行。