2012-01-19 13 views
9

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!

+0

btw, używam Fabric 1.3.4 – adowds

+0

Dlaczego używasz 'execute()' wewnątrz zadań, zamiast tylko wywoływać funkcje bezpośrednio? – jfs

+1

@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

Odpowiedz

1

Nie używasz tkaniny w prawo. Jak byś nazwał: fab deploy_code zamiast uruchamiać plik fabfowy taki jak python. Proponuję przejść przez samouczek, aby uzyskać lepszy pomysł na strukturę pliku fabfile.

W każdym razie, możesz look here, jak używać execute() i here, aby uzyskać więcej szczegółów.

Masz literówkę, że upuściłeś 's' z roli serwera. Co może oznaczać, że nie masz dobrego ciągu hosta, kiedy chcesz go wykonać w drugim zadaniu.

Ale oprócz tego możesz także ustawić role i hosty w samym poleceniu execute().

Powiązane problemy