Mam problem z Fabric
nierozpoznaniem hostów, na których się znajduję ~/.ssh/config
.
Mój fabfile.py
jest następujący:
from fabric.api import run, env
env.hosts = ['lulu']
def whoami():
run('whoami')
Bieganie $ fab whoami
daje:
[lulu] run: whoami
Błąd krytyczny: wyszukiwanie nazwy dla lulu nie powiodło się
Imię lulu
jest w moim ~/.ssh/config
, na przykład:
Host lulu
hostname 192.168.100.100
port 2100
IdentityFile ~/.ssh/lulu-key
Moja pierwsza myśl, aby rozwiązać ten jest dodanie czegoś podobnego lulu.lulu
do /etc/hosts
(jestem na komputerze Mac), ale potem muszę też przejść w pliku tożsamości na tkaninę - i wolałbym, aby moje uwierzytelniania (tj ~/.ssh/config
) oddzielić od mojego rozmieszczenia ( ie fabfile.py
).
Poza tym, nawiasem mówiąc, jeśli próbujesz połączyć się z hostem w pliku hosts, fabric.contrib.projects.rsync_project
nie wydaje się potwierdzać „portów” w hosts.env
(tj. Jeśli używasz hosts.env = [lulu:2100]
wywołania do rsync_project
wydaje się próbować się połączyć lulu:21
).
Czy jest jakiś powód, dla którego Fabric nie rozpoznaje tej lulu
nazwy?
Zwróć uwagę, że dzieje się tak również wtedy, gdy nazwy nie ma
/etc/hosts
. Miałem ten sam problem i musiałem dodać nazwę hosta zarówno do tego pliku, jak i~/.ssh/config
.źródło
aktualizacja : ta odpowiedź jest już nieaktualna .
Fabric nie obsługuje obecnie pliku .ssh / config. Możesz ustawić je w funkcji, aby następnie wywoływały cli, np .: zadanie produkcyjne fab; gdzie produkcja ustawia nazwę użytkownika, nazwę hosta, port i tożsamość ssh.
Jeśli chodzi o projekt rsync, powinien on teraz mieć możliwość ustawiania portu, jeśli nie, zawsze możesz uruchomić lokalny ("rsync ..."), ponieważ jest to zasadniczo to, co robi ta funkcja dodana.
źródło
Do odczytania konfiguracji można użyć następującego kodu (oryginalny kod pobrany z: 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()
źródło
ssh
biblioteki (paramiko
widelca):try: \n from ssh.config import SSHConfig \n except ImportError: \n from paramiko.config import SSHConfig
from paramiko.config import SSHConfig