我是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”,完全从任务开始时的输出中看到的主机名,它将连接到实例。但我无法弄清楚如何操纵环境变量以便它理解主机名。
答案 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秒钟并再次尝试。 这可以解释为什么你的第二次连接尝试有效。