Tengo problemas para Fabric
no reconocer los hosts que tengo ~/.ssh/config
.
Mi fabfile.py
es el siguiente:
from fabric.api import run, env
env.hosts = ['lulu']
def whoami():
run('whoami')
Correr $ fab whoami
da:
[lulu] corre: whoami
Error fatal: la búsqueda de nombre falló para lulu
El nombre lulu
está en mi ~/.ssh/config
, así:
Host lulu
hostname 192.168.100.100
port 2100
IdentityFile ~/.ssh/lulu-key
Mi primer pensamiento para resolver este está añadiendo algo así como lulu.lulu
que /etc/hosts
(estoy en un Mac), pero luego tengo que pasar también en el archivo de identidad a Tela - y yo prefiero mantener mi autenticación (es decir ~/.ssh/config
) separado de mi despliegue ( es decir fabfile.py
).
Además, por cierto, si intenta conectarse a un host en el archivo hosts, fabric.contrib.projects.rsync_project
parece que no reconoce los 'puertos' en el hosts.env
(es decir, si usa hosts.env = [lulu:2100]
una llamada a rsync_project
parece intentar conectarse lulu:21
).
¿Hay alguna razón por la que Fabric no reconoce este lulu
nombre?
Tenga en cuenta que esto también sucede cuando el nombre no está en
/etc/hosts
. Tuve el mismo problema y tuve que agregar el nombre de host tanto a ese archivo como a~/.ssh/config
.fuente
actualización : esta respuesta ahora está desactualizada .
Actualmente, Fabric no es compatible con el archivo .ssh / config. Puede configurarlos en una función para luego llamar al cli, por ejemplo: fab production task; donde producción establece el nombre de usuario, el nombre de host, el puerto y la identidad ssh.
En cuanto al proyecto rsync, ahora debería tener la capacidad de configuración de puertos, si no, siempre puede ejecutar local ("rsync ...") ya que eso es esencialmente lo que hace la función contribuida.
fuente
Se puede usar el siguiente código para leer la configuración (código original tomado 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()
fuente
ssh
biblioteca (paramiko
fork):try: \n from ssh.config import SSHConfig \n except ImportError: \n from paramiko.config import SSHConfig
from paramiko.config import SSHConfig