私のPCで複数のクラスタノードを管理する必要があります。問題は、クラスタノードがリモートPCからのみアクセスできることです。したがって、まずリモートPCにSSHを接続してから、リモートPCからクラスタノードに接続する必要があります。
ノードに直接アクセスできる場合は、Clustershなどを使用してすべてのノードを同時に管理します。
私の状況に合ったClustershのようなツールはありますか?
答え1
同様のタスクを実行するために、「クラスター画面」を一緒に編みました。/etc/clusters
Clustershと同じ方法でファイルを設定します。
cluster1 host1 host2
cluster2 host3 host4
次に、次のファイル/usr/local/bin/cs
(cssh名を少し盗用したもの)があります。
#!/bin/bash
if [[ $# < 1 ]]
then
echo -e "Usage : $0 cluster [command]";
exit;
fi;
cluster=$(/bin/grep $1 /etc/clusters | sed -e 's/[^\ ]*\ //')
for s in $cluster; do
if [ -n "$2" ]
then
exec screen -t "$s" $s "$2";
else
exec screen -t "$s" $s;
fi
done;
だからあなたは実行することができます
screen
cs clustername "optional command"
Clustershほど良くはありませんが、作業を完了します。
答え2
ssh
いいえ、あるコンピュータに接続してから別のコンピュータに接続する必要はありません。古いssh
顧客でさえ、これを行う必要はありません。
私は多くのリモートシステムに同じコマンドを入力することに興味がありませんが、あなたと同じような状況にあります。
ご質問の際、詳細は記載しておりませんのでコメントでお問い合わせいたします。それでは、いくつかの仮定をしましょう。私はあなたを仮定しますエリアボックスTmuxとssh
(クライアント)をかなり新しいバージョンでインストールします。そうでない場合(たとえばWindowsの場合)、仮想マシンを使用してください。また、あなたの「リモートPC」を想定します。ジャンプホスト、ssh
またインストールされ、接続することができます。~からあなたのローカルボックスは到着これクラスタノード順番に。クラスタノードにnode1
転送します。node5
それから他の2人がlocalbox
いましたjumphost
。
さて、用語がなくなったので開いてください。これはssh_config(5)へのリンクです。以下が不明な場合は切り替えてください。
ホームフォルダでお気に入りのテキストエディタで開きますlocalbox
。必要に応じて.ssh/config
フォルダを作成します。~/.ssh
次に、次のように入力します。
Host jumphost
HostName the.name.of.your.jumphost.tld
ForwardAgent yes # YMMV
Host node1 node 2 node3 node4 node5
ProxyCommand ssh -W %h:%p jumphost
これはssh
、接続する前に他のホストに接続して転送/プロキシする必要があることを示しています。node1
node5
jumphost
-W host:port
要求は、クライアントの標準入力および出力に対するセキュアチャネルを介してポートのホストに転送されます。-N
、、、-T
およびExitOnForwardFailure
を意味しますClearAllForwardings
。プロトコルバージョン2にのみ適用されます。
ssh
特に古いバージョン(jumphost
つまり、サポートされていません-W
)を使用している場合、しかし、netcat(nc
)がインストールされている場合は、ProxyCommand
次のものと交換できます。
ProxyCommand ssh user@proxy nc %h %p 2> /dev/null
上記の行がテキストファイルにある場合は、必要に応じて各クラスタノードの行を追加します。
Host node1 node1.cluster.domain.tld
HostKeyAlias node1.cluster.domain.tld
HostName 1.2.3.4 # you can give IPs
これは、名前がnode1
公開されていないか、あなたに知られておらlocalbox
ず、見つからないと仮定します。しかし、IPは知られています。後で実際のホスト名にHostKeyAlias
切り替えることができることを確認してください。また、最上位ドメインが変更されると、エイリアスをHostName $IP
同様のものに減らす傾向があります。node1.cluster
したがって、node2
パブリックDNSレコードがある可能性があります。
Host node2 node2.cluster.otherdomain.tld
HostKeyAlias node2.cluster
HostName node2.cluster.otherdomain.tld # ... or hostnames
これで、次のいずれかを使用できます(推奨)。
ssh node1
ssh node2
または(推奨されていません):
ssh node`.cluster.domain.tld
ssh node2.cluster.otherdomain.tld
次のノードに接続渡すこれjumphost
。またjumphost
、簡単に入力して接続することもできますssh jumphost
。
ここで理解する必要がある重要なことは、行に表示される名前はHost
DNS名またはIPから完全に独立していることです。もしHostName
この回線の回線が存在しますHost
。 IIRCインデントは習慣ですが、必須ではありません。
これで、SSH側で解決すべき唯一のものは認証です。User
代替ユーザー名を使用して接続するには、各「ブロック」に明示的にを指定できます。jumphost
プロキシ転送を有効にするのに十分信頼できるかどうかを判断する必要があります。そうしないと、キーを生成してjumphost
クラスタノードに通知する必要があります(から.ssh/authorized_keys
)。他のものは、パスワードを頻繁に求めるメッセージを表示します。
これまでのすべての内容を要約しますが、どのユーザーがどこに接続するかを交互に検討します。
Host jumphost
HostName the.name.of.your.jumphost.tld
User joe
Host node1 node 2 node3 node4 node5
ProxyCommand ssh -W %h:%p jumphost
User joseph
Host node1 node1.cluster.domain.tld
HostKeyAlias node1.cluster.domain.tld
HostName 1.2.3.4 # you can give IPs
User root
Host node2 node2.cluster.otherdomain.tld
HostKeyAlias node2.cluster
HostName node2.cluster.otherdomain.tld # ... or hostnames
...接続を転送するために接続されssh node1
ます。そして では順方向接続で接続します。joe@jumphost
root@node1
ssh node2
joe@jumphost
joseph@node2
したがって、ホストごとに一部の構成ファイルセクションをオーバーライドできます。
SSH部分が完了したので、コマンドを並列に実行してみましょう。
clusterssh
各xtermウィンドウがクラスタノードへのSSH接続を確立したら、複数のxtermウィンドウを調整できる必要があります。しかし、私は個人的にこれが面倒で直感的ではないと思います。
あなたには多くの選択肢があります。私が提案するものはすべてあなたのものですlocalbox
。
dsh
(ダンサー/分散シェル)または皿(勤務/分散シェル)のいずれかとして使用できます。
pssh
(parallel ssh
)も別のオプションですが、Pythonに基づいているため、経験的に解析機能が制限される可能性.ssh/config
があります。
最後にお勧めしたいのはマルチプレクサあなたのため。 「Terminal Multiplexer」の略で、GNUと同じカテゴリに属するscreen
がscreen
。
単一のTmuxウィンドウのウィンドウをCtrl+a S(Ctrl+a私が好むプレフィックスはどこですか)同期するショートカットがあります。
bind-key S set-window-option synchronize-panes \; display-message 'Toggled synchronize-panes'
これにより、Tmuxウィンドウ内の各ウィンドウでSSH接続を開き、入力をすべてのウィンドウに同期させることができます。これにより、Tmuxウィンドウ(ウィンドウはデフォルトでTmux用語のタブに似ています)のすべてのウィンドウにコマンドを入力し、を使用してすぐに実行できますEnter。
ただし、これは少数のリモートノードでは正常に機能できますが、数が多い場合は扱いにくいことに注意してください。したがって、このプロセスのすべてが終わったら、私が推薦する他の解決策の1つを見てください。