0

さて、この質問に対する答えは単純に「parallel-ssh の使用をやめて、netmiko/paramiko を使用して独自のコードを記述してください。また、すでに Python 3 にアップグレードしてください」である可能性があります。

しかし、ここに私の問題があります。私は一度に 80 台ものデバイスをヒットしようとするために、parallel-sshを使用しています。これらのデバイスは信頼性が低いことで有名で、1 行または 2 行の出力を行った後にフリーズすることがあります。次に、parallel-ssh コードが何時間もハングアップし、スクリプトを実行したままにします。週末の後でスクリプトを実行している VM にジャンプしたところ、52 時間スタックしているジョブが表示されました。

私の最初のコードの関連部分、ハングするもの:

from pssh.pssh2_client import ParallelSSHClient
def remote_ssh(ip_list, ssh_user, ssh_pass, cmd):
  client = ParallelSSHClient(ip_list, user=ssh_user, password=ssh_pass, timeout=180, retry_delay=60, pool_size=100, allow_agent=False)
  result = client.run_command(cmd, stop_on_errors=False)
  return result

次に試したのはchannel_timoutオプションです。コマンド出力を取得するのに 4 分以上かかる場合は、デバイスがフリーズしていることがわかるので、スクリプトの後半で次のサイクルに進む必要があります。

from pssh.pssh_client import ParallelSSHClient
def remote_ssh(ip_list, ssh_user, ssh_pass, cmd):
  client = ParallelSSHClient(ip_list, user=ssh_user, password=ssh_pass, channel_timeout=180, retry_delay=60, pool_size=100, allow_agent=False)
  result = client.run_command(cmd, stop_on_errors=False)
  return result

このバージョンは、実際には何にも接続しません。何かアドバイス?一定時間後にsshセッションを強制終了しようとするchannel_timeout以外のものを見つけることができませんでした。

4

1 に答える 1

0

このコードは、関数内でクライアント オブジェクトを作成し、リモート チャネルを含む出力のみを SSH サーバーに返します。run_command

オブジェクトは関数によって返されることはないためclient、スコープ外になり、接続を閉じる Python によってガベージ コレクションが取得されます。

閉じた接続でリモート チャネルを使用しようとしても、うまくいきません。スタックしたスクリプトのスタック トレースをキャプチャすると、リモート チャネルまたは接続を使用してハングしている可能性が高くなります。

コードを変更して、クライアントを存続させます。クライアントも理想的には再利用する必要があります。

from pssh.pssh2_client import ParallelSSHClient

def remote_ssh(ip_list, ssh_user, ssh_pass, cmd):
  client = ParallelSSHClient(ip_list, user=ssh_user, password=ssh_pass, timeout=180, retry_delay=60, pool_size=100, allow_agent=False)
  result = client.run_command(cmd, stop_on_errors=False)
  return client, result

問題を解決しない結論に飛びつく前に、コードがどこで問題を起こしているかを理解していることを確認してください。つまり、コードがハングしている場所のスタック トレースをキャプチャします。同じことを行う同じコードは、同じように壊れます..

于 2017-11-23T11:29:23.220 に答える