环境:
fabric 服务器:10.10.1.1
目标服务器组:test.com (10.10.1.2-21)一共 20 台服务器python
需求:api
我须要把我 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!"')
执行任务:ide
fab execute_rsync
输出是:函数
#### 省略抹除了一些信息 同步数据成功****** ------------------------- Done. real 0m1.263s user 0m0.793s sys 0m0.689s
若是没有使用并发的话,执行时间为:测试
------------------------- Done. real 0m3.680s user 0m0.664s sys 0m0.512s