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它在嵌套执行中并使用设置堆栈或等效方法来记住状态?
谢谢!