适用于3.0.0-ubuntu22一键卸载
场景说明
本指南专为 Ubuntu 22.04 环境设计,支持一键安全批量卸载 Ambari/Bigtop 及其依赖。适合环境重置、集群重装或测试回收。脚本支持多节点并发操作,确保卸载后系统无历史残留。
# 支持范围
类别 | 说明 |
---|---|
操作系统 | Ubuntu 22.04(Jammy),兼容 x86_64 架构 |
卸载内容 | Ambari Server/Agent、MariaDB/MySQL、JDK、MySQL Connector、Nginx、本地 APT 源、常见组件残留 |
适用场景 | 建议结合本站 ONEKEY 安装方案,配合原始 hosts.txt,支持多节点集群卸载、环境回滚与测试验证 |
# 卸载脚本完整内容 必读
注意
下方为 Ubuntu 22 专用一键卸载脚本,复制前请确保 hosts.txt 配置无误。脚本支持并发批量执行,适配 APT 公钥、sudo 场景,务必阅读用法说明。
#!/bin/bash
# 版权所有 (c) JaneTTR 2025
# 项目名称:ambari-env
#
# 本文件属于付费部分代码,仅供个人学习和研究使用。
#
# 禁止行为:
# 1. 未经授权,不得将本文件或其编译后的代码用于任何商业用途;
# 2. 禁止重新分发本文件或其修改版本;
# 3. 禁止通过反编译、反向工程等手段试图绕过授权验证。
#
# 商业授权:
# 如需将本文件或其编译后的代码用于商业用途,必须获得版权所有者的书面授权。
# 联系方式:
# 邮箱:3832514048@qq.com
#
# 责任声明:
# 本文件按“现状”提供,不附带任何形式的担保,包括但不限于适销性、
# 特定用途适用性或无侵权的担保。
#
# 如有任何疑问,请联系版权所有者。
# —————— 强制 UTF-8 区域 ——————
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
sudo locale-gen zh_CN.UTF-8
sudo locale-gen en_US.UTF-8
sudo update-locale LANG=zh_CN.UTF-8 LC_ALL=zh_CN.UTF-8
set -e
LOGFILE="/tmp/ambari_cleanup.log"
exec > >(tee -a "$LOGFILE") 2>&1
#----------------------------------
# 通用日志函数
#----------------------------------
log_info () { echo "$(date '+%F %T') [Info] $*"; }
log_error () { echo "$(date '+%F %T') [Error] $*" >&2; }
#----------------------------------
# APT 锁处理:杀掉占锁进程并等待锁释放
#----------------------------------
kill_apt_locks() {
local locks=(
/var/lib/dpkg/lock-frontend
/var/lib/dpkg/lock
/var/lib/apt/lists/lock
/var/cache/apt/archives/lock
)
for lock in "${locks[@]}"; do
if sudo fuser "$lock" >/dev/null 2>&1; then
log_info "[$TARGET] 杀掉占用锁 $lock 的进程..."
sudo fuser -k "$lock" || true
fi
done
}
wait_for_apt() {
kill_apt_locks
while sudo fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1; do
log_info "[$TARGET] 等待 APT 锁释放…"
sleep 1
done
}
#----------------------------------
# 安装 sshpass(本机)
#----------------------------------
check_install_sshpass() {
if ! command -v sshpass &>/dev/null; then
log_info "sshpass 未安装,开始安装…"
sudo apt update && sudo apt install -y sshpass
fi
}
#----------------------------------
# 停止服务 & 卸包
#----------------------------------
do_stop_services() {
log_info "[$TARGET] 停止服务…"
# 杀掉 jps 检测到的 Java 进程(排除Jps本身)
if command -v jps &>/dev/null; then
mapfile -t pids < <(jps | awk '$2 != "Jps" && $3 != "information" {print $1}')
for pid in "${pids[@]}"; do
if [[ "$pid" =~ ^[0-9]+$ ]] && kill -0 "$pid" 2>/dev/null; then
kill -9 "$pid"
fi
done
fi
# 按关键词杀进程
for kw in java n9e nightingale categraf; do
pids=$(ps -ef | grep "$kw" | grep -v grep | awk '{print $2}')
for pid in $pids; do
if kill -0 "$pid" 2>/dev/null; then
log_info "按关键词[$kw]检测到进程: $pid"
kill -9 "$pid"
fi
done
done
log_info "[$TARGET] 卸载 Ambari/Bigtop 相关包…"
if command -v apt-get &>/dev/null; then
wait_for_apt
dpkg -l | grep -E 'ambari|bigtop' | awk '{print $2}' | xargs -r sudo apt-get remove --purge -y
wait_for_apt
sudo apt-get autoremove -y
fi
}
#----------------------------------
# 清理文件/用户/DB/locale
#----------------------------------
do_cleanup() {
log_info "[$TARGET] 清理残留文件…"
local dirs=(/opt /usr /etc /var /home /data*)
local regex='.*(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).*'
for d in "${dirs[@]}"; do
[ -d "$d" ] && sudo find "$d" -regextype posix-extended -regex "$regex" \
-not -path "/data/modules" -not -path "/data/modules/*" \
-exec rm -rf {} + 2>/dev/null
done
log_info "[$TARGET] 清理 ambari*/bigtop* 临时目录…"
for d in /tmp /var /run /sys/fs /etc /usr; do
[ -d "$d" ] && sudo find "$d" -name "ambari*" \
-not -path "/data/modules" -not -path "/data/modules/*" \
-exec rm -rf {} + 2>/dev/null
done
for d in /var /usr; do
[ -d "$d" ] && sudo find "$d" -name "bigtop*" \
-not -path "/data/modules" -not -path "/data/modules/*" \
-exec rm -rf {} + 2>/dev/null
done
sudo rm -rf /usr/bigtop
log_info "[$TARGET] 清理用户/用户组/家目录…"
local 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 celebon)
for u in "${users[@]}"; do
sudo userdel -r "$u" 2>/dev/null || true
sudo groupdel "$u" 2>/dev/null || true
sudo rm -rf /home/"$u" 2>/dev/null || true
done
log_info "[$TARGET] 清理 Kafka & Hadoop 数据目录…"
sudo rm -rf /kafka-logs/meta.properties /hadoop/* /data1/* /data2/* /ozone /celeborn /data/kafka-logs /data/hadoop 2>/dev/null || true
log_info "[$TARGET] 清理并重建数据库…"
local svc initcmd
if systemctl list-units --type=service | grep -q mariadb; then
svc="mariadb"; initcmd="mariadb-install-db --user=mysql --basedir=/usr --datadir=/var/lib/mysql"
elif systemctl list-units --type=service | grep -q mysql; then
svc="mysql"; initcmd="mysqld --initialize-insecure --user=mysql --datadir=/var/lib/mysql"
fi
if [ -n "${svc-}" ]; then
sudo systemctl stop "$svc" || log_error "停止 $svc 失败"
sudo timeout 5 rm -rf /var/lib/mysql/* || log_error "清理数据失败"
sudo timeout 5 $initcmd || log_error "初始化失败"
sudo timeout 15 systemctl restart "$svc" || log_error "重启失败"
sudo timeout 15 systemctl enable "$svc" || log_error "设置开机自启失败"
fi
log_info "[$TARGET] 清理 Hadoop 日志…"
sudo find /var/log -type d -group hadoop -exec sudo rm -rf {} + 2>/dev/null || true
log_info "[$TARGET] 重新生成 locale…"
sudo locale-gen zh_CN.UTF-8
sudo locale-gen en_US.UTF-8
sudo update-locale
}
#----------------------------------
# SSH 远端执行
#----------------------------------
run_remote() {
local user=$1 ip=$2 pass=$3
sshpass -p "$pass" ssh -o StrictHostKeyChecking=no \
-o UserKnownHostsFile=/dev/null \
-o ConnectTimeout=5 \
"$user@$ip" "TARGET=$ip bash -s remote" < "$0"
}
#----------------------------------
# 本地主流程
#----------------------------------
main() {
check_install_sshpass
mapfile -t local_ips < <(hostname -I | tr ' ' '\n')
local_ips+=(127.0.0.1)
[ -f "./hosts.txt" ] || { log_error "hosts.txt 不存在"; exit 1; }
while IFS= read -r line || [ -n "$line" ]; do
[[ -z "$line" || "$line" =~ ^# ]] && continue
read -r user pass ip <<< "$(echo "$line" | tr -d '\r' | xargs)"
TARGET="$ip"
log_info "=== 开始处理 $TARGET ==="
if printf '%s\n' "${local_ips[@]}" | grep -Fxq "$ip"; then
do_stop_services; do_cleanup
else
run_remote "$user" "$ip" "$pass"
fi
log_info "=== $TARGET 处理完毕 ==="
done < "./hosts.txt"
#----------------------------------
# 本机公钥修复
#----------------------------------
log_info "修复本机 APT 公钥(如有)…"
for key in $(sudo apt update 2>&1 | awk '/NO_PUBKEY/ {print $NF}' | sort -u); do
log_info "导入本机公钥 $key"
sudo gpg --keyserver keyserver.ubuntu.com --recv-keys "$key"
sudo gpg --export "$key" \
| sudo tee /etc/apt/trusted.gpg.d/ubuntu_"$key".gpg >/dev/null
done
log_info "所有节点清理完成,详见 $LOGFILE"
}
#----------------------------------
# 远端流程
#----------------------------------
remote_main() {
do_stop_services
do_cleanup
log_info "[$TARGET] 远端修复 APT 公钥(如有)…"
for key in $(apt update 2>&1 | awk '/NO_PUBKEY/ {print $NF}' | sort -u); do
log_info "[$TARGET] 导入远端公钥 $key"
sudo gpg --keyserver keyserver.ubuntu.com --recv-keys "$key"
sudo gpg --export "$key" \
| sudo tee /etc/apt/trusted.gpg.d/ubuntu_"$key".gpg >/dev/null
done
sudo apt update
}
# 脚本入口
if [[ "${1-}" == "remote" ]]; then
remote_main; exit 0
else
main; exit 0
fi
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
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
# hosts.txt 格式说明
用户名 | 密码 | IP地址 |
---|---|---|
root | xxxxxx | 192.168.3.1 |
root | xxxxxx | 192.168.3.2 |
root | xxxxxx | 192.168.3.3 |
笔记
请确保所有节点 Ubuntu 22.04 网络互通、拥有 sudo/root 权限。hosts.txt 可直接复用一键安装方案的文件。
# 使用方法
准备 hosts.txt 填写所有目标主机账号、密码、IP,并放置于脚本同目录。
执行卸载脚本
chmod +x uninstall_ambari_cluster.sh ./uninstall_ambari_cluster.sh
1
2日志自动写入 ambari_cleanup.log,如有失败节点可查阅该文件定位。
检查结果 卸载结束后,建议逐台检查以下目录确保无残留:
- /var/lib/ambari-*
- /usr/jdk64/
- /var/lib/mysql/
- /etc/ambari*
如有业务数据目录(如 /data1 /data2 等),可根据实际需求删减或扩展清理范围,避免误删。
# 图示参考
提示
如遇系统无法删除某些文件、APT 锁定、远程失败等,可根据脚本日志内容分步手动执行排查。该脚本专为 Ubuntu 22.04 环境适配,Rocky8、CentOS 等发行版请使用对应专版卸载方案。
- 01
- bigtop-select 打包缺 compat 报错修复 deb07-16
- 02
- bigtop-select 打包缺 control 文件报错修复 deb07-16
- 03
- 首次编译-环境初始化 必装07-16