import pprint
from fabric.api import *
from fabric.colors import red, green
pp = pprint.PrettyPrinter(indent=4)
@task
def mytask():
with settings(hide('warnings', 'running', 'stdout', 'stderr','output'),):
cmd = 'sleep 1 && date'
myresult=run(cmd)
if myresult.failed: mystate='FAILED'
else: mystate='OK'
r={'output': str(myresult),
'state' : mystate
}
return(r)
@task
def runtask():
result=execute(mytask)
print env.host_string,
print result[env.host_string]['state']
print '-'*80
print 'DEBUG'
pp.pprint(result)
$ fab -H host-01,host-02,host-03,host-04 -P -z 2 runtask
[host-01] Executing task 'runtask'
[host-02] Executing task 'runtask'
[host-03] Executing task 'runtask'
[host-04] Executing task 'runtask'
[host-01] Executing task 'mytask'
[host-02] Executing task 'mytask'
[host-03] Executing task 'mytask'
[host-04] Executing task 'mytask'
[host-01] Executing task 'mytask'
[host-02] Executing task 'mytask'
[host-03] Executing task 'mytask'
[host-04] Executing task 'mytask'
host-03 OK
--------------------------------------------------------------------------------
DEBUG
{ 'host-01': { 'output': 'Fri Apr 5 11:48:59 PDT 2013',
'state': 'OK'},
'host-02': { 'output': 'Fri Apr 5 11:48:57 PDT 2013',
'state': 'OK'},
'host-03': { 'output': 'Fri Apr 5 11:48:53 PDT 2013',
'state': 'OK'},
'host-04': { 'output': 'Fri Apr 5 11:48:52 PDT 2013',
'state': 'OK'}}
host-04 OK
--------------------------------------------------------------------------------
DEBUG
{ 'host-01': { 'output': 'Fri Apr 5 11:49:00 PDT 2013',
'state': 'OK'},
'host-02': { 'output': 'Fri Apr 5 11:48:59 PDT 2013',
'state': 'OK'},
'host-03': { 'output': 'Fri Apr 5 11:48:53 PDT 2013',
'state': 'OK'},
'host-04': { 'output': 'Fri Apr 5 11:48:53 PDT 2013',
'state': 'OK'}}
[host-01] Executing task 'mytask'
[host-02] Executing task 'mytask'
[host-03] Executing task 'mytask'
[host-04] Executing task 'mytask'
[host-01] Executing task 'mytask'
[host-02] Executing task 'mytask'
[host-03] Executing task 'mytask'
[host-04] Executing task 'mytask'
host-02 OK
--------------------------------------------------------------------------------
DEBUG
{ 'host-01': { 'output': 'Fri Apr 5 11:49:18 PDT 2013',
'state': 'OK'},
'host-02': { 'output': 'Fri Apr 5 11:49:16 PDT 2013',
'state': 'OK'},
'host-03': { 'output': 'Fri Apr 5 11:49:09 PDT 2013',
'state': 'OK'},
'host-04': { 'output': 'Fri Apr 5 11:49:10 PDT 2013',
'state': 'OK'}}
host-01 OK
--------------------------------------------------------------------------------
DEBUG
{ 'host-01': { 'output': 'Fri Apr 5 11:49:18 PDT 2013',
'state': 'OK'},
'host-02': { 'output': 'Fri Apr 5 11:49:17 PDT 2013',
'state': 'OK'},
'host-03': { 'output': 'Fri Apr 5 11:49:10 PDT 2013',
'state': 'OK'},
'host-04': { 'output': 'Fri Apr 5 11:49:10 PDT 2013',
'state': 'OK'}}
Done.
I only want to execute mytask once per host. (but still keeping the parallel pool moving along..)