Python 将不同的参数传递给结构中的不同主机

Python 将不同的参数传递给结构中的不同主机,python,fabric,Python,Fabric,我正在编写一个脚本,以便在几个主机上启动负载生成实验。我可以编写一个bash脚本来启动多个ssh会话,但我希望使用更结构化的东西。因为我大部分脚本都使用Python,所以我认为这是一个不错的选择 唯一的问题是,我需要在每个命令中传递少量特定于主机的数据(实际上只是一个id或计数器),我希望并行运行它们 换句话说,我想做如下的事情,其中host_num对于每个主机都是不同的(可能只是递增的) @parallel def launch(): with cd('/working/dir'):

我正在编写一个脚本,以便在几个主机上启动负载生成实验。我可以编写一个bash脚本来启动多个ssh会话,但我希望使用更结构化的东西。因为我大部分脚本都使用Python,所以我认为这是一个不错的选择

唯一的问题是,我需要在每个命令中传递少量特定于主机的数据(实际上只是一个id或计数器),我希望并行运行它们

换句话说,我想做如下的事情,其中host_num对于每个主机都是不同的(可能只是递增的)

@parallel
def launch():
    with cd('/working/dir'):
        run("./start/script -id=%d", host_num)

这在织物上可能吗?如果没有,是否还有其他工具可以用来完成同样的任务?

如果您想了解任务中运行的主机,我建议引用env.host变量。每个任务都知道它的env状态,尽管并行时它们并不共享该状态,因为它们都作为fork运行。还有一个可供您使用。

您可以对照用户/主机进行检查。每个任务都知道它们当前运行的环境:

env.hosts = ['user@host1.com', 'user@host2.com']

@task
def test():
    print '%(user)s@%(host)s' % (env)

    if env.host == 'host1.com':
        id = 1
    elif ...

    run('echo "%s"' % (id))

请随意以更优雅的方式编写:)(一个建议是使用类似于id查找的case语句的词典)

谢谢。可惜没有更好的机制——如果您想在不同的主机集上运行同一个脚本,那么这种方法似乎效果不太好。这还会并行运行吗?我有同样的挑战,但我有20台主机,它们在运行时旋转(AWSEC2实例)。因此,我认为提前对
if-then
语句进行硬编码是行不通的。