聊聊Fabric

一、我和Fabric

Fabric是我最喜欢的工具之一,从大三实习的时候就开始用,直到现在一直都是我的得力工具。
我可以用它做各种各样的事情:批量执行,部署环境,初始化机器,安装软件包,升级软件包,上线代码,重启服务等等。 我的Fabric工具包:

二、Fabric介绍

Fabric是一个用于应用部署和系统管理的工具,它让基于ssh的的操作更灵活;你可以在本地或者远程批量执行一些命令,上传下载文件等。

Fabric 的优点:

  • 封装了本地、远程操作,简单,不需要客户端
  • 参数灵活(动态指定 host/role 等,还有并发执行 基于multiprocessing )
  • 完整的日志输出

三、Fabric常用的配置:

env.host          -- 主机ip,当然也可以-H参数指定  
env.password      -- 密码  
env.roledefs      -- 角色分组,比如:'web': , , :

fab -l            -- 显示可用的task(命令)  
fab -H            -- 指定host,支持多host逗号分开  
fab -f            -- 指定入口文件,fab默认入口文件是:fabfile/fabfile.py  
更多请参考:fab --help

四、Fabric常用的函数:

local 'pwd'         -- 执行本地命令  
lcd   '/tmp'        -- 切换本地目录  
cd  '/tmp'          -- 切换远程目录  
run 'uname -a'      -- 执行远程命令  
get                 --下载远程文件  
put                 -- 上传文件  
sed                 -- 使用sed修改文件  
append              --增加内容到文件  

五、Fabric常用的参数:

  • H 指定主机
  • R 指定主机组
  • x 过滤不想要的机器
  • P 并发执行
$ fab mytask:hosts="host1;host2”
$ fab -H system1,system2,system3 mytask
$ fab -R myrole -x host2,host5 mytask          
$ fab mytask:roles=myrole,exclude_hosts="host2;host5"

六、Fabric示例:

sed,append 使用
def set_hostname(host_name):  
    """ Set the Hostname """
    sed("/etc/sysconfig/network", "^HOSTNAME=.*$", "HOSTNAME=%s" %(host_name,), use_sudo=True)
    run("sudo hostname %s"  %(host_name,),)
    append('/etc/hosts', "127.0.1.1   %s" % host_name, use_sudo=True)
升级python
def update_python():  
    """ Update Python2.6 to 2.7.3 """
    put('/home/wangzezhi/software/Python-2.7.3.tar.bz2', '/tmp')
    run('sudo yum groupinstall -y "Development tools"')
    run('sudo yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel')
    run('tar xf /tmp/Python-2.7.3.tar.bz2 -C /tmp')
    with cd('/tmp/Python-2.7.3'):
        run('sudo ./configure --prefix=/usr/local')
        run('sudo make && sudo make altinstall')
        run('sudo mv /usr/bin/python /usr/bin/python.bak')
        run('sudo ln -s  /usr/local/bin/python2.7 /usr/bin/python ')
        run("sudo sed -i.bak 's/python/python2.6/g' /usr/bin/yum ")
        run('python -V')
更改用户密码
def user_passwd(name, password):  
    """ passwd for the user  """
    run('echo -e "%s\\n%s" |sudo passwd %s' %(password,password, name))
设置java环境
def java_jdk():  
    run('sudo mkdir -p /usr/java')
    put('/home/wangzezhi/software/java/jdk-8u25-linux-x64.tar.gz', '/usr/java/', use_sudo=True )
    run('sudo tar zxf /usr/java/jdk-8u25-linux-x64.tar.gz -C /usr/java/')

def java_home():  
    append('/etc/profile', "export JAVA_HOME=/usr/java/jdk1.8.0_25", use_sudo=True)
    append('/etc/profile', "export PATH=$JAVA_HOME/bin:$PATH", use_sudo=True)

def java_v():  
    run('java -version')

def java_set():  
    java_jdk()
    java_home()
    java_v()