现在我们有5台虚拟机,已经配置好了主机名和网络
我们的目标是通过Ansible实现自动化部署hadoop集群。在此之前,我们先编写一个shell脚本来配置hadoop集群的环境,包括安装软件、安装配置Ansible(一个主节点+四个工作节点)、实现节点间的免密访问、配置hdfs yarn zookeeper等角色分组,为后续自动化部署hadoop集群做准备。
#!/bin/bash
# 指定使用 Bash 作为脚本解释器
set -ueo pipefail
# 设置安全选项:
# -u: 未定义变量时报错
# -e: 命令执行失败时立即退出
# -o pipefail: 管道命令中任意失败视为整个管道失败
# 统一 echo 函数定义
echo() {
printf '%s\n' "$1" # 使用 printf 确保输出一致性
}
# 检查 root 权限
if [ "$(id -u)" -ne 0 ]; then
echo 'Please run as root!' # 非 root 用户提示
exit 127 # 返回错误代码
fi
# 安装必要软件包函数
install_packages() {
dnf install -y sshpass ansible tar vim open-vm-tools # 使用 dnf 安装关键工具
# 配置 Ansible 禁用主机密钥检查
if ! (grep -qF 'host_key_checking' /etc/ansible/ansible.cfg); then
cat << 'EOT' >> /etc/ansible/ansible.cfg
[defaults]
host_key_checking = False # 禁用 SSH 主机密钥验证
deprecation_warnings = False # 关闭弃用警告
EOT
fi
}
# 配置 Ansible 主机清单
install_inventory() {
cat << 'EOT' >> /etc/ansible/hosts
# Hadoop 集群分组配置
[NameNode]
hadoop1
hadoop2
[DataNode]
hadoop1-hadoop5(共5个节点)
[ZKFC] # Zookeeper 故障转移控制器
hadoop1
hadoop2
# 其他组配置(JournalNode/NodeManager/ResourceManager/ZooKeeper)...
EOT
}
# 配置主机名解析
install_hosts() {
cat << 'EOT' >> /etc/hosts
# Hadoop 集群 IP 映射
192.168.30.121 hadoop1
192.168.30.122 hadoop2
...(共5个节点)
EOT
}
# 配置 SSH 免密登录
install_root_ssh_key() {
ssh-keygen -t rsa -N '' -f /root/.ssh/id_rsa # 生成 RSA 密钥对
# 为所有节点配置免密登录
for i in {1..5}; do
sshpass -p 'hadoop' ssh-copy-id -o StrictHostKeyChecking=no root@hadoop$i
done
}
# 主执行流程
install_packages # 1. 安装软件
install_inventory # 2. 配置 Ansible
install_hosts # 3. 设置主机映射
install_root_ssh_key # 4. 配置 SSH 免密