Fabric: Des clés roledefs supplémentaires au-delà des « hôtes » ne se chargent pas dans env

Créé le 13 févr. 2015  ·  7Commentaires  ·  Source: fabric/fabric

Cet extrait de la documentation ne rend pas les exemples de clés 'foo' disponibles pour l'utilisateur via env, seule la clé 'hosts' est ensuite chargée par Fabric (dans env.hosts)

from fabric.api import env

env.roledefs = {
    'web': {
        'hosts': ['www1', 'www2', 'www3'],
        'foo': 'bar'
    },
    'dns': {
        'hosts': ['ns1', 'ns2'],
        'foo': 'baz'
    }
}

Documenté plus loin sur cette question stackoverlow

Commentaire le plus utile

@bitprophet Pourquoi cela a-t-il été fermé ? Le comportement des clés roledef supplémentaires n'a pas changé, est-ce donc un « ne corrigera pas » ?

Tous les 7 commentaires

vous pouvez utiliser l'exemple ci-dessous comme fichier de configuration, puis ajouter une fonction interne pour gérer fabfiles.py

comme : list.db
interface|ip|mot de passe|rôle....
espérons que cela fonctionnera pour vous.

Il existe plusieurs clés d'environnement utilisées par Fabric pour déterminer à quel(s) hôte(s) se connecter pour chaque session, c'est-à-dire rôles, effective_roles, hosts, host_string. Et bien sûr les décorateurs aussi.

Cela dit, le roledefs n'est qu'un mappage de noms pour le regroupement d'hôtes, pas nécessairement fusionné dans env.hosts.

Définir les roledefs en tant que dict vous aide à organiser d'autres paramètres personnalisés, à côté des hôtes, qui sont spécifiques au rôle. Vous pouvez y accéder via le chemin env complet, c'est-à-dire env.roledefs.web.foo

Mais, comme vous le dites, et peut-être vous attendez-vous à ce qu'un rôle défini en tant que dict soit fusionné avec la racine env.
C'est aussi pour cela que je l'utilise personnellement. Je n'ai tout simplement pas encore trouvé de bon moyen de l'implémenter et de tirer une demande, en raison de toutes les manières possibles de définir / d'obtenir le ou les rôles "actuels" lors de l'exécution d'une tâche spécifique et de la complexité lors de l'appel de sous-tâches dans les tâches . Simplement expliqué, je le fais en m'abonnant aux modifications apportées à env et en fusionnant le rôle lorsque la clé roles est définie dans env. Mais la partie "difficile" consiste à conserver l'état et à nettoyer tout rôle fusionnant lorsque de nouveaux rôles sont utilisés au sein de la session.

env.roledefs.web.foo produit l'erreur : AttributeError: 'dict' object has no attribute 'web'

Je veux dire que vous pouvez y accéder comme un dict normal, env.roledefs['web']['foo'] mais alors je ne vois pas pourquoi cette fonctionnalité existe du tout dans Fabric, c'est juste un simple dict. Il semble que cette fonctionnalité ait été implémentée pour une raison plus utile ?

Désolé, vous avez raison, vous devez y accéder comme vous le dites.

Actuellement, il n'y a pas d'autre raison que de vous permettre de regrouper plus de paramètres de rôle à côté des hôtes.
Mais, lorsque le jalon 1.11 est publié et que le #1092 existe, cela a plus de sens.

Aussi #1088 fait partie de 1.11 qui est similaire à ce que vous décrivez/attendez. Mais je n'ai pas encore trouvé de bon moyen, comme je l'ai dit, d'implémenter la fusion des roledefs. Seule preuve de cocept en fork utilisant un patch de singe profond "moche".

Ah d'accord, je me cognais la tête contre le mur en pensant qu'il me manquait quelque chose :) Ces numéros de problème référencés semblent aider un peu à chaque fois qu'ils roulent. Merci Jonas !

C'est déroutant et je pense qu'il convient de noter dans la documentation que ces variables supplémentaires ne sont pas accessibles en dehors des roledefs.

@bitprophet Pourquoi cela a-t-il été fermé ? Le comportement des clés roledef supplémentaires n'a pas changé, est-ce donc un « ne corrigera pas » ?

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