sybaritic
sybaritic

Reputation: 402

Setting Up Fabric SSH, Error:Timed Out

I'm new to Fabric, so this might have a simple answer I've missed due to bad search terminology.

I'm trying to start a new ubuntu EC2 instance in AWS, then connect to it with Fabric and have it execute several commands. However, it seems there is a problem with Fabric's SSH connection, maybe I'm defining some env variable wrong?

@task    //starts new EC2 instance and sets env variables
def prep_deploy():
    //code to start new EC2 instance, named buildhost
    env.hosts=[buildhost.public_dns_name]
    env.user = "ubuntu"
    env.key_filename = ".../keypair.pem"
    env.port = 22

@task
def deploy():
    run("echo $HOME")  //code fails here
    ....

I run fab prep_deploy deploy, since I read you need a new task for the new env variables to take effect. I get Fatal error: Timed out trying to connect to ...amazonaws.com (tried 1 time) Underlying exception: timed out

The security groups for the instance are open to SSH: I can connect through Putty. In fact, if I empty the `env.host_string' variable at the start of deploy(), when it prompts me to manually input a host, I can write in "[email protected]:22", with the host name exactly as seen from output at the task start, and it will connect to the instance. But I can't figure how to manipulate the environment variables so that it understands the host name.

Upvotes: 1

Views: 3727

Answers (1)

grag42
grag42

Reputation: 257

It looks like your fabric settings are correct with the use of variables. I was able to use the code you provided to connect to my Ubuntu VM. I am wondering if you are having a connection issue due to the amazon Instance not being fully booted and ready for connections when your script runs the second task. I have run into that issue on a different VM hosts. I added the following code to check and try the connection again. This might help you

import socket
import time

def waitforssh():
    s=socket.socket()
    address=env.host_string
    port=22
    while True:
        time.sleep(5)
        try:
            s.connect((address,port))
            return
        except Exception,e:
            print "failed to connec to %s:%s %(address,port)
            pass

insert the function call into your deploy task

def deploy():
    waitforssh()

This should test the connection. If the port does not respond, it will wait 5 seconds and try again. That could explain why your second attempt to connect works.

Upvotes: 1

Related Questions