Usando un archivo de claves SSH con Fabric

¿Cómo configura el tejido para conectarse a hosts remotos utilizando archivos de claves SSH (por ejemplo, instancias de Amazon EC2)?

También vale la pena mencionar aquí que puede usar los argumentos de la línea de comandos para esto:

fab command -i /path/to/key.pem [-H [user@]host[:port]] 

No es fácil encontrar un archivo fab simple con un ejemplo funcional del uso del archivo de claves SSH por alguna razón. Escribí una publicación de blog al respecto ( con una idea coincidente ).

Básicamente, el uso es algo como esto:

 from fabric.api import * env.hosts = ['host.name.com'] env.user = 'user' env.key_filename = '/path/to/keyfile.pem' def local_uname(): local('uname -a') def remote_uname(): run('uname -a') 

Lo importante es configurar la variable de entorno env.key_filename , para que la configuración de Paramiko pueda buscarla al conectarse.

Otra característica interesante disponible en Fabric 1.4: Fabric ahora admite configuraciones SSH .

Si ya tiene todos los parámetros de conexión SSH en su archivo ~/.ssh/config , Fabric lo admitirá de forma nativa, todo lo que necesita hacer es agregar:

 env.use_ssh_config = True 

al comienzo de su archivo fabfile.

Para mí, lo siguiente no funcionó:

 env.user=["ubuntu"] env.key_filename=['keyfile.pem'] env.hosts=["xxx-xx-xxx-xxx.ap-southeast-1.compute.amazonaws.com"] 

o

 fab command -i /path/to/key.pem [-H [user@]host[:port]] 

Sin embargo, lo siguiente hizo:

 env.key_filename=['keyfile.pem'] env.hosts=["ubuntu@xxx-xx-xxx-xxx-southeast-1.compute.amazonaws.com"] 

o

 env.key_filename=['keyfileq.pem'] env.host_string="ubuntu@xxx-xx-xxx-xxx.ap-southeast-1.compute.amazonaws.com" 

Para la tela 2.2.2 usando fabfile puedes usar lo siguiente:

 from fabric import task, Connection @task def staging(ctx): ctx.name = 'staging' ctx.user = 'ubuntu' ctx.host = '192.1.1.1' ctx.connect_kwargs.key_filename = os.environ['ENV_VAR_POINTS_TO_PRIVATE_KEY_PATH'] @task def do_something_remote(ctx): with Connection(ctx.host, ctx.user, connect_kwargs=ctx.connect_kwargs) as conn: conn.sudo('supervisorctl status') 

y ejecutarlo con:

 fab staging do_something_remote 

Tenía que hacer esto hoy, mi archivo .py era lo más simple posible, como el que se publicó en la respuesta de @YuvalAdam, pero aún así me seguían pidiendo una contraseña …

Mirando el paramiko (la biblioteca utilizada por fabric para ssh), encontré la línea:

Compañero ssh incompatible (no hay algoritmo kex aceptable)

paramiko con:

 sudo pip install paramiko --upgrade 

Y ahora está funcionando.

Como se indicó anteriormente, Fabric admitirá la configuración del archivo .ssh / config de alguna manera, pero el uso de un archivo pem para ec2 parece ser problemático. IOW un archivo .ssh / config correctamente configurado funcionará desde la línea de comandos a través de ‘ssh servername’ y no podrá trabajar con ‘fab sometask’ cuando env.host = [‘servername’].

Esto se superó especificando el env.key_filename = ‘keyfile’ en mi fabfile.py y duplicando la entrada IdentityFile ya en mi .ssh / config.

Esto podría ser Fabric o Paramiko, que en mi caso fue Fabric 1.5.3 y Paramiko 1.9.0.