Utilizzo di un file di chiavi SSH con Fabric


100

Come si configura il fabric per connettersi a host remoti utilizzando file di chiavi SSH (ad esempio, istanze di Amazon EC2)?

Risposte:


69

Vale anche la pena menzionare qui che puoi usare gli argomenti della riga di comando per questo:

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

150

Trovare un semplice fabfile con un esempio funzionante di utilizzo del file di chiavi SSH non è facile per qualche motivo. Ho scritto un post sul blog a riguardo ( con una sintesi corrispondente ).

Fondamentalmente, l'utilizzo è qualcosa del genere:

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')

La parte importante è l'impostazione della env.key_filenamevariabile d'ambiente, in modo che la configurazione Paramiko possa cercarla durante la connessione.


4
nella pratica questa è la risposta migliore.
panchicore

3
env.key_filename può contenere un elenco di stringhe per provare più file di chiavi per una connessione.
Carl G

Stavo impostando la chiave settingsa livello di codice in una delle mie attività utilizzando il gestore di contesto e non riuscivo a far riconoscere il nome_file chiave fino a quando non sono passato key_filename='/path/to/key'a, key_filename=['/path/to/key']quindi se qualcun altro ha problemi, rendere key_filename un elenco di chiavi potrebbe risolverlo. Questo è con fab 1.10.1 e Paramiko 1.15.2
Jaymon

2
@AseemHegshetye, è stato rimosso nell'ultimo Fabric 2. Questa risposta è per Fabric 1.
Iulian Onofrei

1
Preferirei importazioni esplicite anziché import *
mit

64

Un'altra fantastica funzionalità disponibile a partire da Fabric 1.4: Fabric ora supporta le configurazioni SSH .

Se hai già tutti i parametri di connessione SSH nel tuo ~/.ssh/configfile, Fabric lo supporterà in modo nativo, tutto ciò che devi fare è aggiungere:

env.use_ssh_config = True

all'inizio del tuo fabfile.


2
Molto utile! Se incontri errori come IOError: [Errno 2] No such file or directory: ' /path/to/.ssh/key'o Login password for ' root':assicurati di non avere spazi bianchi nel tuo file .ssh/config. Ad esempio, User=rootinvece di User = root...
Dennis

@dennis Questo sembra ancora essere un problema nel 2016 ..! Grazie!
gabn88

17

Per fabric2 in fabfile utilizzare quanto segue:

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')

ed eseguilo con:

fab staging do_something_remote

AGGIORNAMENTO:
per più host (va bene anche un host) puoi usare questo:

from fabric2 import task, SerialGroup

@task
def staging(ctx):
    conns = SerialGroup(
        'user@10.0.0.1',
        'user@10.0.0.2',
        connect_kwargs=
        {
            'key_filename': os.environ['PRIVATE_KEY_TO_HOST']
        })
    ctx.CONNS = conns
    ctx.APP_SERVICE_NAME = 'google'

@task
def stop(ctx):
    for conn in ctx.CONNS:
        conn.sudo('supervisorctl stop ' + ctx.APP_SERVICE_NAME)

ed eseguilo con fab o fab2:

fab staging stop

1
Questo è il modo giusto di fare in fabric 2.x, poiché tutte le altre risposte non funzioneranno.
Vivek Aditya

Come supportare più host in questa stagingattività?
Black_Rider

1
@Black_Rider, aggiunto alla mia risposta
MikeL

15

Per me, quanto segue non ha funzionato:

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]]

Tuttavia, quanto segue ha fatto:

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"

3
Il tuo primo esempio funziona per me se usi env.user="ubuntu"invece di env.user=["ubuntu"].
Taylor Edmiston

7

Ho dovuto farlo oggi, il mio file .py era il più semplice possibile, come quello pubblicato nella risposta di @YuvalAdam ma continuavo a ricevere la richiesta di una password ...

Guardando il paramikolog (la libreria usata da fabric per ssh), ho trovato la riga:

Pari ssh incompatibile (nessun algoritmo kex accettabile)

Ho aggiornato paramikocon:

sudo pip install paramiko --upgrade

E ora funziona.


1

Come affermato sopra, Fabric supporterà le impostazioni del file .ssh / config in un certo senso, ma l'uso di un file pem per ec2 sembra essere problematico. IOW un file .ssh / config correttamente configurato funzionerà dalla riga di comando tramite 'ssh servername' e non funzionerà con 'fab Sometask' quando env.host = ['servername'].

Questo problema è stato risolto specificando env.key_filename = 'keyfile' nel mio fabfile.py e duplicando la voce IdentityFile già nel mio .ssh / config.

Questo potrebbe essere Fabric o paramiko, che nel mio caso era Fabric 1.5.3 e Paramiko 1.9.0.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.