ホストリストをループして接続リストに接続を追加するコードがあります。接続エラーが発生した場合は、スキップして、ホストリストの次のホストに進みます。
ここに私が今持っているものがあります:
def do_connect(self):
"""Connect to all hosts in the hosts list"""
for Host in self.hosts:
try:
client = paramiko.SSHClient()
client.set_missing_Host_key_policy(paramiko.AutoAddPolicy())
client.connect(Host['ip'], port=int(Host['port']), username=Host['user'], timeout=2)
except:
pass
#client.connect(Host['ip'], port=int(Host['port']), username=Host['user'], password=Host['passwd'])
finally:
if paramiko.SSHException():
pass
else:
self.connections.append(client)
これは適切に機能しません。接続が失敗した場合、接続が確立されるまで、同じホストを何度も繰り返します。これを修正するにはどうすればよいですか?
あなた自身の答えはまだかなりの数の点で間違っています...
import logging
logger = logging.getLogger(__name__)
def do_connect(self):
"""Connect to all hosts in the hosts list"""
for Host in self.hosts:
# this one has to go outside the try/except block
# else `client` might not be defined.
client = paramiko.SSHClient()
try:
client.set_missing_Host_key_policy(paramiko.AutoAddPolicy())
client.connect(Host['ip'], port=int(Host['port']), username=Host['user'], timeout=2)
# you only want to catch specific exceptions here
except paramiko.SSHException as e:
# this will log the full error message and traceback
logger.exception("failed to connect to %(ip)s:%(port)s (user %(user)s)", Host)
continue
# here you want a `else` clause not a `finally`
# (`finally` is _always_ executed)
else:
self.connections.append(client)
わかりました。動作しました。Markと前述の以前のif checkが最終的に常にtrueを返したため、修正されたContinueを追加する必要がありました。
以下は修正されたコードで、失敗した接続を追加せず、その後通常どおりループを継続します。
def do_connect(self):
"""Connect to all hosts in the hosts list"""
for Host in self.hosts:
try:
client = paramiko.SSHClient()
client.set_missing_Host_key_policy(paramiko.AutoAddPolicy())
client.connect(Host['ip'], port=int(Host['port']), username=Host['user'], timeout=2)
except:
continue
#client.connect(Host['ip'], port=int(Host['port']), username=Host['user'], password=Host['passwd'])
finally:
if client._agent is None:
pass
else:
self.connections.append(client)