1

これは何度も行われたと思いますが、明確な答えを見つけることができなかったので、より良い解決策についてあなたの専門知識に訴えています:

目的: 中程度のサイズの RHEL Hadoop クラスターをセットアップしており、すべてのノード間の SSH 接続の構成を自動化したいと考えています。最初のノードでは、ファイル 'remote_ips' にすべての IP のリストがあり、ファイル 'hduser_pw' (chmod 600) に hduser パスワードがあります。

ステップ 1) 各ホストで「hduser_pw」パスワード ファイルを作成する

for x in $(cat remote_ips); do sshpass -p$(cat hduser_pw) ssh -o StrictHostKeyChecking=no hduser@$x "echo $(cat hduser_pw) > hduser_pw; chmod 600 hduser_pw"; done

ステップ 2) クラスター内の各ノードの RSA キーを生成します。

for x in $(cat remote_ips); do sshpass -p$(cat hduser_pw) ssh -o StrictHostKeyChecking=no hduser@$x "echo -e 'y'| ssh-keygen -t rsa -N \"\" "; done

ステップ 3) ファイル「remote_ips」をクラスター内の各ノードにコピーします。

for x in $(cat remote_ips); do sshpass -p$(cat hduser_pw) scp -o StrictHostKeyChecking=no remote_ips hduser@$x:~; done

ステップ 4) 各ノードについて、RSA 公開鍵を他のすべてのノードの「authorized_keys」にコピーします。

for x in $(cat remote_ips); do sshpass -p$(cat hduser_pw) ssh -o StrictHostKeyChecking=no hduser@$x 'for y in $(cat remote_ips); do cat /home/hduser/.ssh/id_rsa.pub | sshpass -p$(cat hduser_pw) ssh -o StrictHostKeyChecking=no hduser@$y '\''cat >> .ssh/authorized_keys'\'' ; done '; done

これを行うより良い方法はありますか?本当にありがとうございました。

編集:ここに私のリビジョンがあります:

@janos と @likewhoa からのフィードバックを取り入れました --> UUOC をリダイレクトで処理し、各 IP でループし、変数を使用してシェル履歴から pwd を削除しました。どうもありがとうございました!

hduser_pw=$(< hduser_pw)
remote_ips=$(< remote_ips)

for x in $remote_ips; do
    echo "Create hduser_pw password file on node: ${x}"
    sshpass -p$hduser_pw scp -o StrictHostKeyChecking=no hduser_pw hduser@$x:~

    echo "chmod 600 hduser_pw on node: ${x}"
    sshpass -p$hduser_pw ssh -o StrictHostKeyChecking=no hduser@$x "chmod 600 hduser_pw"

    echo "Generate RSA keys for: ${x}"
    sshpass -p$hduser_pw ssh -o StrictHostKeyChecking=no hduser@$x "echo y | ssh-keygen -f ~/.ssh/id_rsa -t rsa -N \"\""

    echo "SCP the file remote_ips to node: ${x}"
    sshpass -p$hduser_pw scp -o StrictHostKeyChecking=no remote_ips hduser@$x:~
done

for x in $remote_ips; do 
    for y in $remote_ips; do
        echo "ssh-copy-id from node ${x} to node ${y}:"
        sshpass -p$hduser_pw ssh -o StrictHostKeyChecking=no hduser@$x "sshpass -p${hduser_pw} ssh-copy-id -i ~/.ssh/id_rsa.pub hduser@${y} -o StrictHostKeyChecking=no";
    done
done
4

2 に答える 2

0

まず UUOC から、CAT の代わりに while ループとリダイレクトを使用する必要があります。

すべてのステップを 1 つの大きな while ループにマージする次のステップでは、代わりにこれを使用してください。

while read ips; do sshpass -p$(<hduser_pw) ssh -o StrictHostKeyChecking=no hduser@$ips "echo $(<hduser_pw) > hduser_pw; chmod 600 hduser_pw"; sshpass -p$(<hduser_pw) ssh -o StrictHostKeyChecking=no hduser@$ips ssh-keygen -f ~/.ssh/id_rsa -t rsa -N \"\"";sshpass -p$(<hduser_pw) scp -o StrictHostKeyChecking=no remote_ips hduser@$ips:;done <remote_ips

手順 4 は自分で修正します。GL!

いくつかのポインタ。

  1. 行を読み進めるときに while ループを使用する
  2. ssh-keygen -f ~/.ssh/somekey を回避して「echo y | ssh-keygen ...'
  3. リダイレクトを使用 '

幸運を!おそらくこれは、ある種の構成管理ツールを使用してこれを自動化する場合に最適です。

于 2016-05-24T21:41:37.280 に答える