Pasar un sting de env.hosts de Fabric como una variable no funciona en la función
Pasar un sting env.hosts de Fabric como una variable no funciona en la función.
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:
Pero env.host_string funciona!
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
Pero el env.host_string no es suficiente para nosotros, es un solo host. Tal vez podamos usar env.host_string dentro de un bucle, pero eso no es bueno. Porque también queremos establecer el número de tareas concurrentes y ejecutarlas en paralelo.
Ahora en ddep (mi motor de implementación), solo uso MySQLdb para obtener los parámetros y luego ejecuto el comando fab como:
os.system("fab -f service/%s.py -H %s -P -z %s %s" % (project,host,number,task))
Esta es una forma sencilla pero no buena. Porque si uso el comando fab, no puedo detectar las excepciones y fallas de los resultados en Python, para que mi ddep pueda "reintentar" los hosts fallidos. Si uso "desde la implementación de importación de demostración", puedo controlarlos y obtenerlos mediante algunos códigos en Python.
Así que ahora "env.host" es el problema. ¿Alguien me puede dar una solución? Muchas gracias.