使用Python的Fabric库进行嵌套调用“execute”

时间:2012-01-19 03:11:33

标签: python fabric

Python的Fabric提供了使用fab函数调用execute实用程序之外的结构函数的功能。当在使用execute调用的另一个函数中调用execute函数时,会出现上下文问题。当调用内部执行时,Fabric丢失外部执行的上下文,并且永远不会恢复它。例如:

env.roledefs = {
    'webservers': ['web1','web2'],
    'load_balancer': ['lb1']
}

@roles('webserver')
def deploy_code():
    #ship over tar.gz of code to unpack.
    ...
    execute(remove_webserver_from_load_balancer, sHost=env.host_string)
    ...
    #shutdown webserver, unpack files, and restart web server
    ...
    execute(add_webserver_to_load_balancer, sHost=env.host_string)

@roles('load_balancer')
def remove_webserver_from_load_balancer(sHost=None):
   ssh("remove_host %s" % sHost)

execute(deploy_code)

第一次调用execute后,Fabric完全丢失其上下文,并使用deploy_code而不是host_string='lb1'执行'web1'函数中的所有其他命令。 我怎样才能记住它?

我提出了这个黑客攻击,但我觉得它可能会在将来的版本中破解:

 with settings(**env):
     execute(remove_webserver_from_load_balancer, sHost=env.host_string)

这有效地保存了所有状态并在调用后恢复它,但似乎是无意中使用了该函数。有没有更好的方法告诉Fabric它在嵌套执行中并使用设置堆栈或等效方法来记住状态?

谢谢!

1 个答案:

答案 0 :(得分:1)

你没有正确使用面料。因为你只需要调用fab deploy_code而不是运行fabfile就像它的python一样。我建议您阅读本教程,以便更好地了解如何构建fabfile。

但无论如何,您可以look here了解如何使用execute()here了解更多细节。

你有一个错字,因为你已经从网络服务器角色中删除了's'。当你想要它在第二个任务上时,这可能会导致你没有一个好的主机字符串。

但除此之外,您还可以在execute()命令中设置角色和主机。