我有一个脚本,该脚本创建AWS实例并使用fabric == 2.5.0对其进行配置。这是我在脚本中使用fabric2 Connection实例的问题:
def setup_site(self, ip, name):
connection = Connection(ip, user='toolman')
# If I put ipdb here, just continuing it will work.
# If take the debug line out, it will fail
# with "NoValidConnectionsError: [Errno None] Unable to connect to port 22 on ..."
# import ipdb; ipdb.set_trace()
connection.put(self.create_setup_file(name), 'setup.yaml')
我可以点击'c'继续调试器,并且每次都能正常工作。如果我没有调试器行,则每次connection.put调用都会失败,并显示“ NoValidConnectionsError:[Errno None]无法连接到...上的端口22”。
放置文件的AWS实例正在运行(instance.wait_until_running()在调用setup_site的代码中返回)。
如果我将python睡眠30秒钟,则一切正常,因此此问题可能在AWS实例中尚未解决。
[connection.open()
不需要,但有时可能会工作,因为它需要时间。
我最终使用以下函数代替了Connection调用:
def ensure_connection(*connection_args, ensure_connection_timeout=30, **connection_kwargs):
start = timer()
while (timer() - start) < ensure_connection_timeout:
try:
connection = Connection(*connection_args, **connection_kwargs)
connection.open()
return connection
except NoValidConnectionsError as e:
connection_error = e
# noinspection PyUnboundLocalVariable
raise connection_error