83 votes

Connexion à un hôte répertorié dans ~/.ssh/config lors de l'utilisation de Fabric

J'ai des problèmes avec Fabric ne reconnaît pas les hôtes que j'ai dans ~/.ssh/config .

Mon fabfile.py est le suivant :

from fabric.api import run, env

env.hosts = ['lulu']

def whoami():
    run('whoami')

Running $ fab whoami donne :

[lulu] run : whoami

Erreur fatale : La recherche de nom a échoué pour lulu

Le nom lulu est dans mon ~/.ssh/config comme ceci :

Host lulu
     hostname 192.168.100.100
     port 2100
     IdentityFile ~/.ssh/lulu-key

Ma première idée pour résoudre ce problème est d'ajouter quelque chose comme lulu.lulu a /etc/hosts (je suis sur un Mac), mais je dois alors également transmettre le fichier d'identité à Fabric - et je préférerais conserver mon authentification (c.-à-d. ~/.ssh/config ) séparée de mon déploiement (c'est à dire fabfile.py ).

De même, d'ailleurs, si vous essayez de vous connecter à un hôte dans le fichier hosts, fabric.contrib.projects.rsync_project ne semble pas reconnaître les "ports" dans la base de données de l'UE. hosts.env (c'est-à-dire que si vous utilisez hosts.env = [lulu:2100] un appel à rsync_project semble essayer de se connecter à lulu:21 ).

Il y a une raison pour que Fabric ne reconnaisse pas ce lulu nom ?

144voto

rbp Points 8956

Depuis la version 1.4.0, Fabric utilise votre configuration ssh (en partie). Cependant, vous devez explicitement l'activer, avec

env.use_ssh_config = True

quelque part en haut de votre fabfile. Une fois que vous avez fait cela, Fabric devrait lire votre configuration ssh (à partir de ~/.ssh/config par défaut, ou de env.ssh_config_path ).

Un avertissement : si vous utilisez une version antérieure à la 1.5.4, un abandon se produira si env.use_ssh_config est défini mais aucun fichier de configuration n'est présent. Dans ce cas, vous pouvez utiliser une solution de contournement comme :

if env.ssh_config_path and os.path.isfile(os.path.expanduser(env.ssh_config_path)):
    env.use_ssh_config = True

9voto

dougk Points 851

Notez que cela se produit également lorsque le nom n'est pas dans /etc/hosts . J'ai eu le même problème et j'ai dû ajouter le nom de l'hôte à la fois dans ce fichier et dans celui de l'utilisateur. ~/.ssh/config .

5voto

Morgan Points 2633

mise à jour : Cette réponse est maintenant périmée .


Fabric ne supporte pas actuellement le fichier .ssh/config. Vous pouvez les configurer dans une fonction qui sera ensuite appelée par le client, par exemple : fab production task ; où production définit le nom d'utilisateur, le nom d'hôte, le port et l'identité ssh.

En ce qui concerne le projet rsync, il devrait maintenant avoir la possibilité de définir le port, sinon, vous pouvez toujours exécuter local("rsync ...") car c'est essentiellement ce que fait cette fonction contribuée.

4voto

jmu Points 1211

On peut utiliser le code suivant pour lire la configuration (le code original provient de : http://markpasc.typepad.com/blog/2010/04/loading-ssh-config-settings-for-fabric.html ):

from fabric.api import *
env.hosts = ['servername']

def _annotate_hosts_with_ssh_config_info():
    from os.path import expanduser
    from paramiko.config import SSHConfig

    def hostinfo(host, config):
        hive = config.lookup(host)
        if 'hostname' in hive:
            host = hive['hostname']
        if 'user' in hive:
            host = '%s@%s' % (hive['user'], host)
        if 'port' in hive:
            host = '%s:%s' % (host, hive['port'])
        return host

    try:
        config_file = file(expanduser('~/.ssh/config'))
    except IOError:
        pass
    else:
        config = SSHConfig()
        config.parse(config_file)
        keys = [config.lookup(host).get('identityfile', None)
            for host in env.hosts]
        env.key_filename = [expanduser(key) for key in keys if key is not None]
        env.hosts = [hostinfo(host, config) for host in env.hosts]

        for role, rolehosts in env.roledefs.items():
            env.roledefs[role] = [hostinfo(host, config) for host in rolehosts]

_annotate_hosts_with_ssh_config_info()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X