本文主要参考:Linux快速配置集群ssh互信
在对多个Linux主机进行管理,特别是如大规模数据库集群进行管理时,有必要同时向集群中的每个主机发送命令。当主机数量特别多的时候,一个一个来执行还是很麻烦的,所以有必要通过脚本来执行。本文就分享了这样的脚本。当然,针对这一场景,更强大的工具是ansible,具体可参考:ansible服务部署与使用
关于Linux建立多主机互信,可参考之前的博客:Centos系统下建立多机互信
配置节点1的/etc/hosts文件及环境变量
节点1编辑/etc/hosts文件,添加集群所有主机的IP地址和其对应的主机名:
192.168.56.102 node1
192.168.56.103 node2
配置节点1的环境变量:
vi ~/.bash_profile
export NODE_LIST='node1 node2'
source ~/.bash_profile
集群拷贝脚本与命令集中发送脚本
脚本1:用来集群间同步拷贝文件cluster_copy_all_nodes
#!/bin/bash
SELF=`hostname`
if [ -z "$NODE_LIST" ]; then
echo
echo Error: NODE_LIST environment variable must be set in .bash_profile
exit 1
fi
for i in $NODE_LIST; do
if [ ! $i = $SELF ]; then
if [ $1 = "-r" ]; then
scp -oStrictHostKeyChecking=no -r $2 $i:$3
else
scp -oStrictHostKeyChecking=no $1 $i:$2
fi
fi
done
wait
脚本2:用来集群间同步运行命令cluster_run_all_nodes
#!/bin/bash
if [ -z "$NODE_LIST" ]; then
echo
echo Error: NODE_LIST environment variable must be set in .bash_profile
exit 1
fi
if [[ $1 = '--background' ]]; then
shift
for i in $NODE_LIST; do
ssh -oStrictHostKeyChecking=no -n $i "$@" &
done
else
for i in $NODE_LIST; do
ssh -oStrictHostKeyChecking=no $i "$@"
done
fi
wait
配置整个集群间的ssh互信
1.在各节点通过ssh-keygen生成RSA密钥和公钥
cluster_run_all_nodes "hostname; ssh-keygen -q -t rsa -N \"\" -f ~/.ssh/id_rsa"
根据提示输入各主机密码。
2.将所有的公钥文件汇总到一个总的授权key文件中
在192.168.56.102执行汇总:
编辑脚本内容:
IP_NET="192.168.56."
for((i=102;i<=103;i++))
do
ssh $IP_NET$i cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
echo Summarize ssh info from $IP_NET$i into a single file.
done
注意:IP_NET是定义网段的变量,for循环包含了整个集群的IP范围,根据实际情况修改。
执行上面的这个脚本后,可以实现将所有的公钥文件汇总到node1。
3.将这个包含了所有互信机器认证key的认证文件,分发到各个机器中去
cluster_copy_all_nodes ~/.ssh/authorized_keys ~/.ssh/
根据提示输入各个主机的密码。自此,集群主机互信建立完成
验证ssh互信
节点1运行,都不输入密码返回主机名和时间即可:
cluster_run_all_nodes "hostname;date"
补充:
但为了更加灵活的再其他节点也可以用到我们自定义的脚本,我们还可以做以下工作:
同步拷贝节点1的配置文件到其他节点:
cluster_copy_all_nodes ~/.bash_profile ~/
cluster_copy_all_nodes /etc/hosts /etc
cluster_copy_all_nodes /usr/local/bin/cluster_copy_all_nodes /usr/local/bin/
cluster_copy_all_nodes /usr/local/bin/cluster_run_all_nodes /usr/local/bin/
这时任意登录其他节点,也可以使用cluster_run_all_nodes验证ssh互信了。