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连接。