1.支持中文

#!/usr/bin/python env
# -*- coding: utf-8 -*-

2.支持颜色

from fabric.colors import *
print(red("红色") + green("绿色",bold=False) + blue("蓝色",bold=True) + white("白色") + yellow("黄色") + cyan("蓝绿色") + magenta("品红色"))

3.设置主机组及账号密码

主机密码不同时:

env.hosts = ['tomcat@192.168.244.128','tomcat@192.168.244.129']
env.passwords = {'tomcat@192.168.244.128:22':'111111','tomcat@192.168.244.129:22':'111111'}

主机密码相同时:

env.hosts=[ 
'tomcat@192.168.244.128:22', 
'tomcat@192.168.244.129:22', 
] 
env.password = '1111'

使用ssh keyfile:

env.key_filename = ['/opt/fab/server_key']
env.user = 'tomcat'
env.password = '111111'
env.port = '2862'

4.运行shell命令

在本地运行命令:

local('pwd')
local('set -m ; /etc/init.d/tomcat restart') 如果是脚本,要加set -m 支持后台执行并返回状态,否则会报错

在服务器上运行命令:

run('uname -a')

5.切换目录执行

with cd('/opt/tomcat')
    run('set -m ;  ./bin/startup.sh')
with lcd('/opt/tomcat')
    run('pwd')

cd 是在远程服务器上执行,lcd是在本地执行

6.上传下载文件
从远端服务器下载:

get('/remote/path/','/local/path/')

上传文件到远端服务器:

 put('/local/path/','/remote/path')

这两种方式使用的是sftp协议

7.判断文件或目录是否存在

from fabric.contrib.files import exists
    if exists('/opt/tomcat/logs/catalina.out'):
        print 'catalina.out exist'    
    else:
        print 'catalina.out not exist'

8.判断远程主机的文件中是否存在文本

from fabric.contrib.files import contains
    if contains('/opt/tomcat/catalina.out','username1'):
        print "contains text"
    else:
        print "no contains"

9.以sudo权限运行

sudo('whoami',user='tomcat')

用户须在/etc/sudoers里配置sudo权限

10.命令嵌套

with prefix('cd /opt/fab'):
    run('pwd')
    with prefix('cd fabfiles'):
        run('pwd')
        run('ls')

上面的代码等同于:

    cd /opt/fab && pwd
    cd /var/fab && cd fabfiles && pwd && ls

11.从键盘接收输入

使用python的函数, 接收一行:

text = raw_input() 
print text

接收一段:

import sys
update_log = sys.stdin.read()
print update_log

12.只运行一次函数

@runs_once
def local_file_backup
    print ‘我只运行一次’

fabric执行时都会在每台主机上执行所有函数,如果有函数只需执行一次,可以用这个参数

13.用roles定义分组

env.roledefs = {
    'ftp': ['192.168.1.100'],
    'web': ['192.168.1.101', '192.168.1.102', '192.168.1.103'],
}

定义分组的好处是可以指定某一分组主机,执行某一任务
例如:从ftp主机下载代码,传到web上

@runs_once
@roles('ftp')
def download():
    print 'donwload files'

@roles('web')
    put('local/files','remote/files')

14.使用rsync传输
put/get/project.upload_project 都是使用sftp方式,比较慢,fabric提供了rsync方式

from fabric.contrib import project, console
def syncfile():
    project.rsync_project(
        remote_dir=online_dir,
        local_dir=/tmp/upload/,
        default_opts='-avczp',
                    delete=True
    )

15.任务增加说明
用def一个函数后,在fab -f fabfile.py -l中只能看到函数名,没有说明,例如上面的rsync例子的结果:

root@localhost tmp]# fab -f rsync.py -l
Available commands:
syncfile

添加函数说明可以在def下用三个引号来写说明。格式:

def rsyncfile():
    """使用rsync同步文件"""

在执行一下:

root@localhost tmp]# fab -f rsync.py -l
Available commands:
syncfile 使用rsync同步文件

参考文章:

http://forlinux.blog.51cto.com/8001278/1415401
http://blog.csdn.net/sijiazhaiyuan/article/details/23884873