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.