设置Fabric SSH,错误:超时

时间:2014-12-15 03:56:21

标签: ssh fabric paramiko

我是Fabric的新手,所以这可能有一个简单的答案我因错误的搜索术语而错过了。

我正在尝试在AWS中启动一个新的ubuntu EC2实例,然后使用Fabric连接到它并让它执行几个命令。但是,似乎Fabric的SSH连接存在问题,也许我正在定义一些env变量错误?

@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
    ....

我运行fab prep_deploy deploy,因为我读过你需要新的任务才能使新的env变量生效。 我明白了 Fatal error: Timed out trying to connect to ...amazonaws.com (tried 1 time) Underlying exception: timed out

实例的安全组对SSH开放:我可以通过Putty连接。事实上,如果我在deploy()开始时清空`env.host_string'变量,当它提示我手动输入主机时,我可以写入“ubuntu @ ... amazonaws.com:22”,完全从任务开始时的输出中看到的主机名,它将连接到实例。但我无法弄清楚如何操纵环境变量以便它理解主机名。

1 个答案:

答案 0 :(得分:1)

使用变量看起来您的结构设置是正确的。我能够使用您提供的代码连接到我的Ubuntu VM。我想知道你是否有连接问题,因为当你的脚本运行第二个任务时,亚马逊实例没有完全启动并准备连接。我在不同的VM主机上遇到过这个问题。 我添加了以下代码来检查并再次尝试连接。这可能会对你有所帮助

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

将函数调用插入部署任务

def deploy():
    waitforssh()

这应测试连接。如果端口没有响应,它将等待5秒钟并再次尝试。 这可以解释为什么你的第二次连接尝试有效。