Fabric: Documentation pour la configuration d'exécution

Créé le 17 mai 2018  ·  4Commentaires  ·  Source: fabric/fabric

J'ai un tas de fabfiles Fabric 1 qui définissent env . Il n'est actuellement pas évident de migrer ce code vers Fabric 2. La documentation fait référence par exemple à connect_kwargs mais il n'y a pas grand-chose sur comment ou où définir cela. Après avoir lu les documents Invoke, il ne semble pas que je puisse utiliser l'une des options de configuration YAML / JSON car j'ai besoin d'exécuter du code (dans l'exemple ci-dessous, en utilisant keyring pour récupérer les mots de passe).

Il semblait que quelque chose comme déplacer tout cela dans un fichier fabric.py pourrait fonctionner:

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()

Malheureusement, cela donne TypeError: can't pickle module objects . Définir __all__ ne suffit pas pour éviter cela, mais tout déplacer dans la fonction semble fonctionner:

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()

Y a-t-il / prévoit-il une manière plus propre de le faire? Entre autres choses, ce code n'est pas tout à fait équivalent à la version Fabric 1 car il ne tire pas le nom d'utilisateur de la configuration, ce qui n'est pas quelque chose dont j'ai besoin, mais il semble qu'il devrait y avoir un moyen de dire «Obtenez le traitement config et mettez à jour cette valeur ».

Bug Feature Needs investigation

Commentaire le plus utile

Existe-t-il un exemple simple de Hello World utilisant un fichier fabfile.py? J'ai lu tous les documents et parcouru Internet pendant quelques jours et je n'ai pas encore été en mesure d'exécuter une seule commande à distance sur la v2. Dans la mesure où je suis bloqué avec une SSHException "Aucune méthode d'authentification disponible"

Tous les 4 commentaires

J'avais l'intention que les fichiers de configuration au "format Python" rempliraient à peu près le trou de "peupler les valeurs de configuration via l'exécution du code d'exécution", donc vous étiez sans doute sur la bonne voie avec le fichier .py . Cela dit - je n'ai pas suivi cette pensée jusqu'à la conclusion et il semble que vous payez pour cela, excuses. (Je noterai qu'une partie de la raison est que je suppose que la plupart des utilisateurs avancés feraient des choses dans leur fichier de tâches / fabfile, mais dans tous les cas, le pont entre les données de configuration et les corps de tâches d'exécution nécessite du travail.)

Je ne me souviens pas désinvolte de ce que serait le décapage des choses, mais c'est probablement une bizarrerie du système de configuration, je vais devoir creuser là-dedans. Je n'aime pas le cornichon (ces jours-ci, qui aime) donc c'était un peu surprenant de le trouver dans ce contexte.

Quoi qu'il en soit, la cause immédiate est que nous supposons que le contenu du module "est" la configuration, nous avons donc besoin d'un filtrage plus strict lorsque nous passons des attributs d'objet de module à la configuration imbriquée dict. Le retrait des modules pourrait être tout ce dont vous avez besoin honnêtement, car toute autre affectation de variable serait sans doute un mauvais comportement de la part de l'auteur du fichier de configuration.

Re: la question de conception de niveau supérieur de "muter juste une valeur de configuration imbriquée", qui _ought_ pour fonctionner de manière intuitive dans la plupart des cas (le processus de fusion de configuration a tendance à faire une fusion profonde, donc votre fichier .py définit simplement connect_kwargs = {'user': foo', 'password': 'bar'} devrait finir par fusionner avec le contenu connect_kwargs toute autre source de configuration) mais je pense qu'il pourrait y avoir des bogues autour de connect_kwargs spécifiquement, par exemple # 1762.

Je devrais tester à nouveau car c'était ma première tentative de mise à niveau de Fabric 2 et j'ai vu beaucoup de commits voler depuis.

Existe-t-il un exemple simple de Hello World utilisant un fichier fabfile.py? J'ai lu tous les documents et parcouru Internet pendant quelques jours et je n'ai pas encore été en mesure d'exécuter une seule commande à distance sur la v2. Dans la mesure où je suis bloqué avec une SSHException "Aucune méthode d'authentification disponible"

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

supriyopaul picture supriyopaul  ·  4Commentaires

26huitailang picture 26huitailang  ·  3Commentaires

omzev picture omzev  ·  6Commentaires

Grazfather picture Grazfather  ·  4Commentaires

peteruhnak picture peteruhnak  ·  4Commentaires