为新的hadoop集群自动化ssh配置

ugmeyewa  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(387)

我猜这已经做了很多次了,但我找不到一个明确的答案,所以我呼吁您提供更好的解决方案:
目标:我正在建立一个中等规模的rhelhadoop集群,并希望自动配置所有节点之间的ssh连接。在第一个节点上,我在文件“remote\u ips”中有一个所有ip的列表,在文件“hduser\u pw”(chmod 600)中有hduser密码。
步骤1)在每个主机上创建“hduser\u 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\u 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\u 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
r55awzrz

r55awzrz1#

而不是跑步 $(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 将保存在shell历史记录中,也可能在中可见 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系统中)

pkln4tw6

pkln4tw62#

首先,您真的应该使用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

我让你自己来修第四步。德国劳埃德!
几点提示。
在阅读行时使用while循环
ssh keygen-f~/.ssh/somekey避免“echo y | ssh keygen…”
使用重定向'
祝你好运!如果您使用某种配置管理工具来自动化这一点或更多,这可能是最好的。

相关问题