- 使用vagrant 创建三台虚拟机
VagrantFile如下
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "generic/rocky8"
# 配置所有节点共享的主机名解析(使用新IP段)
hosts_entries = <<-HOSTS
192.168.0.101 vm1
192.168.0.102 vm2
192.168.0.103 vm3
HOSTS
(1..3).each do |i|
config.vm.define "vm#{i}" do |node|
# 设置主机名(永久生效)
node.vm.hostname = "vm#{i}"
# 关键修改:配置桥接网络(使用宿主机物理网卡)
node.vm.network "public_network",
ip: "192.168.0.#{100+i}", # 使用宿主机同网段IP(101-103)
bridge: "enp8s0", # 需替换为宿主机的实际网卡名
auto_config: true
# 禁用默认共享文件夹(保持原配置)
node.vm.synced_folder ".", "/vagrant", disabled: true
# VirtualBox提供程序配置
node.vm.provider "virtualbox" do |vb|
vb.name = "vm#{i}"
vb.cpus = 2
vb.memory = 8192
# 启用GUI调试(可选)
vb.gui = false
vb.customize ["createhd", "--filename", "disk-#{i}.vdi", "--size", 400 * 1024]
vb.customize ["storageattach", :id, "--storagectl", "SATA Controller", "--port", 1, "--device", 0, "--type", "hdd", "--medium", "disk-#{i}.vdi"]
end
# 主机名解析配置(更新为桥接网络IP)
node.vm.provision "shell", inline: <<-SHELL
# 永久设置主机名[9,10](@ref)
sudo hostnamectl set-hostname vm#{i} --static
# 更新/etc/hosts(包含所有节点)
echo -e "#{hosts_entries}" | sudo tee -a /etc/hosts
# 永久关闭 SELinux
sudo sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
sudo setenforce 0
# 禁用防火墙(测试环境推荐)[7](@ref)
sudo systemctl stop firewalld
sudo systemctl disable firewalld
SHELL
end
end
end
这里使用的是Rocky Linux 8,官方文档里面明确写了支持的
启动虚拟机
执行vagrant up
等待虚拟机创建起来配置root密码,并且运行root用户ssh登录
在宿主机执行
vagrant ssh vm1
-- 设置密码
sudo passwd root
-- 允许 root 登录
sudo vi /etc/ssh/sshd_config
# 找到下面的配置
PermitRootLogin yes# 允许 root 登录
PasswordAuthentication yes# 启用密码认证
sudo systemctl restart sshd
vm2和vm3使用同样的方式操作
- 扩展磁盘容量
使用root用户登录vm1,vm2,vm3
执行
-- 初始化磁盘为物理卷(PV)
sudo pvcreate /dev/sdb
-- 扩展卷组(VG)
vgextend rl_rocky8 /dev/sdb
-- 扩展逻辑卷(LV)
lvextend -l +100%FREE /dev/rl_rocky8/root
-- 调整文件系统
xfs_growfs /
-- 验证
df -h /
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rl_rocky8-root 525G 11G 514G 9% /
- root用户登录vm1,下载ambari 和bigtop相关的依赖,并创建本地repo
执行:
dnf install createrepo
sudo mkdir -p /var/www/html/ambari-repo
sudo chmod -R 755 /var/www/html/ambari-repo
cd /var/www/html/ambari-repo
wget -r -np -nH --cut-dirs=4 --reject 'index.html*' https://www.apache-ambari.com/dist/ambari/3.0.0/rocky8/
wget -r -np -nH --cut-dirs=4 --reject 'index.html*' https://www.apache-ambari.com/dist/bigtop/3.3.0/rocky8/
--创建repository metadata
cd /var/www/html/ambari-repo
sudo createrepo .
-- 安装httpd服务
dnf install httpd -y
chown -R apache:apache /var/www/html/ambari-repo
chmod -R 755 /var/www/html/ambari-repo
systemctl restart httpd
systemctl enable httpd
-- 创建repo配置
vim /etc/yum.repos.d/ambari.repo
[ambari]
name=Ambari Repository
baseurl=http://IP/ambari-repo/ambari
enabled=1
gpgcheck=0
[bigtop]
name=Bigtop Repository
baseurl=http://IP/ambari-repo/bigtop
enabled=1
gpgcheck=0
- 其他一些准备操作
禁用系统默认的mysql模块dnf module disable mysql
启用 EPEL 并刷新缓存
dnf install epel-release -y
dnf config-manager --set-enabled epel
dnf config-manager --set-enabled devel
dnf clean all
dnf makecache
- 免密登录配置
root登录vm1,执行
ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519
ssh-copy-id vm1
ssh-copy-id vm2
ssh-copy-id vm3
- 安装ansible
sudo dnf install ansible-core -y
ansible-galaxy collection install community.mysql
- 添加自动部署文件
mkdir /opt/ambari-deploy
cd /opt/ambari-deploy
vi inventory.ini
-- 内容如下
[ambari-server]
vm1
[ambari-agent]
vm1
vm2
vm3
-- 添加playbook.yml
vim playbook.yml
-- 内容如下
---
- name: Setup Ambari Agent
hosts: all
become: true
tasks:
- name: Disable and stop firewalld
ansible.builtin.service:
name: firewalld
state: stopped
enabled: false
- name: Install Ambari Agent
ansible.builtin.dnf:
name:
- http://192.168.0.101/ambari-repo/ambari/ambari/ambari-agent-3.0.0.0-0.x86_64.rpm
- python3-distro
- java-17-openjdk-devel
- java-1.8.0-openjdk-devel
state: present
disable_gpg_check: true
- name: Setup Ambari Server
hosts: ambari-server
vars:
mysql_root_password: "MyNewPass4!"
mysql_ambari_password: "AmbariPass4!"
mysql_hive_password: "HivePass4!"
mysql_ranger_password: "RangerPass4!"
mysql_rangerkms_password: "RangerKMSPass4!"
mysql_data_dir: /var/lib/mysql
mysql_pid_dir: /var/run/mysqld
mysql_log_path: /var/log/mysqld.log
become: true
tasks:
- name: Disable and stop firewalld
ansible.builtin.service:
name: firewalld
state: stopped
enabled: false
- name: Install Ambari Server
ansible.builtin.dnf:
name:
- http://192.168.0.101/ambari-repo/ambari/ambari/ambari-server-3.0.0.0-0.x86_64.rpm
- python3-psycopg2
- python3-PyMySQL
- https://mirrors.ustc.edu.cn/mysql-repo/mysql80-community-release-el8.rpm
state: present
disable_gpg_check: true
- name: Install MySQL community server
ansible.builtin.dnf:
name: mysql-community-server
state: present
disable_gpg_check: true
- name: Make sure MySQL directories exist
ansible.builtin.file:
path: "{{ item }}"
owner: mysql
group: mysql
recurse: true
state: directory
loop:
- "{{ mysql_pid_dir }}"
- "{{ mysql_data_dir }}"
- name: Make sure MySQL log file exists
ansible.builtin.file:
path: "{{ mysql_log_path }}"
owner: mysql
group: mysql
state: touch
- name: Initialize MySQL datadir
ansible.builtin.shell:
cmd: "mysqld --initialize-insecure --user=mysql"
creates: "/var/lib/mysql/mysql"
- name: Start and enable MySQL service
ansible.builtin.systemd:
name: mysqld
state: started
enabled: true
- name: Set MySQL root password
community.mysql.mysql_user:
name: root
plugin: caching_sha2_password
plugin_auth_string: "{{ mysql_root_password }}"
password_expire: never
- name: Create user 'ambari'@'localhost'
community.mysql.mysql_user:
login_user: root
login_password: "{{ mysql_root_password }}"
name: ambari
plugin: caching_sha2_password
plugin_auth_string: "{{ mysql_ambari_password }}"
host: "localhost"
priv: "*.*:ALL"
- name: Create user 'ambari'@'%'
community.mysql.mysql_user:
login_user: root
login_password: "{{ mysql_root_password }}"
name: ambari
plugin: caching_sha2_password
plugin_auth_string: "{{ mysql_ambari_password }}"
host: "%"
priv: "*.*:ALL"
- name: Create Ambari database
community.mysql.mysql_db:
login_user: root
login_password: "{{ mysql_root_password }}"
name:
- ambari
- hive
- ranger
- rangerkms
state: present
- name: Create user 'hive'@'%'
community.mysql.mysql_user:
login_user: root
login_password: "{{ mysql_root_password }}"
name: hive
plugin: caching_sha2_password
plugin_auth_string: "{{ mysql_hive_password }}"
host: "%"
priv: "hive.*:ALL"
- name: Create user 'ranger'@'%'
community.mysql.mysql_user:
login_user: root
login_password: "{{ mysql_root_password }}"
name: ranger
plugin: caching_sha2_password
plugin_auth_string: "{{ mysql_ranger_password }}"
host: "%"
priv: "*.*:ALL,GRANT"
- name: Create user 'rangerkms'@'%'
community.mysql.mysql_user:
login_user: root
login_password: "{{ mysql_root_password }}"
name: rangerkms
plugin: caching_sha2_password
plugin_auth_string: "{{ mysql_rangerkms_password }}"
host: "%"
priv: "rangerkms.*:ALL"
- name: Init ambari database
community.mysql.mysql_db:
login_user: ambari
login_password: "{{ mysql_ambari_password }}"
state: import
name: ambari
target: /var/lib/ambari-server/resources/Ambari-DDL-MySQL-CREATE.sql
- name: Install mysql-connector-j
ansible.builtin.dnf:
name: mysql-connector-j
state: present
disable_gpg_check: true
- name: Setup JDBC driver
ansible.builtin.shell: ambari-server setup --jdbc-db=mysql --jdbc-driver=/usr/share/java/mysql-connector-java.jar
- name: Configure MySQL 8 compatibility
ansible.builtin.lineinfile:
path: /etc/ambari-server/conf/ambari.properties
regexp: ^server\.jdbc\.url=
line: server.jdbc.url=jdbc:mysql://localhost:3306/ambari?useSSL=true&verifyServerCertificate=false&enabledTLSProtocols=TLSv1.2
- name: Configure Ambari server
ansible.builtin.shell: >
ambari-server setup -s \
-j /usr/lib/jvm/java-1.8.0-openjdk \
--ambari-java-home /usr/lib/jvm/java-17-openjdk \
--database=mysql \
--databasehost=localhost \
--databaseport=3306 \
--databasename=ambari \
--databaseusername=ambari \
--databasepassword={{ mysql_ambari_password }}
- name: Add systemd wrapper for ambari-server
copy:
dest: /etc/systemd/system/ambari-server.service
content: |
[Unit]
Description=Ambari Server Compatibility Wrapper
After=network.target
[Service]
Type=forking
ExecStart=/etc/init.d/ambari-server start
ExecStop=/etc/init.d/ambari-server stop
ExecReload=/etc/init.d/ambari-server restart
PIDFile=/var/run/ambari-server/ambari-server.pid
[Install]
WantedBy=multi-user.target
- name: Enable and start Ambari Server
ansible.builtin.service:
name: ambari-server
state: started
enabled: true
daemon_reload: true
- name: Setup Ambari Agent
hosts: all
become: true
tasks:
- name: Edit ambari-agent configuration
ansible.builtin.lineinfile:
path: /etc/ambari-agent/conf/ambari-agent.ini
regexp: '^hostname='
line: hostname={{ groups['ambari-server'][0] }}
- name: Add systemd wrapper for ambari-agent
copy:
dest: /etc/systemd/system/ambari-agent.service
content: |
[Unit]
Description=Ambari Agent Compatibility Wrapper
After=network.target
[Service]
Type=forking
ExecStart=/etc/init.d/ambari-agent start
ExecStop=/etc/init.d/ambari-agent stop
ExecReload=/etc/init.d/ambari-agent restart
PIDFile=/var/run/ambari-agent/ambari-agent.pid
[Install]
WantedBy=multi-user.target
- name: Enable and start Ambari Agent
ansible.builtin.service:
name: ambari-agent
state: started
enabled: true
daemon_reload: true
- 执行一键安装
ansible-playbook -i inventory.ini playbook.yml
等安装完毕之后,访问
http://IP:8080 用户名和密码都是admin初始化服务,可以先只安装HDFS,zookeeper,metrics这几个服务
如果出现服务启动异常,可以检查一下/etc/hosts中是否有127.0.1.1 vm1这样的配置,要去掉,三台虚拟机都需要检查一下,然后重启服务
如果安装router失败,报# Fail: The package hadoop-hdfs-dfsrouter is not supported by this version of the stack-select tool
则vi /usr/lib/bigtop-select/distro-select
在"leaves"中添加 "hadoop-hdfs-dfsrouter": "hadoop-hdfs",如果都没问题了,接下来可以在界面继续添加其他需要的服务了,可能会遇到问题,可以请求ai的帮助,都能解决