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!
btw, sto usando Fabric 1.3.4 – adowds
Perché usi 'execute()' all'interno delle attività invece di chiamare direttamente le funzioni? – jfs
@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