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)?
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]]
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.
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.
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]"
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
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.
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.