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.