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.