Das Übergeben eines Fabric env.hosts-Stings als Variable funktioniert nicht in Funktion

Das Übergeben eines Fabric-env.hosts-Stings als Variable funktioniert in der Funktion nicht.

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:

Aber env.host_string funktioniert!

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

Aber der env.host_string reicht uns nicht, er ist ein einzelner Host. Vielleicht können wir env.host_string in einer Schleife verwenden, aber das ist nicht gut. Weil wir auch die Anzahl der gleichzeitig ausgeführten Aufgaben festlegen und parallel ausführen möchten.

Jetzt benutze ich in ddep (meiner Implementierungs-Engine) nur MySQLdb, um die Parameter abzurufen, und führe dann den folgenden Befehl aus:

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

Dies ist ein einfacher Weg, aber nicht gut. Denn wenn ich den Befehl fab verwende, kann ich die Ausnahmen und Fehler der Ergebnisse in Python nicht abfangen, damit mein ddep die ausgefallenen Hosts "wiederholen" kann. Wenn ich "from demo import deploy" verwende, kann ich sie mit einigen Codes in Python steuern und abrufen.

Jetzt ist "env.host" das Problem. Kann mir jemand eine Lösung geben? Danke vielmals.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage