У меня проблемы с Fabric
распознаванием хостов, которые у меня есть в~/.ssh/config
.
Мой fabfile.py
выглядит следующим образом:
from fabric.api import run, env
env.hosts = ['lulu']
def whoami():
run('whoami')
Бег $ fab whoami
дает:
[лулу] беги: 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
).
Также, кстати, если вы пытаетесь подключиться к хосту в файле hosts, fabric.contrib.projects.rsync_project
похоже , что он не подтверждает «порты» в hosts.env
(то есть, если вы используете hosts.env = [lulu:2100]
вызов, rsync_project
кажется, пытается подключиться lulu:21
).
Есть ли причина, по которой Fabric не распознает это lulu
имя?
Обратите внимание, что это также происходит, когда имя отсутствует
/etc/hosts
. У меня была такая же проблема, и мне пришлось добавить имя хоста как в этот файл, так и в~/.ssh/config
.источник
обновление : этот ответ теперь устарел .
В настоящее время Fabric не поддерживает файл .ssh / config. Вы можете настроить их в функции для последующего вызова cli, например: fab production task; где production устанавливает имя пользователя, имя хоста, порт и идентификатор ssh.
Что касается проекта rsync, у него теперь должна быть возможность настройки порта, если нет, вы всегда можете запустить локальный («rsync ...»), поскольку это, по сути, то, что делает эта дополнительная функция.
источник
Для чтения конфигурации можно использовать следующий код (исходный код взят из: 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()
источник
ssh
библиотеку (paramiko
fork):try: \n from ssh.config import SSHConfig \n except ImportError: \n from paramiko.config import SSHConfig
from paramiko.config import SSHConfig