Python's Fabric umożliwia wywoływanie funkcji fabric poza narzędziem fab
przy użyciu funkcji execute
. Problem kontekstowy powstaje, gdy funkcja execute
jest wywoływana w ramach innej funkcji, która została wywołana za pomocą execute. Tkanina traci kontekst zewnętrznego wykonania, gdy wewnętrzne wywołanie jest wywoływane i nigdy go nie odzyskuje. NpWykonywanie zagnieżdżonych wywołań do "wykonania" za pomocą biblioteki Python 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)
Po pierwsze wywołanie execute
, tkanina traci swą kontekstu i realizuje wszelkie dalsze polecenia w ramach funkcji deploy_code
z host_string='lb1'
zamiast 'web1'
. Jak mogę to zapamiętać?
wymyśliłem ten siekać, ale czuję się jak to mogło złamać na przyszłych wydaniach:
with settings(**env):
execute(remove_webserver_from_load_balancer, sHost=env.host_string)
To skutecznie zapisuje wszystkie państwa i przywraca je po zakończeniu rozmowy, ale wydaje się niewłaściwe używanie z funkcjonować. Czy istnieje lepszy sposób, aby powiedzieć Fabricowi, że jest on w zagnieżdżonym wykonaniu i użyć stosu ustawień lub równoważnej metody do zapamiętania stanu?
Dzięki!
btw, używam Fabric 1.3.4 – adowds
Dlaczego używasz 'execute()' wewnątrz zadań, zamiast tylko wywoływać funkcje bezpośrednio? – jfs
@JFSebastian Myślę, że [dokumentacja] (http://docs.fabfile.org/en/1.3.3/usage/execution.html#execute) odpowiada na twoje pytanie: "Projekt Fabric unika magicznych zachowań, więc po prostu wywołując funkcja zadania nie uwzględnia dekoratorów, takich jak role ". – jcollado