自動化運維工具fabric的簡明使用手冊

1.簡介

Fabric 是一個 Python (2.5-2.7) 的庫和命令行工具,用來提高基於 SSH 的應用部署和系統管理效率。
更具體地說,Fabric 是:

  • 一個讓你通過命令行執行Python函數的工具;
  • 一個讓你通過SSH執行Shell命令更加容易、 更符合Python風格的命令庫。

自然而然地,大部分用戶把這兩件事結合着用,使用Fabric來寫和執行Python函數或task,以實現與遠程服務器的自動化交互。讓我們一睹爲快吧。

2.安裝

創建.pip目錄和配置文件:

cd ~
mkdir .pip
cd .pip
touch pip.conf

編輯文件pip.conf如下

[global]
index-url=http://mirrors.zte.com.cn/pypi/simple

[install]
trusted-host=mirrors.zte.com.cn

安裝依賴包(如果是centos的,需要使用yum安裝)

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install python-dev 
sudo apt-get install libffi-dev

用pip安裝fabric

sudo pip install fabric

3、使用

3.1 執行無參python函數

編寫fabfile.py如下:

def hello():
    print("hello world!")

def helloEx(name):
    print("hello ", name, "!")

在fabfile文件所在目錄執行如下命令:

wld@trusty:~/fabric$ fab hello
hello world!

Done.

3.2 執行有參python函數

編寫fabfile.py如下:

def hello(name):
    print("hello "+name+" !")

在fabfile文件所在目錄執行如下命令:

wld@trusty:~/fabric$ fab hello:name=wld
hello wld!

Done.

3.3 在本地機器執行命令

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裏。

3.4 在遠程機器執行命令

Fabric真正強大之處不是在執行本地命令,而是可以方便的執行遠程機器上的Shell命令。它通過SSH實現,你需要的是在腳本中配置遠程機器地址及登錄信息:

from fabric.api import *

env.passwords = {
    "[email protected]:22":"password"
}

@hosts("[email protected]:22")
def hello():
    run("ls -l ~")

我們可以通過設置env.passwords來避免在運行過程中輸密碼,注意ip後面需要加端口號,示例中的22是ssh的端口號。

3.5 在內網機器執行命令

有時候我們需要通過一臺中轉機器才能登錄內網機器,這種情況需要設置env.gateway

from fabric.api import *

env.gateway = "[email protected]:22"
env.passwords = {
    "[email protected]:22":"password1"
    "[email protected]:22":"password2"
}

@hosts("[email protected]:22")
def hello():
    run("ls -l ~") 

3.6 在windows服務器執行命令

首先windows機器需要安裝ssh服務,注意ssh服務所用的賬戶需要設置能夠運行exec的權限,否則無法啓動windwos程序。
其次由於fabric默認使用bash,因此需要設置變量env.shell="cmd /c",否則會報錯。

3.7 定義角色讓不同機器執行不同命令

如果對於不同的服務器,我們想執行不同的任務,我們要對服務器定義角色:

from fabric.api import env, roles, run, execute, cd

env.roledefs = {
    'staging': ['[email protected]','[email protected]'],
    'build': ['[email protected]']
}

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”裝飾器指定了它所裝飾的任務會被哪個角色的服務器執行。

3.8 SSH功能函數

  • sudo(cmd): 以超級用戶權限執行遠程命令。 sudo("mkdir /root/xx")
  • get(remote, local): 從遠程機器上下載文件到本地
  • put(local, remote): 從本地上傳文件到遠程機器上
  • prompt(提示字符串, default, validate): 提示輸入並返回用戶輸入值
  • reboot: 重啓服務器
  • cd(path): 設置遠程機器的當前工作目錄
  • lcd(path): 設置本地工作目錄
  • path: 添加遠程機的PATH路徑
  • settings: 設置Fabric環境變量參數
  • shell_env: 設置Shell環境變量
  • prefix: 設置命令執行前綴
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章