【问题标题】:Automate SSH Configuration for new Hadoop cluster为新的 Hadoop 集群自动配置 SSH
【发布时间】:2016-05-25 07:26:23
【问题描述】:

猜测这已经做了很多次,但我找不到一个明确的答案,所以我呼吁您的专业知识寻求更好的解决方案:

目标:我正在建立一个中等规模的 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

【问题讨论】:

    标签: linux bash hadoop ssh sshpass


    【解决方案1】:

    而不是多次运行$(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 y | ...,而不是echo -e 'y' | ...
    • 如果可用,请查看ssh-copy-id(通常在 Linux 系统中),而不是凌乱的第 4 步。

    【讨论】:

    • 嗨@janos -- 非常感谢您的指导。我做了你所有的改变,效果很好。我在下面附上我修改后的脚本。
    【解决方案2】:

    首先关闭 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. 使用重定向'

    祝你好运!如果您使用某种配置管理工具来自动执行此操作以及更多操作,这可能是最好的。

    【讨论】:

    • 谢谢,@likewhoa - 我将尝试用重定向而不是 CAT 重写它以避免 UUOC。哲学变革!非常感谢...
    猜你喜欢
    • 2013-11-26
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多