适用于3.0.0-el8一键卸载
场景说明
本指南介绍如何通过一键卸载脚本,安全、批量清理 Ambari 及相关依赖,适合环境重置、集群重装或测试回收等需求。脚本支持多节点并发操作,确保卸载无残留。
# 支持范围
类别 | 说明 |
---|---|
操作系统 | Rocky Linux 8.10 / CentOS 8 及兼容环境 |
卸载内容 | Ambari Server/Agent、MariaDB、JDK、MySQL Connector、Nginx、本地 YUM 源、典型大数据组件残留 |
适用场景 | 建议结合本站 ONEKEY 安装方案,配合原始 hosts.txt 文件实现批量卸载 |
# 卸载脚本完整内容 必读
注意
下方为【完整一键卸载脚本】,务必结合 hosts.txt 配置整体复制后执行。如需定制仅需调整注释内容,强烈建议通读脚本说明。
点击展开查看完整脚本(推荐收起/展开)
#!/bin/bash
# 版权所有 (c) JaneTTR 2025
# 项目名称:ambari-env
#
# 本文件属于付费部分代码,仅供个人学习和研究使用。
#
# 禁止行为:
# 1. 未经授权,不得将本文件或其编译后的代码用于任何商业用途;
# 2. 禁止重新分发本文件或其修改版本;
# 3. 禁止通过反编译、反向工程等手段试图绕过授权验证。
#
# 商业授权:
# 如需将本文件或其编译后的代码用于商业用途,必须获得版权所有者的书面授权。
# 联系方式:
# 邮箱:3832514048@qq.com
#
# 责任声明:
# 本文件按“现状”提供,不附带任何形式的担保,包括但不限于适销性、特定用途适用性或无侵权的担保。
#
# 如有任何疑问,请联系版权所有者。
set -e
# set -x # 如需调试,请取消注释此行
# 日志文件
LOGFILE="script_debug.log"
exec > >(tee -a "$LOGFILE") 2>&1
# 本地日志函数
log_info() {
echo "$(date '+%Y-%m-%d %H:%M:%S') [Info] $*"
}
log_error() {
echo "$(date '+%Y-%m-%d %H:%M:%S') [Error] $*" >&2
}
# 主机信息文件(当前目录下),格式:用户名 密码 ip
HOSTS_FILE="./hosts.txt"
if [ ! -f "$HOSTS_FILE" ]; then
log_error "未找到主机文件 $HOSTS_FILE,请确认文件存在于当前目录。"
exit 1
fi
############################################
# 检查并安装 sshpass
############################################
check_install_sshpass() {
if ! command -v sshpass &>/dev/null; then
log_info "sshpass 未安装,开始安装..."
if command -v yum &>/dev/null; then
sudo yum install -y epel-release sshpass || { log_error "安装 sshpass 失败"; exit 1; }
elif command -v apt &>/dev/null; then
sudo apt update && sudo apt install -y sshpass || { log_error "安装 sshpass 失败"; exit 1; }
else
log_error "未找到支持的包管理器,请手动安装 sshpass."
exit 1
fi
fi
}
############################################
# 测试 SSH 连接是否可用
############################################
check_ssh_connection() {
local user="$1" ip="$2" password="$3"
sshpass -p "$password" ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout=5 "$user@$ip" "exit" &>/dev/null
if [ $? -ne 0 ]; then
log_error "连接主机 $ip (user: $user) 失败."
return 1
fi
log_info "成功连接主机 $ip (user: $user)."
return 0
}
############################################
# 远程停止服务及卸载软件包
############################################
remote_stop_services() {
local user="$1" ip="$2" password="$3"
sshpass -p "$password" ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null "$user@$ip" bash -s <<'EOF'
# 远程日志函数
rlog_info() {
echo "$(date '+%Y-%m-%d %H:%M:%S') [Info] $*"
}
rlog_error() {
echo "$(date '+%Y-%m-%d %H:%M:%S') [Error] $*" >&2
}
# 检查命令是否存在
command_exists() {
command -v "$1" >/dev/null 2>&1
}
# 封装停止进程的函数,参数:描述、获取 PID 的命令
stop_processes() {
local description="$1"
local cmd="$2"
rlog_info "$description"
local pids
pids=$(eval "$cmd")
if [ -n "$pids" ]; then
rlog_info "检测到进程: $pids"
echo "$pids" | xargs -r kill -9 || rlog_error "部分进程停止失败."
else
rlog_info "未检测到相关进程."
fi
}
# 针对指定关键词停止进程的函数(获取PID=第2列)
stop_process_by_keyword() {
local keyword="$1"
rlog_info "停止匹配关键词 [$keyword] 的进程..."
local pids
pids=$(ps -ef | grep "$keyword" | grep -v "grep" | awk '{print $2}')
if [ -n "$pids" ]; then
rlog_info "检测到进程: $pids"
echo "$pids" | xargs -r kill -9 || rlog_error "部分进程停止失败."
else
rlog_info "未检测到匹配 [$keyword] 的进程."
fi
}
rlog_info "开始停止服务..."
# 检查jps是否存在,再kill jps列出的Java进程
if command_exists jps; then
stop_processes "停止 JPS 列出的进程..." "jps | awk '{print \$1}'"
else
rlog_info "jps命令未找到,跳过基于jps的Java进程检测。"
fi
# 针对关键词停止进程
KEYWORDS=("java" "n9e" "nightingale" "categraf")
for keyword in "${KEYWORDS[@]}"; do
stop_process_by_keyword "$keyword"
done
# 卸载 BIGTOP 与 Ambari 相关软件包
rlog_info "卸载 BIGTOP 与 Ambari 相关软件包..."
if command_exists yum; then
packages=$(yum list installed | grep -E '(@BIGTOP|ambari)' | awk '{print $1}')
for package in $packages; do
rlog_info "卸载软件包: $package"
sudo yum remove -y "$package"
done
elif command_exists dnf; then
packages=$(dnf list installed | grep -E '(@BIGTOP|ambari)' | awk '{print $1}')
for package in $packages; do
rlog_info "卸载软件包: $package"
sudo dnf remove -y "$package"
done
else
rlog_info "未找到yum/dnf命令,跳过软件包卸载。"
fi
rlog_info "服务停止操作完成."
EOF
}
############################################
# 远程执行清理操作
############################################
remote_cleanup() {
local user="$1" ip="$2" password="$3"
sshpass -p "$password" ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null "$user@$ip" bash -s <<'EOF'
# 远程日志函数
rlog_info() {
echo "$(date '+%Y-%m-%d %H:%M:%S') [Info] $*"
}
rlog_error() {
echo "$(date '+%Y-%m-%d %H:%M:%S') [Error] $*" >&2
}
perform_cleanup() {
rlog_info "开始执行清理操作..."
# 定义需要排除的路径数组
EXCLUDE_PATHS=(
-not -path "/data/modules/*"
-not -path "/usr/share/fonts/*"
-not -path "/usr/lib/locale/*"
)
# 定义匹配关键词数组
KEYWORDS=(ambari-qa ams hbase hcat hdfs hive kafka kms mapred ranger solr sqoop tez yarn dolphin zookeeper doris nightingale categraf spark flink zeppelin phoenix ozone celeborn cloudbeaver)
rlog_info "清理匹配关键词的文件和目录..."
for keyword in "${KEYWORDS[@]}"; do
rlog_info "清理匹配关键词 [$keyword] 的文件..."
find / -path /etc/yum.repos.d -prune -o -name "*${keyword}*" "${EXCLUDE_PATHS[@]}" -exec rm -rf {} \; 2>/dev/null
done
rlog_info "清理特定路径下的 'ambari*' 文件..."
find /tmp /var /run /sys/fs /etc /usr -path /etc/yum.repos.d -prune -o -name "ambari*" "${EXCLUDE_PATHS[@]}" -exec rm -rf {} \; 2>/dev/null
rlog_info "清理 BIGTOP 残留文件..."
find /var /usr -name "bigtop*" "${EXCLUDE_PATHS[@]}" -exec rm -rf {} \; 2>/dev/null
rm -rf /usr/bigtop
rlog_info "清理用户及用户组..."
USERS=(ambari-qa ams hbase hcat hdfs hive kafka kms mapred ranger solr sqoop tez yarn zookeeper zeppelin flink spark hadoop doris nightingale categraf ozone impala celeborn)
for user in "${USERS[@]}"; do
userdel -r "$user" 2>/dev/null || true
groupdel "$user" 2>/dev/null || true
done
rlog_info "清理用户家目录..."
rm -rf /home/{ambari-qa,ams,hbase,hcat,hdfs,hive,kafka,kms,mapred,ranger,roo,solr,sqoop,tez,yarn,zookeeper,ozone,impala,celeborn} 2>/dev/null
rlog_info "清理 Kafka 元数据及其他目录..."
rm -rf /kafka-logs/meta.properties 2>/dev/null || true
rm -rf /hadoop/* 2>/dev/null || true
rm -rf /data1/* 2>/dev/null || true
rm -rf /data2/* 2>/dev/null || true
rm -rf /ozone 2>/dev/null || true
rm -rf /celeborn 2>/dev/null || true
rlog_info "清理 /data/kafka-logs 和 /data/hadoop 目录..."
rm -rf /data/kafka-logs /data/hadoop 2>/dev/null || true
rlog_info "清理 MySQL 数据..."
systemctl stop mariadb 2>/dev/null || rlog_error "停止 MariaDB 服务失败."
timeout 5 rm -rf /var/lib/mysql/* 2>/dev/null || rlog_error "MySQL 数据清理超时或失败."
timeout 5 mariadb-install-db --user=mysql --basedir=/usr --datadir=/var/lib/mysql 2>/dev/null || rlog_error "MySQL 数据初始化超时或失败."
timeout 15 systemctl restart mariadb 2>/dev/null || rlog_error "MySQL 重启超时或失败."
timeout 15 systemctl enable mariadb 2>/dev/null || rlog_error "无法设置 MariaDB 开机自启."
rlog_info "清理 Hadoop 日志目录..."
find /var/log -type d -group hadoop -not -path "/data/modules/*" -not -path "/usr/share/fonts/*" -exec rm -rf {} \; 2>/dev/null
rlog_info "重新配置 locale..."
localedef -i zh_CN -f UTF-8 zh_CN.UTF-8
localedef -i en_US -f UTF-8 en_US.UTF-8
rlog_info "清理操作完成."
}
perform_cleanup
EOF
}
############################################
# 主流程:依次读取主机文件,检测、连接、停止服务并清理残留数据
############################################
main() {
check_install_sshpass
# 使用 while IFS= read -r line 逐行读取,确保处理多行输入
while IFS= read -r line || [ -n "$line" ]; do
# 忽略空行和以 '#' 开头的注释行
[[ -z "$line" || "$line" =~ ^# ]] && continue
# 去除可能的 CR 字符和多余空格
line=$(echo "$line" | tr -d '\r' | xargs)
# 文件中每行格式:用户名 密码 ip
read -r username password ip <<< "$line"
log_info "处理主机:$ip (user: $username)"
if check_ssh_connection "$username" "$ip" "$password"; then
log_info "SSH 连接成功,开始执行远程服务停止及清理操作..."
remote_stop_services "$username" "$ip" "$password"
remote_cleanup "$username" "$ip" "$password"
log_info "主机 $ip 操作完成."
else
log_error "跳过主机 $ip (user: $username),记录失败信息."
echo "$ip" >>failed_hosts.log
fi
done < "$HOSTS_FILE"
log_info "所有操作完成。详细日志请查看: $LOGFILE"
}
main
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
# hosts.txt 格式说明
hosts.txt 文件与安装脚本一致,用于批量指定目标主机。
用户名 | 密码 | IP地址 |
---|---|---|
root | xxxxxx | 192.168.3.1 |
root | xxxxxx | 192.168.3.2 |
root | xxxxxx | 192.168.3.3 |
笔记
请确保各节点网络互通,具备 sudo/root 权限。
# 使用方法
准备 hosts.txt 填写所有需要卸载的主机信息,并放在脚本同目录。
执行卸载脚本
chmod +x uninstall_ambari_cluster.sh
./uninstall_ambari_cluster.sh
1
2
2
日志自动写入 ambari_uninstall.log,如有失败主机将标记在 failed_hosts.log,方便后续重试。
检查结果 卸载完成后,建议逐台核查如下目录确保无残留:
- /var/lib/ambari-*
- /usr/jdk64/
- /var/lib/mysql/
- /etc/ambari*
可根据实际情况删减清理范围,避免误删业务数据。
# 图示参考
- 01
- bigtop-select 打包缺 compat 报错修复 deb07-16
- 02
- bigtop-select 打包缺 control 文件报错修复 deb07-16
- 03
- 首次编译-环境初始化 必装07-16