为新的 Hadoop 集群自动配置 SSH
Automate SSH Configuration for new Hadoop cluster
猜测这个已经做过很多次了,但是我找不到一个干净的答案,所以我呼吁你的专业知识以获得更好的解决方案:
Objective: 我正在设置一个中等规模的 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 public 密钥复制到每个其他节点中的 "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 历史记录中删除了任何密码,等等。非常感谢!
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
而不是 运行 宁 $(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' | ...
- 而不是混乱的第 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!
几点建议。
- 阅读行时使用 while 循环
- ssh-keygen -f ~/.ssh/somekey 避免 'echo y | ssh-keygen ...'
- 使用重定向'
祝你好运!如果您使用某种配置管理工具来自动执行此操作和更多操作,也许这是最好的。
猜测这个已经做过很多次了,但是我找不到一个干净的答案,所以我呼吁你的专业知识以获得更好的解决方案:
Objective: 我正在设置一个中等规模的 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 public 密钥复制到每个其他节点中的 "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 历史记录中删除了任何密码,等等。非常感谢!
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
而不是 运行 宁 $(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 | ...
而不是 - 而不是混乱的第 4 步,查看
ssh-copy-id
是否可用(通常在 Linux 系统中)
echo -e 'y' | ...
首先关闭 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!
几点建议。
- 阅读行时使用 while 循环
- ssh-keygen -f ~/.ssh/somekey 避免 'echo y | ssh-keygen ...'
- 使用重定向'
祝你好运!如果您使用某种配置管理工具来自动执行此操作和更多操作,也许这是最好的。