web-dev-qa-db-fra.com

Comment exécuter une commande locale avec fabric 2?

Je veux utiliser Fabric et exécuter une commande en local, sans avoir à établir de connexions supplémentaires.

Comment puis-je faire cela dans le tissu 2 ? ... documentation semble manquer de donner un exemple.

17
sorin

La décision de conception de supprimer la commande local dans la structure 2 est une PITA IMHO, mais j'ai pu la simuler en utilisant Context d'Invoke au lieu de Connection.

from fabric import Connection
from invoke.context import Context

@task
def hostname(c):
    c.run('hostname')

@task
def test(c):
    conn = Connection('user@Host')
    hostname(conn)
    local_ctx = Context(c.config)  # can be passed into @task;
                                   # Connection is a subclass of Context
    hostname(local_ctx)
4
phoibos

run, Sudo et local se font de la même façon:

from fabric import Connection                                                                                  

cn = Connection('[email protected]')    # presumes ssh keys were exchanged                                        

cn.run('ls -al')     # assuming ssh to linux server - as scott                  
cn.Sudo('whoami')    # as root                                                  
cn.local('echo ---------- now from local')                                      
cn.local('dir /w')   # assuming client is windows                               
0
DataBlox

J'ajoute le commentaire de @ TheRealChx101 comme réponse car j'ai rencontré des problèmes avec Connection.local. Toutes les variables env ne sont pas entrées dans le pty, donc certains de mes scripts ne fonctionnaient pas correctement.

Avec le import from invoke run as local strophe (Invoke's local au lieu de Fabrics) tout a bien fonctionné.

0
RickyA