2017-09-23 1 views
0

Gibt es eine Möglichkeit, das aktuelle env programmatisch zu ändern, wenn Sie Fabric für die Bereitstellung verwenden?Fabric, Python - Ändern Sie env programmatisch

Was ich tun möchte, ist eine Aufgabe in allen meinen Umgebungen mit einem Anruf durchzuführen. Looping durch die Envs, und die gleiche Aufgabe aufrufen.

zum Beispiel:

def live(): 
    env.host = ['123.123.123.123'] 

def dev(): 
    env.host = ['321.321.321.321'] 

environments = ['live', 'dev'] 

def backup_db(): 
    run('mysqldump etc ..' % env) 

def backup_all_dbs(): 
    for environment in environments: 
     env = new_env(environment) 
     backup_db 

und dann laufen

fab backup_all_dbs 

aber ich weiß nicht, wie die env on the fly instanziieren, und tatsächlich die aktuelle env um einen neuen ersetzen Code.

Ich denke nicht, nur die env Funktion z. B. dev() oder live() zu nennen, ist genug, da es andere Dinge im aktuellen env dict gibt, wenn Sie es inspizieren.

Ich kann nichts in den Dokumenten darüber sehen, vielleicht kann das env nur einmal von der Kommandozeile aus erstellt werden?

dank

Antwort

0

Das ist nicht der beste Weg, Stoff zu verwenden, in Bezug auf die über mehrere Hosts den gleichen Befehl ausgeführt wird. Der bessere Weg sieht wie folgt aus:

from fabric.api import env, run, task 

env.hosts = ['123.123.123.123', '213.213.213.213'] 

@task 
def uname(): 
    run('uname -a') 

Sie finden How host lists are constructed Abschnitt der Dokumentation für weitere Informationen verweisen möchten.

+0

HI - danke dafür. Ich habe bereits mehrere Hosts pro env eingerichtet. Aber das möchte ich nicht erreichen (oder das, was ich gefragt habe). Ich denke auch nicht, dass es unvernünftig ist, all Ihre Umgebungen zu bitten, dieselbe Aufgabe auf allen ihren Hosts auszuführen, zB ihre aktuelle DB zu sichern, wenn Sie das wollen. –

+0

So funktioniert Fabric nicht: Sie "fragen" Ihre "Umgebungen" nicht, die gleiche Aufgabe auszuführen. Es gibt nur eine Umgebung und es ist ein globaler Wert. Sie haben auch gefragt, wie Sie dieselbe Aufgabe auf allen Hosts ausführen können - und genau das ist das Beispiel, das ich bereitgestellt habe. Hast du das obige Skript sogar ausgeführt, um seine Ausgabe zu sehen? – YellowShark

+0

Nein, ich habe dein Beispiel nicht ausgeführt, weil ich sehen kann, was es ist und es ist nicht das, was ich frage. Wenn Sie die Antwort auf meine Frage nicht kennen, ist das völlig in Ordnung. Was ich frage, ist technisch sehr klar - können Sie den globalen Wert von 'env' während der Laufzeit programmatisch ändern? nur zum kichern. –