2012-01-19 5 views
9

Python's Fabric offre la possibilità di richiamare funzioni fabric esterne all'utility fab utilizzando la funzione execute. Un problema contestuale sorge quando una funzione execute viene richiamata all'interno di un'altra funzione chiamata usando execute. Fabric perde il contesto dell'esecuzione esterna quando viene richiamato l'esecuzione interna e non lo recupera mai. Ad esempio:Creazione di chiamate nidificate per "eseguire" con la libreria Fabric di Python

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) 

Dopo la prima chiamata a execute, tessuto perde completamente suo contesto ed esegue tutte le ulteriori comandi nella funzione deploy_code con host_string='lb1' anziché 'web1'. Come posso ricordarlo?

sono arrivato fino a questo hack, ma mi sento come potrebbe rompersi su versioni future:

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

Ciò consente di risparmiare in modo efficace tutto lo stato e la ripristina dopo la chiamata, ma sembra come un uso improprio del funzione. C'è un modo migliore per dire a Fabric che è in esecuzione nidificata e utilizzare uno stack di impostazioni o un metodo equivalente per ricordare lo stato?

Grazie!

+0

btw, sto usando Fabric 1.3.4 – adowds

+0

Perché usi 'execute()' all'interno delle attività invece di chiamare direttamente le funzioni? – jfs

+1

@JFSebastian Penso che la [documentazione] (http://docs.fabfile.org/en/1.3.3/usage/execution.html#execute) risponda alla tua domanda: "Il design di Fabric evita il comportamento magico, quindi chiama semplicemente un la funzione compito non tiene conto dei decoratori come i ruoli ». – jcollado

risposta

1

Il tessuto non utilizzato correttamente. Come si chiamerebbe semplicemente fab deploy_code invece di eseguire il file fab come se fosse Python. Suggerirei di passare attraverso il tutorial per avere un'idea migliore su come strutturare il tuo file.

Comunque, è possibile look here per come utilizzare execute() e here per ulteriori dettagli.

Hai un errore di battitura in cui hai abbandonato il "s" dal ruolo dei server web. Il che potrebbe spiegare che non hai una buona stringa ospite quando vuoi nella seconda attività.

Ma a parte questo, è possibile anche impostare ruoli e host nel comando execute() stesso.