分享

集群批量配置多(台PC机)节点的ssh无密码互通

hyj 发表于 2014-4-29 19:20:01 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 4 20880
问题导读:
1.为什么编写脚本脚本来实现密码互通?
2.如何编写脚本来实现多节点互通?






在搭建集群的过程中,面对大量的集群,如果我们每台部署,每天都进行配置,那么我们的任务量是非常大。方法有两种
1.使用工具
2.编写shell脚本。
这里采用的是脚本的方式。

简单介绍:
SSH无密码互通原理很简单,假设现在有两台服务器A和B,服务器A要访问服务器B。两台服务器都有用户hadoop,先登录到A机器上来
机器A执行ssh-keygen -t rsa,之后会生成id_rsa文件和id_rsa.pub文件。然后将A生成的id_rsa.pub文件重命名(避免覆盖)后拷贝到B机器上的/home/hadoop/.ssh/目录下:
拷贝命令:scp id_rsa.pub B:/home/hadoop/.ssh/id_rsa.pub.A
然后,将id_rsa.pub.A文件内容追加到B机器上的/home/hadoop/.ssh/
目录下的authorized_keys文件中:
追加命令:cat id_rsa.pub.A >> authorized_keys
这样就可以有机器A无密码直接登录机器B了,如果想从机器B无密码
登录到机器A,则需将B机器公钥信息(id_rsa.pub)追加到A机器中的
authorized_keys文件中。这样就可以实现A、B机器的无密码互访了。

SSH脚本编写:
当需要配置的机器有很多台时,可以使用脚本批量完成配置:
下面的脚本必须满足三个条件才能执行:
1)必须在节点列表{node001, node002, node003}中的一个节点运行
2)必须使用root账户运行脚本
3)nodexxx各节点的/etc/hosts中必须包含如下信息:
    10.0.0.8    node001
    10.0.0.9    node002
    10.0.0.10   node003

#!/bin/bash
node=(node001 node002 node003)  # hostname for each node
username=hadoop                        # username to be interconnected
homename=$username                # home dir, i.e. home/zhangyang
if [ "$username" = "root" ];
then
        homename=root
else
        homename=home/$username
fi


for((i=0; i<${#node}; i++))
do
        ssh $username@${node} 'ssh-keygen -t rsa; chmod 755 ~/.ssh'
done
#cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys


echo "batch authorized_keys created..."
echo "start scp..."


#scp node003:/$homename/.ssh/authorized_keys /$homename/.ssh/node003.key
for((i=0; i<${#node}; i++))
do
        scp ${node}:/$homename/.ssh/id_rsa.pub /$homename/.ssh/${node}.key
        echo "scp from ${node} finished..."
done


echo "append key to authorized_keys..."
for((i=0; i<${#node}; i++))
do
        cat /$homename/.ssh/${node}.key >> /$homename/.ssh/authorized_keys
        echo "append ${node}.key finished..."
done


echo "append all key finished..."
loop=${#node}
let subloop=loop-1
echo "starting scp complete authorized_keys to ${node[1]}~${node[subloop]}"
for((i=1; i<${#node}; i++))
do
        scp /$homename/.ssh/authorized_keys ${node}:/$homename/.ssh/authorized_keys
        echo "scp to ${node} finished..."
done
echo "scp all nodes finished..."


# delete intermediate files
rm -rf /$homename/.ssh/*.key
echo "all configuration finished..."

已有(4)人评论

跳转到指定楼层
junzi234 发表于 2014-6-12 09:50:40
mark 留着备用
回复

使用道具 举报

天宇 发表于 2014-6-26 10:43:35
问你一个问题,上面的第一个for循环是不是有问题?
for((i=0; i<${#node}; i++))
do
       ssh $username@${node} 'ssh-keygen -t rsa; chmod 755 ~/.ssh'
done

ssh还没配好怎么能用ssh远程登陆到远程节点啊?,这样执行的话一直都只在第一个节点运行啊
回复

使用道具 举报

howtodown 发表于 2014-6-26 13:00:20
天宇 发表于 2014-6-26 10:43
问你一个问题,上面的第一个for循环是不是有问题?
for((i=0; i
这个是代码,需要配置好ssh,如果配置不好,肯定不成立的。里面的内容,可能不会拿过来直接就能用的,而是根据自己的环境,对里面的参数调整
回复

使用道具 举报

天宇 发表于 2014-6-30 09:52:31
howtodown 发表于 2014-6-26 13:00
这个是代码,需要配置好ssh,如果配置不好,肯定不成立的。里面的内容,可能不会拿过来直接就能用的,而是 ...

已经发现问题,并解决!thank u!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条