Підключення до хосту, вказаного в ~ / .ssh / config під час використання Fabric


83

У мене проблеми з 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), але тоді я повинен також передати в файл особистих даних на тканину - і я волів би зберегти свою ідентифікацію (тобто ~/.ssh/config) окремо від мого розгортання ( тобто fabfile.py).

Крім того, до речі, якщо ви намагаєтесь підключитися до хосту у файлі хостів, fabric.contrib.projects.rsync_projectсхоже, не розпізнає "порти" у hosts.env(тобто, якщо ви використовуєте hosts.env = [lulu:2100]виклик, rsync_projectсхоже, намагаєтесь підключитися до lulu:21).

Чи є причина, що Fabric не впізнає цю luluназву?

Відповіді:


145

Починаючи з версії 1.4.0, Fabric використовує вашу конфігурацію ssh (частково). Однак вам потрібно явно увімкнути це за допомогою

env.use_ssh_config = True

десь у верхній частині вашого fabfile. Після цього 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

Відповідь спочатку починався з "Прийнята відповідь застаріла" [оскільки вона задокументувала поведінку до 1.4.0]. Я видалив цю передмову, оскільки моя відповідь була прийнята;) Дякую!
rbp

9

Зверніть увагу, що це також трапляється, коли імені немає /etc/hosts. У мене була та ж проблема, і мені довелося додати ім'я хосту як до цього файлу, так і до ~/.ssh/config.


5

оновлення : Ця відповідь застаріла .


Наразі Fabric не підтримує файл .ssh / config. Ви можете встановити їх у функції, щоб потім викликати кліп, наприклад: виробниче завдання fab; де виробництво встановлює ім’я користувача, ім’я хосту, порт та ідентифікатор ssh.

Що стосується проекту rsync, то тепер він повинен мати можливість налаштування порту. Якщо ні, ви завжди можете запустити локальний ("rsync ..."), оскільки це, по суті, робить ця внесена функція.


1
Встановіть для env.key_filename повний шлях до приватного ключа. Крім того, якщо у вас трапляються проблеми, див. Code.fabfile.org/issues/show/265, щоб дізнатися про декілька питань щодо цього.
тобич

1
Так, зараз він отримав підтримку. (хоча це було до 1.0, коли я коментував) Відзначаючи для наступних читачів.
Морган,

4

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

1
тканина 1.2+ використовує sshбібліотеку ( paramikoвилка):try: \n from ssh.config import SSHConfig \n except ImportError: \n from paramiko.config import SSHConfig
jfs

Бібліотека SSH була об’єднана назад до Paramiko, наприкладfrom paramiko.config import SSHConfig
n8henrie
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.