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

1.簡介

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

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

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

2.安裝

建立.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

三、使用

3.1 執行無參python函數

編寫fabfile.py以下:bash

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以下:app

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

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

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 = {
    "user@10.1.1.1:22":"password"
}

@hosts("user@10.1.1.1:22")
def hello():
    run("ls -l ~")

咱們能夠經過設置env.passwords來避免在運行過程當中輸密碼,注意ip後面須要加端口號,示例中的22是ssh的端口號。

3.5 在內網機器執行命令

有時候咱們須要經過一臺中起色器才能登陸內網機器,這種狀況須要設置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 ~")

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

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: 設置命令執行前綴
相關文章
相關標籤/搜索