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: 设置命令执行前缀