Przekazywanie żądła Fabric env.hosts jako zmiennej nie działa w funkcji

Przekazywanie żądła Fabric env.hosts jako zmiennej nie działa w funkcji.

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)

python main.py

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

Ale env.host_string działa!

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)

python main.py

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

Ale env.host_string nie jest dla nas wystarczający, to pojedynczy host. Może możemy użyć env.host_string w pętli, ale to nie jest dobre. Ponieważ chcemy również ustawić numer zadań współbieżnych i uruchomić je równolegle.

Teraz w ddep (moim silniku wdrażania) używam MySQLdb do pobierania parametrów, a następnie wykonuję polecenie fab, takie jak:

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

To prosty sposób, ale niezbyt dobry. Ponieważ jeśli użyję polecenia fab, nie mogę złapać wyjątków i niepowodzeń wyników w Pythonie, aby mój ddep mógł „ponowić próbę” nieudanych hostów. Jeśli korzystam z „wdrożenia demo importu”, mogę kontrolować i pobierać je za pomocą niektórych kodów w Pythonie.

Więc teraz „env.host” jest problemem. Czy ktoś może mi dać rozwiązanie? Wielkie dzięki.

questionAnswers(2)

yourAnswerToTheQuestion