我是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
,因为我读到您需要一个新任务,新环境变量才能生效。我懂了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”中写上主机名与任务开始时的输出完全一致,它将连接到实例。但是我无法弄清楚如何操作环境变量,以便它理解主机名。
使用变量似乎您的结构设置正确。我能够使用您提供的代码连接到我的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秒钟,然后重试。那可以解释为什么您第二次尝试连接有效。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句