10
votes

Problèmes d'essai de SSH dans une nouvelle instance EC2 avec PARAMIKO

Je travaille sur un script qui couvre une nouvelle instance EC2 avec Boto et utilise le client PARAMIKO SSH pour exécuter des commandes distantes sur l'instance. Pour une raison quelconque, le client de paramiko n'est pas amené à se connecter, je reçois l'erreur:

import boto.ec2, time, paramiko, os
# Connect to the us-west-1 region
ec2 = boto.ec2.regions()[3].connect()
image_id = 'ami-ad7e2ee8'
image_name = 'Ubuntu 10.10 (Maverick Meerkat) 32-bit EBS'
new_reservation = ec2.run_instances(
    image_id=image_id,
    key_name='test',
    security_groups=['web'])

instance = new_reservation.instances[0]

print "Spinning up instance for '%s' - %s. Waiting for it to boot up." % (image_id, image_name)
while instance.state != 'running':
    print "."
    time.sleep(1)
    instance.update()

print "Instance is running, ip: %s" % instance.ip_address

print "Connecting to %s as user %s" % (instance.ip_address, 'ubuntu')
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(instance.ip_address, username='ubuntu', key_filename=os.path.expanduser('~/.ssh/test'))
stdin, stdout, stderr = ssh.exec_command('echo "TEST"')
print stdout.readlines()
ssh.close()


5 commentaires

+1 Bonne question! Je n'ai jamais rien fait avec mon compte EC2, cela me donnera quelques impulsions.


Avez-vous essayé de spécifier le port comme le 2e paramètre de ssh.connect ()?


Merci pour la suggestion mais j'ai. Je crois que je l'ai compris. Même si le statut d'instance est "en cours d'exécution" selon Boto, il semble y avoir un retard pour quand il acceptera réellement toutes les connexions SSH. Ajout d'un temps.slep (25) avant d'essayer de faire la connexion semble être suffisant, mais je vais faire d'autres tests.


super! Une fois que vous avez travaillé, vous pouvez peut-être répondre à votre propre question, donc il est là pour le prochain gars qui tourne dans cela!


exactement. faire du temps.sleep (60) résoudra le problème. Mais votre code m'inspire de la partie Paramiko. Merci mec.


5 Réponses :


10
votes

Je semble avoir compris cela par procès et par erreur. Même si l'état d'instance est "en cours d'exécution" selon Boto, il y a un délai pour quand il autorisera réellement une connexion SSH. Ajout d'un "temps.sleep (30)" avant le "SSH.Connect (...)" semble faire le tour pour moi, bien que cela puisse varier.


5 commentaires

Probablement "courir" signifie que l'image elle-même démarre? Vous devez donc attendre que le système d'exploitation commence et SSHD commence.


Oui, ça a le plus de sens.


Je fais la même chose que vous (avec 45 secondes: p) et c'est le seul moyen que j'ai trouvé pour le faire même si je n'aime pas faire dormir (x)


Vous n'avez pas besoin de faire cela. Vous pouvez essayer de vous connecter pendant un certain nombre de fois et de saisir les exceptions. J'ai bien implémenté avec succès ce modèle pour fonctionner avec PARAMIKO.


Jeez c'était frustrant! Merci @rr. !! J'utilise sshclient_from_instance de Boto's qui s'appuie sur Paramiko, évidemment. Je pense juste que ce n'est pas un bon message d'erreur et une conception de l'API. Cela ne devrait pas être aussi mystérieux - à moins que ce cas d'utilisation soit rare, peut-être?



1
votes

J'ai récemment couru dans ce numéro. La méthode "correcte" serait d'initier un proche () d'abord puis de rouvrir la connexion. Cependant, sur les versions plus anciennes, Fermer () était cassée.

Avec cette version ou plus tard, il devrait être corrigé: https://github.com/boto/boto/pull/412

Méthode "appropriée": xxx


2 commentaires

Je ne comprends pas pourquoi vous créez une nouvelle connexion à chaque fois par la boucle. Ce code ( Github.com/garnaat/paws/blob/master/ec2_launch_instance.py ) est une boucle similaire utilisant le même connexion à chaque fois. Je n'ai jamais eu de problème avec ce modèle.


Le problème est que la connexion initiale est mise en cache. Donc, il ne revérifiera pas une mise à jour, sauf si vous fermez et rouvrez la connexion. C'est ce que j'ai trouvé dans mes tests cependant. Je n'ai pas parlé aux boto les gars à ce sujet.



2
votes

Pourquoi ne pas utiliser boto.manage.cmdshell à la place? xxx

(code pris de la ligne 152 dans EC2_Launch_instance.py )

pour Disponible CMDSHELL Les commandes ont un coup d'oeil à la sshclient classe de cmdshell.py .


0 commentaires

3
votes

Le moyen de vérifier que SSH est disponible est de vous assurer que ses deux statuts vérifient les deux passes. Sur web ui il ressemble à ceci: Entrez la description de l'image ici

et en utilisant Boto3 (la question originale utilisée Boto, mais c'était il y a 5 ans), nous pouvons faire: xxx


1 commentaires

Cela fonctionne, je l'ai essayé. Une note: vous pouvez ssh aux nœuds avant que ces deux statuts passent de "Initialisation" à "OK". Donc, si votre code est impatient et veut ssh aussi tôt que possible, une technique différente peut être meilleure.



0
votes

J'ai récemment voir ce code et j'ai une suggestion pour le code, Au lieu d'exécuter une boucle pour vérifier si l'instance est en cours d'exécution ou non, vous pouvez essayer "wait_until_running ()".

suivi est le code exemple ... P>

client = boto3.resource(
    'ec2',
    region_name="us-east-1"
)

Instance_ID = "<your Instance_ID>"
instance = client.Instance(Instance_ID)
instance.start()
instance.wait_until_running()


0 commentaires