Подключение к хосту, указанному в ~ / .ssh / config, при использовании Fabric - PullRequest
83 голосов
/ 20 июня 2010

У меня проблемы с Fabric, не распознающими хосты, которые у меня есть в ~/.ssh/config.

Мой fabfile.py выглядит следующим образом:

from fabric.api import run, env

env.hosts = ['lulu']

def whoami():
    run('whoami')

Запуск $ fab whoami дает:

[lulu] run: whoami

Неустранимая ошибка: поиск имени не удался для lulu

Имя lulu в моем ~/.ssh/config, вот так:

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

Моя первая мысль для решения этой проблемы - добавить что-то вроде lulu.lulu к /etc/hosts (я на Mac), но потом у меня естьтакже передать файл идентификации в Fabric - и я бы предпочел, чтобы моя аутентификация (например, ~/.ssh/config) была отделена от моего развертывания (например, fabfile.py).

Кстати, если вы попытаетесьПри подключении к хосту в файле hosts, fabric.contrib.projects.rsync_project, кажется, не подтверждает «порты» в hosts.env (т.е., если вы используете hosts.env = [lulu:2100], вызов rsync_project, кажется, пытается подключиться к lulu:21).

Существует ли причина, по которой Fabric не распознает это lulu имя?

Ответы [ 4 ]

142 голосов
/ 13 марта 2012

Начиная с версии 1.4.0, Fabric использует вашу конфигурацию ssh (частично).Тем не менее, вам нужно явно включить его, когда

env.use_ssh_config = True

где-то в верхней части вашего файла.После того, как вы это сделаете, Fabric должен прочитать вашу конфигурацию ssh (из ~/.ssh/config по умолчанию или из env.ssh_config_path).

Одно предупреждение: если вы используете версию старше 1.5.4, произойдет прерываниеесли установлено env.use_ssh_config, но нет файла конфигурации.В этом случае вы можете использовать обходной путь, например:

if env.ssh_config_path and os.path.isfile(os.path.expanduser(env.ssh_config_path)):
    env.use_ssh_config = True
9 голосов
/ 15 апреля 2011

Обратите внимание, что это также происходит, когда имя не в /etc/hosts. У меня была та же проблема, и мне пришлось добавить имя хоста в этот файл и ~/.ssh/config.

5 голосов
/ 02 сентября 2010

update : Этот ответ устарел .


В настоящее время Fabric не поддерживает файл .ssh / config.Вы можете настроить их в функции, чтобы затем вызывать cli, например: fab production task;где production задает имя пользователя, имя хоста, порт и идентификатор ssh.

Что касается проекта rsync, который теперь должен иметь возможность настройки порта, в противном случае вы всегда можете запустить локальный ("rsync ..."), поскольку это, по сути, то, что делает эта добавленная функция.

4 голосов
/ 20 сентября 2011

Для чтения конфигурации можно использовать следующий код (исходный код взят из: 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()
...