Автоматизировать настройку SSH для нового кластера Hadoop

Предполагалось, что это было сделано много раз, но я не смог найти четкого ответа, поэтому я обращаюсь к вашим специалистам за лучшим решением:

Цель: я настраиваю кластер Hadoop RHEL среднего размера и хочу автоматизировать настройку соединения SSH между всеми узлами. На первом узле у меня есть список всех IP-адресов в файле 'remote_ips', и у меня есть пароль hduser в файле 'hduser_pw' (chmod 600).

Шаг 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 в "author_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, удалил все pwds из истории оболочки с переменными и т. Д. Большое спасибо!

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

2 ответа

Решение

Вместо бега $(cat hduser_pw) а также $(cat remote_ips) Несколько раз было бы лучше запустить их только один раз, сохранить в переменных и использовать повторно. Например:

hduser_pw=$(cat hduser_pw)
remote_ips=$(cat remote_ips)

# Step 1) Create "hduser_pw" password file on each host
for x in $remote_ips; do
    sshpass -p$hduser_pw ssh -o StrictHostKeyChecking=no hduser@$x "echo $hduser_pw > hduser_pw; chmod 600 hduser_pw"
done

Можете ли вы определить проблему безопасности? echo $hduser_pw будет сохранен в истории оболочки, а также может быть виден в ps тиражи. Лучше избегать этого. Вместо этого:

ssh server "echo $hduser_pw > hduser_pw; chmod 600 hduser_pw"

Вы можете сделать так:

ssh server "cat > hduser_pw; chmod 600 hduser_pw" < hduser_pw

Это немного глупо и может сбить с толку. Более простой вариант - scp а потом ssh (для chmod):

scp hduser_pw server:
ssh server "chmod 600 hduser_pw"

Другие упрощения:

  • Вместо echo -e 'y' | ... Вы можете упростить до echo y | ...
  • Вместо грязного шага 4, посмотрите на ssh-copy-id если это доступно (обычно это в системах Linux)

Прежде всего, UUOC, вы действительно должны использовать цикл while и перенаправления вместо CAT.

Используйте это вместо следующих шагов, которые объединяют все шаги в один большой цикл 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. Использовать редирект '

Удачи! Возможно, это лучше, если вы используете какие-то инструменты управления конфигурацией, чтобы автоматизировать это и многое другое.

Другие вопросы по тегам