环境:
fabric 服务器:10.10.1.1
目标服务器组:test.com (10.10.1.2-21)一共 20 台服务器
需求:
我需要把我 fabric 服务器上的某些文件同步到 test.com 集群,但是我又需要并发执行,而不是通过 for 循环或者是串行的方式。
先直接上代码再针对性的解释:
#!/usr/bin/python env
#-*- coding: utf-8 -*-
from fabric.api import env
from fabric.api import run
from fabric.api import put
from fabric.api import execute
from fabric.api import roles
from fabric.api import parallel
from fabric.api import cd
from fabric.api import lcd
from fabric.api import task
from fabric.api import local
from fabric.api import settings
from fabric.api import hide
from fabric.colors import red ### 使输出有色彩
from fabric.colors import green
### 下面这个角色在我实际的使用中,我是不需要填写的,因为我实际使用是从 CMDB 动态获取集群的服务器列表的。为了测试,所以弄了下面的
env.user = 'test'
env.password = 'test'
env.roledefs = {
'test.com':['10.10.1.2','10.10.1.3','10.10.1.4','10.10.1.5',......],# 省略下,
}
######### reload data and rsync data###########
def rsync_test(host): ### 传入 host 主机 IP 参数
with settings(hide('running','stdout'), warn_only=True): ## hide 是表示不输入信息到 sreen,可以写 'everything','stderr','running' 等等
with lcd('/tmp/'):
result = local('rsync -Pav test "%s":/tmp/' % host) ### 根据不同的主机 rsync 到不同的主机服务器
if result.return_code == 0: ##可以根据上面数据是否成功执行下一步操作。
print (green("-------------------------"))
print (red("*******主机 %s 同步数据成功******" % host))
print (green("-------------------------"))
else:
print (green("-------------------------"))
print (red("*******主机 %s 同步数据失败******" % host))
print (green("-------------------------"))
@task
@roles('test.com')
@parallel(pool_size=16)
def execute_rsync():
execute(rsync_test, env.host) ### 读取 @roles('test.com') 里面的主机,并把 host 传递给 rsync_test 函数,并且 @parallel(pool_size=16) 来并发
@roles('test.com')
@parallel(pool_size=5)
def echo_hello():
run('echo "hello world!"')
执行任务:
fab execute_rsync
输出是:
#### 省略抹除了一些信息
同步数据成功******
-------------------------
Done.
real 0m1.263s
user 0m0.793s
sys 0m0.689s
如果没有使用并发的话,执行时间为:
-------------------------
Done.
real 0m3.680s
user 0m0.664s
sys 0m0.512s