【问题标题】:Setting Up Fabric SSH, Error:Timed Out设置 Fabric SSH,错误:超时
【发布时间】:2015-02-13 03:21:04
【问题描述】:

我是 Fabric 的新手,因此由于搜索术语错误,我可能错过了一个简单的答案。

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

@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,因为我读到您需要一个新任务才能使新的环境变量生效。 我明白了 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”中写入主机名与任务开始时的输出完全相同,它将连接到实例。但我不知道如何操作环境变量以便它理解主机名。

【问题讨论】:

    标签: ssh fabric paramiko


    【解决方案1】:

    使用变量后,您的结构设置似乎是正确的。我能够使用您提供的代码连接到我的 Ubuntu 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 秒,然后重试。 这可以解释为什么您第二次尝试连接成功。

    【讨论】:

    • 我正在做类似的事情,使用 time(10) 等到实例状态从“挂起”变为“正在运行”,但显然等待的时间不够长,因为 waitforssh 失败了工作前一次。谢谢。
    • 这可能是另一个问题,但现在,虽然它确实连接,但它并没有作为用户“ubuntu”这样做,所以我的实例只是告诉我Please login as the user "ubuntu" rather than the user "root"。似乎仍然与某些环境问题有关,但看起来用户的标签很清楚......相同的代码
    • 此错误消息是否仅在 waitforssh() 期间或您的 deploy() 代码中出现?
    • 只有在实例上运行命令时才会出现错误信息(AWS不喜欢你使用root的时候); waitforssh 只是连接和断开连接,因此使用 root 不会收到任何错误,尽管它看起来“地址”变量,也就是复制的 host_string,不包括“ubuntu@”,所以它可能没有被注册跨度>
    • 我添加的代码实际上不应该建立连接,而只是检查端口 22 是否可用于连接。您能否在部署部分的脚本中添加 print("Executing on %s as %s" % (env.host, env.user))
    猜你喜欢
    • 2011-06-23
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多