实验概述
- 目的:通过一个名为
setup_cluster.sh的Shell脚本,自动化配置集群节点(如node1、node2、node3),实现主机名修改、IP地址固定、hosts文件同步、hadoop用户创建和SSH免密登录。 - 关键点:
- 脚本需要以root身份运行,并接受节点序号作为参数(例如,
sudo ./setup_cluster.sh 1为node1)。 - 集群总节点数由变量
TOTAL_NODES定义(默认为3),IP地址基于前缀192.168.142.128生成。 - 脚本完成后,建议重启系统以确保所有配置生效。
- 脚本需要以root身份运行,并接受节点序号作为参数(例如,
- 依赖环境:在Linux系统(如CentOS或Ubuntu)上运行,网络接口为
ens160(如果系统不同,需调整NETWORK_CARD变量)。
2. 创建脚本并赋予权限
在开始前,确保您已登录到目标虚拟机(如node1)。打开终端,执行以下步骤:
1.我们需要创建一个名为 setup_cluster.sh 的脚本文件,并赋予执行权限:
touch setup_cluster.sh
chmod +x setup_cluster.sh

2.编写脚本内容,实现自动化搭建:
#!/bin/bash
NETWORK_CARD="ens160"
GATEWAY="192.168.142.2"
DNS1="8.8.8.8"
DNS2="114.114.114.114"
NETMASK="255.255.255.0"
BASE_IP_PREFIX="192.168.142.128"
TOTAL_NODES=3 # 总节点数
HADOOP_PASS="123456789" # Hadoop 用户密码
# 检查是否以 root 身份运行
if [ "$(id -u)" -ne 0 ]; then
echo "错误:此脚本必须以 root 身份运行。请使用 sudo ./setup_cluster.sh [节点序号]"
exit 1
fi
# 检查是否提供了节点序号参数
if [ -z "$1" ]; then
echo "错误:请提供节点序号。"
echo "用法:sudo ./setup_cluster.sh [序号]"
echo "示例:在 node1 上运行 'sudo ./setup_cluster.sh 1',在 node2 上运行 'sudo ./setup_cluster.sh 2'"
exit 1
fi
NODE_NUM=$1
HOSTNAME="node$NODE_NUM"
IP_ADDR="${BASE_IP_PREFIX}${NODE_NUM}"
# 检查节点序号是否在有效范围内
if [ "$NODE_NUM" -lt 1 ] || [ "$NODE_NUM" -gt "$TOTAL_NODES" ]; then
echo "错误:节点序号 $NODE_NUM 无效。集群规划的节点序号范围是 1 到 $TOTAL_NODES。"
exit 1
fi
echo "======================================================"
echo " 开始配置节点: $HOSTNAME ($IP_ADDR) "
echo "======================================================"
# --- 1. 修改主机名 ---
echo "→ 正在设置主机名..."
hostnamectl set-hostname $HOSTNAME
echo " 主机名已设置为: $HOSTNAME"
# --- 2. 配置固定 IP 地址 ---
echo "→ 正在配置静态 IP 地址..."
NET_CONF="/etc/sysconfig/network-scripts/ifcfg-$NETWORK_CARD"
# 备份原始配置文件(如果备份不存在)
if [ ! -f "${NET_CONF}.backup" ]; then
cp "$NET_CONF" "${NET_CONF}.backup"
echo " 已备份原始网络配置到: ${NET_CONF}.backup"
fi
# 生成新的网络配置文件
cat > "$NET_CONF" << EOF
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=$NETWORK_CARD
DEVICE=$NETWORK_CARD
ONBOOT=yes
IPADDR=$IP_ADDR
NETMASK=$NETMASK
GATEWAY=$GATEWAY
DNS1=$DNS1
DNS2=$DNS2
EOF
echo " 已生成新的网卡配置文件: $NET_CONF"
# 重启网络服务以使配置生效
echo " 正在重启网络服务..."
systemctl restart NetworkManager
echo " 网络服务重启完成。"
# --- 3. 配置 /etc/hosts 文件 ---
echo "→ 正在更新 /etc/hosts 文件..."
# 先删除所有旧的 node 映射,避免重复
sed -i '/node[0-9]/d' /etc/hosts
# 写入所有节点的映射
for ((i=1; i<=$TOTAL_NODES; i++)); do
echo "${BASE_IP_PREFIX}${i} node${i}" >> /etc/hosts
done
echo " /etc/hosts 文件已更新,内容如下:"
grep "node" /etc/hosts
# --- 4. 创建和配置 hadoop 用户 (如果不存在) ---
echo "→ 正在配置 hadoop 用户..."
if ! id "hadoop" &>/dev/null; then
useradd hadoop
echo "$HADOOP_PASS" | passwd --stdin hadoop
echo " hadoop 用户已创建,密码已设置。"
else
echo " hadoop 用户已存在,跳过创建。"
fi
# --- 5. 为 hadoop 用户配置 SSH 免密登录 (针对自身) ---
echo "→ 正在为 hadoop 用户配置 SSH 密钥..."
HADOOP_HOME="/home/hadoop"
SSH_DIR="${HADOOP_HOME}/.ssh"
AUTH_KEYS="${SSH_DIR}/authorized_keys"
# 切换到 hadoop 用户执行 SSH 操作
su - hadoop -c "
# 创建 .ssh 目录
if [ ! -d \"$SSH_DIR\" ]; then
mkdir -p \"$SSH_DIR\"
chmod 700 \"$SSH_DIR\"
fi
# 如果私钥不存在,则生成
if [ ! -f \"${SSH_DIR}/id_rsa\" ]; then
ssh-keygen -t rsa -P '' -f \"${SSH_DIR}/id_rsa\"
echo \" hadoop 用户的 SSH 密钥对已生成。\"
else
echo \" hadoop 用户的 SSH 密钥对已存在,跳过生成。\"
fi
# 将公钥追加到 authorized_keys 并设置权限
cat \"${SSH_DIR}/id_rsa.pub\" >> \"$AUTH_KEYS\"
chmod 600 \"$AUTH_KEYS\"
echo \" 公钥已添加到 authorized_keys,完成自免密配置。\"
"
echo ""
echo "======================================================"
echo " 节点 $HOSTNAME 配置成功! "
echo "======================================================"
echo "请重启系统或执行 'reboot' 以确保所有配置完全生效。"
echo "======================================================"



3.运行脚本:
sudo /root/setup_cluster.sh 1

4.检查配置是否完成:
hostname #验证主机名是否正常
ip addr show ens160 #验证IP地址配置
ping -c 4 baidu.com #测试网络连通性
随后在其他虚拟机进行同样操作即可
在两台虚拟机的运行命令有差异:
sudo /root/setup_cluster.sh 2 #node2
sudo /root/setup_cluster.sh 3 #node3
.
5. 常见问题与注意事项
- IP地址格式问题:脚本中
IP_ADDR="${BASE_IP_PREFIX}${NODE_NUM}"会导致IP如192.168.142.1281,这可能无效。建议修改脚本:- 将
BASE_IP_PREFIX="192.168.142.128"改为BASE_IP_PREFIX="192.168.142."。 - 然后
IP_ADDR="${BASE_IP_PREFIX}${NODE_NUM}"会生成192.168.142.1、192.168.142.2等标准IP。
- 将
- 脚本健壮性:
- 在运行前,备份重要文件(如脚本已自动备份网络配置)。
- 如果节点数变化,更新
TOTAL_NODES变量。 - SSH免密登录只配置了当前节点自身,要实现跨节点免密,需手动将每个节点的公钥(
/home/hadoop/.ssh/id_rsa.pub)追加到所有节点的authorized_keys文件中。
- 安全建议:
- Hadoop用户密码
HADOOP_PASS在脚本中明文存储,生产环境应使用加密方式。 - 确保防火墙开放必要端口(如SSH的22端口)。
- Hadoop用户密码
- 错误处理:如果脚本报错(如网络服务重启失败),检查日志或使用
journalctl -xe诊断。

3879

被折叠的 条评论
为什么被折叠?



