天天看点

Fabric 批量安装ZeroMQ

Fabric是一个用Python开发的部署工具,最大特点是不用登录远程服务器,在本地运行远程命令,几行Python脚本就可以轻松部署。关于Fabric的安装可以直接参考官网的内容(Fabric 官网)

部署ZeroMQ,本就是一件麻烦的事情,所以写了一个脚本,用来实现多机统一部署

import sys, os, time

import fabric
from fabric.api import *

    
netifs = {}
now = time.strftime('%Y%m%d-%H%M%S', time.localtime(time.time()))


def host(str=''):
    if str == '-':
        list = _to_list(sys.stdin)
    else:
        list = str.split('\n')
    env.hosts = _to_hosts(list)
    env.passwords = _to_passwords(list)
    print env.passwords
    netifs = _to_netifs(list)
    print env.hosts



def _to_list(handle):
    list = []
    while True:
        line = handle.readline().strip()
        if line:
            list.append(line)
        else:
            return list


def _to_hosts(list):
    hosts = []
    for line in list:
        kvp = line.split('|')
        hosts.append(kvp[1])
    return hosts


def _to_passwords(list):
    passwords = {}
    for line in list:
        kvp = line.split('|')
        passwords[kvp[1]] = kvp[2]
    return passwords
        

def _to_netifs(list):
    passwords = {}
    for line in list:
        kvp = line.split('|')
        netifs[kvp[1]] = kvp[0]
    return netifs

def rsync_zmq():
    run('mkdir -p /data/soft')
    put("/data1/deploy1/deploy/bandwidth/zeromq/zeromq-2.2.0.tar.gz","/data/soft/zeromq-2.2.0.tar.gz")
def rsync_jzmq():
    run('mkdir -p /data/soft')
    put("/data1/deploy1/deploy/bandwidth/zeromq/jzmq-2.2.2.zip","/data/soft/jzmq-2.2.2.zip")

def yum_install(name):
    run('yum -y install ' + name )
    
def install_zmq():
    run('tar -zxvf /data/soft/zeromq-2.2.0.tar.gz -C /data/soft')
    with cd('/data/soft/zeromq-2.2.0'):
         run('./autogen.sh')
         run('./configure')
         run('make install')
    with cd('/data/soft/zeromq-2.2.0/perf'):
         run('./inproc_lat  100 20')

def install_jzmq():
    run('unzip -o -d /data/soft/ /data/soft/jzmq-2.2.2.zip')
    with cd('/data/soft/jzmq-2.2.2'):
         run('chmod +x autogen.sh')
         run('chmod +x configure')
         run('dos2unix *.sh')
         run('./autogen.sh')
         run('./configure -with-zeromq=/data/soft/zeromq-2.2.0')
         run('make install')
    run('echo -e "/usr/local/lib" >> /etc/ld.so.conf')
    run('sudo ldconfig')

def install_zmq_auto():
    rsync_zmq()
    rsync_jzmq()
    yun_install('libuuid-devel')
    install_zmq()
    install_jzmq()
           

执行方式:

echo "eth0|服务器ip|密码|描述信息" | fab -f deploy host:- rsync_soft

cat server.db |fab -f zeromq.py host:- install_zmq

上面的语句可以单独对一台机器执行相应的方法,也可以将服务器信息写入文件,统一执行

Fabric提供几个简单的API来完成所有的部署,最常用的是local()和run(),分别在本地和远程执行命令,put()可以把本地文件上传到远程,当需要在远程指定当前目录时,只需用with cd('/path/to/dir/'):即可。

默认情况下,当命令执行失败时,Fabric会停止执行后续命令。有时,我们允许忽略失败的命令继续执行,比如run('rm /tmp/abc')在文件不存在的时候有可能失败,这时可以用with settings(warn_only=True):执行命令,这样Fabric只会打出警告信息而不会中断执行。

Fabric是如何在远程执行命令的呢?其实Fabric所有操作都是基于SSH执行的,必要时它会提示输入口令,所以非常安全。更好的办法是在指定的部署服务器上用证书配置无密码的ssh连接。