Fabric: Dokumentation zur Laufzeitkonfiguration

Erstellt am 17. Mai 2018  ·  4Kommentare  ·  Quelle: fabric/fabric

Ich habe eine Reihe von Fabric 1-Fabfiles, die env . Es ist derzeit nicht offensichtlich, diesen Code auf Fabric 2 zu migrieren. In der Dokumentation wird beispielsweise auf connect_kwargs verwiesen, aber es gibt nicht viel darüber, wie oder wo dies festgelegt werden soll. Nach dem Lesen der Invoke-Dokumente kann ich anscheinend keine der YAML / JSON-Konfigurationsoptionen verwenden, da ich Code ausführen muss (im folgenden Beispiel wird keyring zum Abrufen von Kennwörtern verwendet).

Es schien so, als würde das Verschieben von allem in eine fabric.py -Datei funktionieren:

import subprocess
import sys
from getpass import getuser
import os

domain = os.environ.get("DOMAIN", "loctest")

def get_config():
    user = getuser()

    try:
        password = subprocess.check_output(["keyring", "get", domain, user]).strip()
        print("Loaded %s password for %s from keyring" % (domain, user))
    except subprocess.CalledProcessError:
        print(
            "Unable to set password using `keyring` (is it in your PATH?) — expect to be nagged",
            file=sys.stderr,
        )

    return {'user': user, 'password': password}

connect_kwargs = get_config()

Leider bekommt das TypeError: can't pickle module objects . Das Festlegen von __all__ reicht nicht aus, um dies zu vermeiden, aber alles in die Funktion zu verschieben scheint zu funktionieren:

def get_config():
    import subprocess
    import sys
    from getpass import getuser
    import os

    domain = os.environ.get("DOMAIN", "loctest")
    user = os.environ.get("USER", getuser())

    try:
        password = subprocess.check_output(["keyring", "get", domain, user]).strip()
        print("Loaded %s password for %s from keyring" % (domain, user))
    except subprocess.CalledProcessError:
        print(
            "Unable to set password using `keyring` (is it in your PATH?) — expect to be nagged",
            file=sys.stderr,
        )

    return {"user": user, "password": password}

connect_kwargs = get_config()

Gibt es einen saubereren Weg, dies zu tun? Unter anderem entspricht dieser Code nicht ganz der Fabric 1-Version, da er den Benutzernamen nicht aus der Konfiguration abruft, was ich nicht brauche, aber es scheint eine Möglichkeit zu geben, zu sagen: „Holen Sie sich die Verarbeitung konfiguriere und aktualisiere diesen einen Wert “.

Bug Feature Needs investigation

Hilfreichster Kommentar

Gibt es ein einfaches Hallo-Welt-Beispiel mit einer fabfile.py-Datei? Ich habe einige Dokumente gelesen und das Internet ein paar Tage lang durchsucht und konnte noch keinen einzigen Befehl aus der Ferne auf Version 2 ausführen. Soweit ich weiß, steckt eine SSHException fest "Keine Authentifizierungsmethoden verfügbar"

Alle 4 Kommentare

Ich hatte vor, dass Konfigurationsdateien im "Python-Format" ungefähr die Lücke "Konfigurationswerte über Laufzeitcode-Ausführung füllen" füllen würden, also waren Sie mit der Datei .py wohl auf dem richtigen Weg. Das heißt - ich bin diesem Gedanken nicht bis zum Schluss gefolgt und es hört sich so an, als würden Sie dafür bezahlen, entschuldigen Sie. (Ich werde bemerken, dass ein Teil des Grundes darin besteht, dass ich davon ausgegangen bin, dass die meisten fortgeschrittenen Benutzer Dinge in ihrer Aufgabendatei / Fabfile tun würden, aber so oder so muss die Brücke von konfigurationsähnlichen Daten zu Laufzeitaufgabenkörpern funktionieren.)

Ich erinnere mich nicht ohne weiteres, was Dinge beizen würde, aber es ist wahrscheinlich eine Eigenart des Konfigurationssystems, ich muss mich damit befassen. Ich mag keine Gurke (heutzutage, wer tut das), daher war es ein wenig überraschend, dass sie in diesem Zusammenhang auftauchte.

Unabhängig davon ist die unmittelbare Ursache, dass wir davon ausgehen, dass der Modulinhalt die Konfiguration ist, sodass wir eine strengere Filterung benötigen, wenn wir von Modulobjektattributen zu einem verschachtelten Konfigurationsdiktat wechseln. Das Entfernen von Modulen könnte alles sein, was ehrlich gesagt benötigt wird, da jede andere Variablenzuweisung möglicherweise ein schlechtes Verhalten des Autors der Konfigurationsdatei wäre.

Betreff: Die übergeordnete Entwurfsfrage "Nur einen verschachtelten Konfigurationswert mutieren", die in den meisten Fällen intuitiv funktionieren sollte (der Konfigurationszusammenführungsprozess führt in der Regel zu einer tiefen Zusammenführung, sodass Ihre .py-Datei nur connect_kwargs = {'user': foo', 'password': 'bar'} festlegt sollte am Ende mit dem Inhalt von connect_kwargs einer anderen Konfigurationsquelle zusammengeführt werden), aber ich denke, es könnte einige Fehler in Bezug auf connect_kwargs , z. B. # 1762.

Ich sollte dies erneut testen, da dies mein erster Fabric 2-Upgrade-Versuch war und ich seitdem viele Commits gesehen habe.

Gibt es ein einfaches Hallo-Welt-Beispiel mit einer fabfile.py-Datei? Ich habe einige Dokumente gelesen und das Internet ein paar Tage lang durchsucht und konnte noch keinen einzigen Befehl aus der Ferne auf Version 2 ausführen. Soweit ich weiß, steckt eine SSHException fest "Keine Authentifizierungsmethoden verfügbar"

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen