Hi Rob, I've done this as a hack in the past by adding data to the host list and parsing it before execution to determine what to run. I've built a simple example to give you an idea:
@task
def hostname():
return run('hostname')
@task
def uname():
return run('uname -a')
@task
def task_chooser():
# only consider up to the first underscore to be host data
host, task = env.host_string.split('_', 1)
return execute(task, hosts=[host])[host]
@task
def parallel_runner():
host_list=[
'host1_hostname',
'host1_uname',
'host2_hostname',
'host2_uname'
]
with settings(parallel=True):
execute(task_chooser, hosts=host_list)
[host1_hostname] Executing task 'task_chooser'
[host1_uname] Executing task 'task_chooser'
[host2_hostname] Executing task 'task_chooser'
[host2_uname] Executing task 'task_chooser'
[host2] Executing task 'uname'
[host2] Executing task 'hostname'
[host1] Executing task 'uname'
[host2] run: uname -a
[host1] Executing task 'hostname'
[host2] run: hostname
[host1] run: uname -a
[host1] run: hostname
[host1] out: Linux host1 4.4.0-104-generic #127-Ubuntu SMP Mon Dec 11 12:16:42 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
[host1] out:
[host2] out: host2
[host2] out:
[host2] out: Linux host2 4.4.0-63-generic #84-Ubuntu SMP Wed Feb 1 17:20:32 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
[host2] out:
[host1] out: host1
[host1] out:
Done.