2つの役割のそれぞれに対して1回実行されるRakeリモートタスクを実行するスクリプトがあります。両方のロールは、同じVagrantインスタンスのユーザーです。したがって、基本的に、タスクは同じVMへの2つのSSH接続を並行して開き、各接続でいくつかのコマンドを実行することです。このタスクを実行すると、次のエラーが発生することがよくあります。
ssh_exchange_identification: read: Connection reset by peer
ただし、これはMacMiniであるJenkinsスレーブノードでのみ発生します。接続のリセット動作を再現する簡単な例を考え出しました。
ssh root@vagrant-target "echo hello" & ssh root@vagrant-target "echo bye"
また、上記のコマンドを実行しても、同じVagrantセットアップを持つローカルのMacBook Proインスタンスで、繰り返し実行してもエラーが再現されないこともわかりました。
両方のマシンのOSバージョンは同じで、SSHのバージョンも同じです。また、-vvvを使用して上記のsshコマンドを実行しましたが、明らかなものは何も表示されませんでした。頭に浮かぶ唯一のことは、おそらくJenkinsによって使用されているJenkinsマシン上にいくつかのsshdプロセスが表示されることです。
jenkins 34394 0.1 0.0 2471700 840 ?? S 6:27PM 0:00.05 /usr/sbin/sshd -i
jenkins 35220 0.0 0.0 2470872 1284 ?? S 6:27PM 0:01.38 /usr/sbin/sshd -i
root 35218 0.0 0.0 2469596 2908 ?? S 6:27PM 0:00.04 /usr/sbin/sshd -i
この動作が一方のマシンに表示され、もう一方のマシンには表示されない理由について、誰かが何か考えを持っていますか?
コントロールマスター接続を設定してみましたか?これにより、1つの接続で複数のsshセッションを多重化できます。
コントロールマスターを設定するには
ssh -o "ControlMaster=yes" -o "ControlPath=~/.ssh/%r@%h:%p" root@server
-o "ControlMaster = yes"は、この接続がマスタープロセスになることをsshに通知します。制御パスは、この接続を介して他のsshセッションを許可するように設定されたソケットです。
Sshにcontrolpathを使用させるには、別の端末で使用する必要があります。
ssh -o "ControlPath=~/.ssh/%r@%h:%p" root@server "cmds" & \
ssh -o "ControlPath=~/.ssh/%r@%h:%p" root@server "cmds"
これで問題が解決しない場合は、-vvvフラグを使用してsshの出力を投稿できますか?