Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从已执行任务中检索当前主机_Python_Fabric - Fatal编程技术网

Python 从已执行任务中检索当前主机

Python 从已执行任务中检索当前主机,python,fabric,Python,Fabric,我正在使用fabric在多台主机上通过以下设置执行一些远程命令: env.hosts = [host1, host2, ...] 有几个任务我想在某些主机上执行,有些我不想。 有什么方法可以检索执行任务的当前主机名吗 任何帮助都会很好。 谢谢 为什么不使用不同的主机角色 from fabric.api import env, roles, run env.roledefs['webservers'] = ['www1', 'www2', 'www3'] @roles('webservers

我正在使用fabric在多台主机上通过以下设置执行一些远程命令:

env.hosts = [host1, host2, ...]
有几个任务我想在某些主机上执行,有些我不想。 有什么方法可以检索执行任务的当前主机名吗

任何帮助都会很好。 谢谢
为什么不使用不同的主机角色

from fabric.api import env, roles, run

env.roledefs['webservers'] = ['www1', 'www2', 'www3']

@roles('webservers')
def my_task():
    run('ls -l')
此外,您还可以从
env
字典中获取当前正在执行的主机:

def my_task():
    print 'Currently executing on {0}'.format(env.host)

eclaird的回答无疑帮助我在多台具有不同角色的主机上执行任务时使用更好的做法。

不过,在使用它时,似乎在任务中,env.host会给出当前主机名的名称。
例如:

@parallel(pool_size=len(env.hosts))
def upload_to_s3(to):
    awscreds = 'some credentials...'
    cmd = '%s aws s3 sync /mnt/backup %s/%s/' % (awscreds, to, env.host)
    run(cmd)

这正是我想要的。谢谢不过有一个问题。如果我得到一个需要在这两组角色上运行的任务,那么我是否应该将env.hosts与所有服务器一起保存在其中,而不是添加装饰器?最后一件事。看来我有一个任务仍然需要知道它正在执行的当前主机。例如,我的一项任务将一些文件上载到AmazonS3。每个主机应将其名称附加到上载路径。欢迎提出任何建议。更新了我的答案以获取主持人的姓名。我自己也刚刚发现,但你是第一个来的:)