基于CentOS8的Shell脚本自动化搭建集群环境

实验概述

  • 目的:通过一个名为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生成。
    • 脚本完成后,建议重启系统以确保所有配置生效。
  • 依赖环境:在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.1192.168.142.2等标准IP。
  • 脚本健壮性
    • 在运行前,备份重要文件(如脚本已自动备份网络配置)。
    • 如果节点数变化,更新TOTAL_NODES变量。
    • SSH免密登录只配置了当前节点自身,要实现跨节点免密,需手动将每个节点的公钥(/home/hadoop/.ssh/id_rsa.pub)追加到所有节点的authorized_keys文件中。
  • 安全建议
    • Hadoop用户密码HADOOP_PASS在脚本中明文存储,生产环境应使用加密方式。
    • 确保防火墙开放必要端口(如SSH的22端口)。
  • 错误处理:如果脚本报错(如网络服务重启失败),检查日志或使用journalctl -xe诊断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值