web-dev-qa-db-fra.com

Utilisation d'un fichier de clés SSH avec Fabric

Comment configurez-vous la structure pour se connecter à des hôtes distants à l'aide de fichiers de clés SSH (par exemple, des instances Amazon EC2)?

94
Yuval Adam

Il convient également de mentionner ici que vous pouvez utiliser les arguments de ligne de commande pour cela:

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

Trouver un simple fabfile avec un exemple pratique d'utilisation du fichier de clés SSH n'est pas facile pour une raison quelconque. J'ai écrit un article de blog à ce sujet ( avec un Gist correspondant ).

Fondamentalement, l'utilisation ressemble à ceci:

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 partie importante est de définir le env.key_filename variable d'environnement, afin que la configuration Paramiko puisse la rechercher lors de la connexion.

145
Yuval Adam

Une autre fonctionnalité intéressante disponible à partir de Fabric 1.4 - Fabric prend désormais en charge les configurations SSH .

Si vous avez déjà tous les paramètres de connexion SSH dans votre ~/.ssh/config fichier, Fabric le supportera nativement, il vous suffit d'ajouter:

env.use_ssh_config = True

au début de votre fabfile.

64
Yuval Adam

Pour moi, ce qui suit n'a pas fonctionné:

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

ou

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

Cependant, ce qui suit a fait:

env.key_filename=['keyfile.pem']
env.hosts=["[email protected]"]

ou

env.key_filename=['keyfileq.pem']
env.Host_string="[email protected]"
15
Gaurav Toshniwal

Pour fabric2 dans fabfile, utilisez ce qui suit:

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

et lancez-le avec:

fab staging do_something_remote

MISE À JOUR:
Pour plusieurs hôtes (un hôte fera aussi), vous pouvez utiliser ceci:

from fabric2 import task, SerialGroup

@task
def staging(ctx):
    conns = SerialGroup(
        '[email protected]',
        '[email protected]',
        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)

et exécutez-le avec fab ou fab2:

fab staging stop
12
MikeL

Je devais le faire aujourd'hui, mon fichier .py était aussi simple que possible, comme celui publié dans la réponse de @YuvalAdam mais je continuais à être invité à entrer un mot de passe ...

En regardant le journal paramiko (la bibliothèque utilisée par fabric pour ssh), j'ai trouvé la ligne:

Homologue ssh incompatible (pas d'algorithme kex acceptable)

J'ai mis à jour paramiko avec:

Sudo pip install paramiko --upgrade

Et maintenant ça marche.

7
flagg19

Comme indiqué ci-dessus, Fabric prend en charge les paramètres de fichier .ssh/config à la mode, mais l'utilisation d'un fichier pem pour ec2 semble être problématique. IOW un fichier .ssh/config correctement configuré fonctionnera à partir de la ligne de commande via 'ssh servername' et ne fonctionnera pas avec 'fab someask' lorsque env.Host = ['servername'].

Cela a été surmonté en spécifiant le fichier env.key_filename = 'keyfile' dans mon fabfile.py et en dupliquant l'entrée IdentityFile déjà dans mon .ssh/config.

Il peut s'agir de Fabric ou de paramiko, qui dans mon cas était Fabric 1.5.3 et Paramiko 1.9.0.

1
Jeff Doran