現在我們有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 ]; thenecho '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); thencat << 'EOT' >> /etc/ansible/ansible.cfg
[defaults]
host_key_checking = False ?# 禁用 SSH 主機密鑰驗證
deprecation_warnings = False ?# 關閉棄用警告
EOTfi
}# 配置 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}; dosshpass -p 'hadoop' ssh-copy-id -o StrictHostKeyChecking=no root@hadoop$idone
}# 主執行流程
install_packages ? ? # 1. 安裝軟件
install_inventory ? ?# 2. 配置 Ansible
install_hosts ? ? ? ?# 3. 設置主機映射
install_root_ssh_key # 4. 配置 SSH 免密