2011-05-17 23 views
8

Estoy trabajando en una secuencia de comandos que activa una nueva instancia de EC2 con boto y utiliza el cliente Paramiko SSH para ejecutar comandos remotos en la instancia. Por alguna razón, el cliente paramiko es tetrapléjico para conectar, me sale el error:Problemas al intentar SSH en una nueva instancia de EC2 con Paramiko

Traceback (most recent call last): 
    File "scripts/sconfigure.py", line 29, in <module> 
    ssh.connect(instance.ip_address, username='ubuntu', key_filename=os.path.expanduser('~/.ssh/test')) 
    File "build/bdist.macosx-10.3-fat/egg/paramiko/client.py", line 291, in connect 
    File "<string>", line 1, in connect 
socket.error: [Errno 61] Connection refused 

puedo ssh en bien de forma manual utilizando el mismo archivo de clave y el usuario. ¿Alguien ha tenido problemas al usar Paramiko? Mi código completo está debajo. Gracias.

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() 
+0

+1 buena pregunta! Nunca he hecho nada con mi cuenta EC2, esto me dará un poco de impulso. –

+1

¿ha intentado especificar el puerto como el segundo parámetro en ssh.connect()? –

+1

Gracias por la sugerencia, pero tengo. Creo que lo he descubierto. Aunque el estado de la instancia se está "ejecutando" de acuerdo con boto, parece haber una demora para cuando realmente aceptará cualquier conexión SSH. Agregar un time.slep (25) antes de intentar hacer la conexión parece ser suficiente, pero voy a hacer algunas pruebas más. –

Respuesta

10

Me parece haber descubierto esto por prueba y error. Aunque el estado de la instancia se está "ejecutando" de acuerdo con boto, hay un retraso para cuando realmente permitirá una conexión SSH. Agregar un "time.sleep (30)" antes de "ssh.connect (...)" parece ser el truco para mí, aunque esto puede variar.

+2

Probablemente 'ejecutando' significa que la imagen en sí misma está arrancando? Entonces, debe esperar a que se inicie el sistema operativo y que comience el sshd. –

+0

Sí, eso tiene más sentido. –

+0

Hago lo mismo que usted (con 45 segundos: p) y esa es la única forma que encontré para hacerlo, incluso si no me gusta hacer un sueño (x) – Genschi

1

Recientemente me encontré con este problema. La forma "correcta" sería iniciar un close() primero y luego volver a abrir la conexión. Sin embargo, en versiones anteriores, close() estaba roto.

Con esta versión o una versión posterior, es conveniente fijarlo: https://github.com/boto/boto/pull/412

método "correcto":

newinstance = image.run(min_count=instancenum, max_count=instancenum, key_name=keypair, security_groups=security_group, user_data=instancename, instance_type=instancetype, placement=zone) 
time.sleep(2) 
newinstance.instances[0].add_tag('Name',instancename) 

print "Waiting for public_dns_name..." 
counter = 0 
while counter < 70: 
    time.sleep(1) 
    conn.close() 
    conn = boto.ec2.connection.EC2Connection(ec2auth.access_key,ec2auth.private_key) 
    startedinstance = conn.get_all_instances(instance_ids=str(newinstance.instances[0].id))[0] 
    counter = counter + 1 
    if str(startedinstance.instances[0].state) == "running": 
     break 
    if counter == 69: 
     print "Timed out waiting for instance to start." 
print "Added: " + startedinstance.instances[0].tags['Name'] + " " + startedinstance.instances[0].public_dns_name 
+0

No entiendo por qué está creando una nueva conexión cada vez que pasa el ciclo. Este código (https://github.com/garnaat/paws/blob/master/ec2_launch_instance.py) realiza un ciclo similar utilizando la misma conexión cada vez que lo hace. Nunca he tenido un problema con ese patrón. – garnaat

+0

El problema es que la conexión inicial está en caché. Por lo tanto, no volverá a verificar una actualización a menos que cierre y vuelva a abrir la conexión. Esto es lo que he encontrado en mis pruebas sin embargo. No he hablado con los chicos del boto al respecto. –

2

Por qué no usar boto.manage.cmdshell en su lugar?

cmd = boto.manage.cmdshell.sshclient_from_instance(instance, 
                key_path, 
                user_name='ec2_user') 

(código tomado de la línea 152 en ec2_launch_instance.py)

Para cmdshell comandos disponibles echar un vistazo a la clase de SSHClientcmdshell.py.

1

La manera de comprobar si está disponible su ssh es asegurarse de que sus dos comprobaciones de estado se realizan. En la interfaz de usuario web que tiene este aspecto: enter image description here

Y el uso de boto3 (la pregunta utilizada boto original, pero fue hace 5 años), que podemos hacer:

session = boto3.Session(...) 
client = session.client('ec2') 
res = client.run_instances(...) # launch instance 
instance_id = res['Instances'][0]['InstanceId'] 

while True: 
    statuses = client.describe_instance_status(InstanceIds=[instance_id]) 
    status = statuses['InstanceStatuses'][0] 
    if status['InstanceStatus']['Status'] == 'ok' \ 
      and status['SystemStatus']['Status'] == 'ok': 
     break 
    print '.' 
    time.sleep(5) 
print "Instance is running, you are ready to ssh to it" 
+0

Esto funciona, lo probé. Una nota: puedes enviar ssh a los nodos antes de que estos dos estados pasen de 'inicializar' a 'aceptar'. Por lo tanto, si su código es impaciente y desea enviar ssh tan pronto como sea posible, una técnica diferente puede ser mejor. – t1m0

Cuestiones relacionadas