自动化新Hadoop集群的SSH配置



猜测这个问题已经做了很多次,但我找不到一个干净的答案,所以我呼吁您的专业知识提供更好的解决方案:

目标:我正在设置一个中等大小的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上循环,用变量从shell历史中删除任何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

不需要多次运行CCD_ 5和CCD_,最好只运行一次,并保存变量并重复使用。例如:

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 y | ...而不是echo -e 'y' | ...
  • 如果ssh-copy-id可用(通常在Linux系统中),请查看它,而不是混乱的步骤4

首先,您确实应该使用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. 使用重定向'

祝你好运!如果您使用某种配置管理工具来自动化这一点或更多,也许这是最好的。

相关内容

  • 没有找到相关文章

最新更新