2013-04-25 22 views
5

Il passaggio di un fabric env.hosts come variabile non funziona nella funzione.Il passaggio di un fabric env.hosts come variabile non funziona nella funzione

demo.py

#!/usr/bin/env python 

from fabric.api import env, run 

def deploy(hosts, command): 
    print hosts 
    env.hosts = hosts 
    run(command) 

main.py

#!/usr/bin/env python 

from demo import deploy 

hosts = ['localhost'] 
command = 'hostname' 
deploy(hosts, command) 

pitone main.py

['localhost'] 
No hosts found. Please specify (single) host string for connection: 

Ma env.host_string opere!

demo.py

#!/usr/bin/env python 

from fabric.api import env, run 

def deploy(host, command): 
    print host 
    env.host_string = host 
    run(command) 

main.py

#!/usr/bin/env python 

from demo import deploy 

host = 'localhost' 
command = 'hostname' 
deploy(host, command) 

pitone main.py

localhost 
[localhost] run: hostname 
[localhost] out: heydevops-workspace 

Ma l'env.host_string non è abbastanza per noi, si tratta di un singolo host . Forse possiamo usare env.host_string all'interno di un ciclo, ma non va bene. Perché vogliamo anche impostare il numero di attività simultanee ed eseguirle parallelamente.

Ora a ddep (il mio motore di distribuzione), io uso solo MySQLdb per ottenere i parametri quindi eseguire il comando fab come:

os.system("fab -f service/%s.py -H %s -P -z %s %s" % (project,host,number,task)) 

Questo è un modo semplice, ma non va bene. Perché se uso il comando fab, non riesco a cogliere le eccezioni e gli errori dei risultati in Python, per far sì che il mio ddep possa "riprovare" gli host guasti. Se utilizzo "from demo import deploy", posso controllarli e ottenerli con alcuni codici in Python.

Quindi ora "env.host" è il problema. Qualcuno può darmi una soluzione? Grazie mille.

risposta

6

Ecco la mia opinione.

Secondo docs, se si chiamano le attività fabric da script Python, è necessario utilizzare fabric.tasks.execute.

Dovrebbe essere smth come questo:

  • demo.py

    from fabric.api import run 
    from fabric.tasks import execute 
    
    
    def deploy(hosts, command): 
        execute(execute_deploy, command=command, hosts=hosts) 
    
    
    def execute_deploy(command): 
        run(command) 
    
  • main.py

    from demo import deploy 
    
    hosts = ['localhost'] 
    command = 'hostname' 
    
    deploy(hosts, command) 
    

Poi, basta eseguire python main.py. Spero possa aiutare.

+0

ringrazio molto Alexander! L'ho risolto da solo, poi ho scoperto che i nostri modi sono gli stessi. – mcsrainbow

+0

Fantastico, questo ha funzionato anche per me. Grazie! – xamox

2

Infine, ho risolto questo problema utilizzando execute() ed exec.

principale.py

#!/usr/bin/env python 

from demo import FabricSupport 

hosts = ['localhost'] 

myfab = FabricSupport() 
myfab.execute("df",hosts) 

demo.py

#!/usr/bin/env python 

from fabric.api import env, run, execute 

class FabricSupport: 
    def __init__(self): 
     pass 

    def hostname(self): 
     run("hostname") 

    def df(self): 
     run("df -h") 

    def execute(self,task,hosts): 
     get_task = "task = self.%s" % task 
     exec get_task 
     execute(task,hosts=hosts) 

pitone main.py

[localhost] Executing task 'hostname' 
[localhost] run: hostname 
[localhost] out: heydevops-workspace