A passagem de uma malha env.hosts do Fabric como uma variável não funciona na função

Passar um sting env.hosts de Fabric como uma variável não funciona na função.

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:

Mas 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

Mas o env.host_string não é suficiente para nós, é um único host. Talvez possamos usar env.host_string dentro de um loop, mas isso não é bom. Porque também queremos definir o número de tarefas simultâneas e executá-las paralelamente.

Agora no ddep (meu mecanismo de implementação), eu só uso o MySQLdb para obter os parâmetros e então executo o comando fab como:

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

Esta é uma maneira simples, mas não é boa. Porque se eu usar o comando fab, eu não posso pegar as exceções e falhas dos resultados em Python, para fazer o meu ddep pode "repetir" os hosts com falha. Se eu usar o "from demo import deploy", posso controlá-los e obtê-los com alguns códigos em Python.

Então agora "env.host" é o problema. Alguém pode me dar uma solução? Muito obrigado.

questionAnswers(2)

yourAnswerToTheQuestion