example python ssh fabric

python - example - Conectarse a un host enumerado en ~/.ssh/config cuando usa Fabric



ubuntu install fabric (4)

Tengo problemas con Fabric no reconocer hosts que tengo en ~/.ssh/config .

Mi fabfile.py es el siguiente:

from fabric.api import run, env env.hosts = [''lulu''] def whoami(): run(''whoami'')

Ejecutando $ fab whoami da:

[lulu] ejecutar: whoami

Error fatal: error de búsqueda de nombre 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 esto es agregar algo como lulu.lulu a /etc/hosts (estoy en una Mac), pero también tengo que pasar el archivo de identidad a Fabric, y prefiero mantener mi autenticación ( es decir, ~/.ssh/config ) separado de mi implementación (es decir, fabfile.py ).

Además, por cierto, si intenta conectarse a un host en el archivo hosts, fabric.contrib.projects.rsync_project no parece reconocer los ''puertos'' en hosts.env (es decir, si usa hosts.env = [lulu:2100] una llamada a rsync_project parece intentar conectarse a lulu:21 ).

¿Hay alguna razón por la cual Fabric no reconozca este nombre de lulu ?


Desde la versión 1.4.0, Fabric usa su configuración ssh (parcialmente). Sin embargo, debe habilitarlo explícitamente, con

env.use_ssh_config = True

en algún lugar cerca de la parte superior de tu fabfile. Una vez que hagas esto, Fabric debería leer tu configuración ssh (desde ~/.ssh/config por defecto, o desde env.ssh_config_path ).

Una advertencia: si usa una versión anterior a 1.5.4, se producirá un aborto si env.use_ssh_config está establecido pero no hay un archivo de configuración presente. En ese caso, puede usar una solución alternativa como:

if env.ssh_config_path and os.path.isfile(os.path.expanduser(env.ssh_config_path)): env.use_ssh_config = True


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 .


Uno 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()


actualización : esta respuesta share .

Fabric no tiene soporte actualmente para 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, nombre de host, puerto y identidad ssh.

En cuanto al proyecto rsync, ahora debería tener la capacidad de configuración del puerto, si no, siempre se puede ejecutar local ("rsync ...") ya que es básicamente lo que hace esa función contribuida.