rackshift裸金属管理平台部署

参考:

环境:

  • 不小于 8 G内存的 64位 CentOS 7 / RHEL 7 以上 Linux 主机
  • 此部署方式只支持CentOS 7 / RHEL 7 以上 Linux 主机

概览:

  • centos部署
  • ubuntu部署(官方没有ubuntu部署rackship的教程此处需要修改install.sh脚本)

一. centos二进制部署rackship(下载源码包直接部署)

网络结构 RackShift 网卡说明

  • 管理:与BMC管理网络三层通信,通过该网络 RackShift 能控制物理机的 PXE启动等行为
  • PXE:与 物理机 PXE 网口直连,通过该网络 RackShift能下发 PXE过程中需要的文件

image-20231010211724085

在线安装

1
sh -c "$(curl -sSL https://github.com/rackshift/rackshift/releases/latest/download/quick_start.sh)"

离线安装

  • 百度网盘下载地址(提取码:vcuv)
  • GEGEWU阿里云盘获取
  • tar -zxvf rackshift-offline-installer-v1.x.x.tar.gz
  • cd rackshift-offline-installer-v1.x.x/installer
  • ./install.sh (文件位置:/opt/rockship/rackshift-offline-installer-v1.7.1/installer)

安装过程截图

image-20231010213602998

image-20231010213638027

image-20231010213619997

image-20231010213702416

二. ubuntu部署rachship

  • 建议手动安装好docker以及docker-compose
    手动将适配ubuntu的脚本上传到源码解压目录
  • 防火墙部分注释ubuntu采用ufw防火墙只需手动执行ufw allow +端口即可
  • cd rackshift-offline-installer-v1.x.x/installer
    赋予权限
  • chmod +x check_install.sh
    执行
  • ./check_install.sh

check_install.sh脚本留存

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
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
#!/bin/bash

set -e
installLog="/tmp/rackshift-install.log"

red=31
green=32
yellow=33
blue=34
validationPassed=1
cmd=$1
Environment_Preparation() {
function printTitle() {
echo -e "\n\n**********\t ${1} \t**********\n"
}

function printSubTitle() {
echo -e "------\t \033[${blue}m ${1} \033[0m \t------\n"
}

function colorMsg() {
echo -e "\033[$1m $2 \033[0m"
}

function checkPort() {
record=$(lsof -i:$1 | grep LISTEN | wc -l)
echo -ne "$1 端口 \t\t........................ "
if [ "$record" -eq "0" ]; then
colorMsg $green "[OK]"
else
validationPassed=0
colorMsg $red "[被占用]"
fi
}

echo "" >$installLog
systemName=" RackShift 服务"
versionInfo=$(cat ../rackhd/conf/version)
}
rackshift_IP() {
##配置 rackshift IP
if [ "$cmd" != "upgrade" ]; then
if [ ! "$serverIp" ]; then
printTitle "配置 RackShift 服务 IP 地址:"
echo "请输入 RackShift 当前 IP 地址(与物理机 PXE 口属于同一个 VLAN ):"
read serverIp
else
printTitle "RackShift 服务 IP 地址: $serverIp"
fi
fi

``
colorMsg $yellow "\n\n开始安装 $systemName,版本 - $versionInfo"

echo -e "\n"
echo " ____ __ _____ __ _ _____ "
echo " / __ \____ ______/ /__/ ___// /_ (_) __/ /_"
echo " / /_/ / __ \`/ ___/ //_/\__ \/ __ \/ / /_/ __/"
echo " / _, _/ /_/ / /__/ ,< ___/ / / / / / __/ /_"
echo "/_/ |_|\__,_/\___/_/|_|/____/_/ /_/_/_/ \__/"

printTitle "${systemName} 安装环境检测"
}

#root用户检测
user_check() {
echo -ne "root 用户检测 \t\t........................ "
isRoot=$(id -u -n | grep root | wc -l)
if [ "x$isRoot" == "x1" ]; then
colorMsg $green "[OK]"
else
colorMsg $red "[ERROR] 请用 root 用户执行安装脚本"
validationPassed=0
fi
}

#操作系统检测
system_check() {
echo -ne "操作系统检测 \t\t........................ "
if [ -f /etc/redhat-release ]; then
majorVersion=$(cat /etc/redhat-release | grep -oE '[0-9]+\.[0-9]+' | awk -F. '{print $1}')
if [ "x$majorVersion" == "x" ]; then
colorMsg $red "[ERROR] 操作系统类型版本不符合要求,请使用 CentOS 7.x, RHEL 7.x 版本 64 位"
validationPassed=0
else
if [ "x$majorVersion" == "x7" ]; then
is64bitArch=$(uname -m)
if [ "x$is64bitArch" == "xx86_64" ]; then
colorMsg $green "[OK]"
else
colorMsg $red "[ERROR] 操作系统必须是 64 位的,32 位的不支持"
validationPassed=0
fi
else
colorMsg $red "[ERROR] 操作系统类型版本不符合要求,请使用 CentOS 7.x, RHEL 7.x 版本 64 位"
validationPassed=0
fi
fi
else
colorMsg $red "[ERROR] 操作系统类型版本不符合要求,请使用 CentOS 7.x, RHEL 7.x版本 64 位"
validationPassed=0
fi
}

disk_space() {
#磁盘剩余空间检测
echo -ne "磁盘剩余空间检测 \t........................ "
path="/opt/rackshift"

IFSOld=$IFS
IFS=$'\n'
lines=$(df)
for line in ${lines}; do
linePath=$(echo ${line} | awk -F' ' '{print $6}')
lineAvail=$(echo ${line} | awk -F' ' '{print $4}')
if [ "${linePath:0:1}" != "/" ]; then
continue
fi

if [ "${linePath}" == "/" ]; then
rootAvail=${lineAvail}
continue
fi

pathLength=${#path}
if [ "${linePath:0:${pathLength}}" == "${path}" ]; then
pathAvail=${lineAvail}
break
fi
done
IFS=$IFSOld

if test -z "${pathAvail}"; then
pathAvail=${rootAvail}
fi

if [ $pathAvail -lt 2097 ]; then
colorMsg $red "[ERROR] 安装目录剩余空间小于 200G, 所在机器的安装目录可用空间需要至少 200G"
validationPassed=0
else
colorMsg $green "[OK]"
fi
}

#docker环境检测
docker_check() {
echo -ne "Docker 检测 \t\t........................ "
systemctl start docker 1>/dev/null 2>/dev/null
if [ $? -eq 0 ]; then
colorMsg $green '[OK]'
else
colorMsg $red '[不存在]'
if [ -d ../docker ]; then
echo "离线安装 Docker"
cp ../docker/bin/* /usr/bin/
cp ../docker/service/docker.service /etc/systemd/system/
chmod +x /usr/bin/docker*
chmod 754 /etc/systemd/system/docker.service
else
echo "在线安装 Docker"
curl -fsSL https://get.docker.com -o get-docker.sh 2>&1 | tee -a $installLog
sudo sh get-docker.sh --mirror Aliyun 2>&1 | tee -a $installLog
echo "... 启动 docker"
fi
fi
systemctl enable docker 2>&1 | tee -a $installLog
systemctl start docker 2>&1 | tee -a $installLog
docker ps 1>/dev/null 2>/dev/null
if [ $? != 0 ]; then
echo "Docker 未正常启动,请先安装并启动 Docker 服务后再次执行本脚本"
exit
fi
}

##安装 docker-compose
docker_compose_check() {
echo -ne "Compose 检测 \t\t........................ "
docker-compose -v 1>/dev/null 2>/dev/null
if [[ $? -eq 0 ]]; then
colorMsg $green '[OK]'
else
colorMsg $red '[不存在]'
if [[ -d ../docker ]]; then
echo "... 离线安装 docker-compose"
cp ../docker/bin/docker-compose /usr/bin/
chmod +x /usr/bin/docker-compose
else
echo "... 在线安装 docker-compose"
# COMPOSEVERSION=$(curl -s https://github.com/docker/compose/releases/latest/download 2>&1 | grep -Po [0-9]+\.[0-9]+\.[0-9]+)
# curl -L "https://github.com/docker/compose/releases/download/$COMPOSEVERSION/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 2>&1 | tee -a $installLog
curl -L "https://get.daocloud.io/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
fi
fi

docker-compose version 1>/dev/null 2>/dev/null
if [ $? != 0 ]; then
echo "docker-compose 未正常安装,请先安装 docker-compose 后再次执行本脚本"
exit
fi
}
port_check(){
hasLsof=$(which lsof 2>&1)
if [ "$cmd" != "upgrade" ]; then
if [[ ! $hasLsof =~ "no lsof" ]]; then
rackshiftPorts=$(grep -A 1 "ports:$" ./docker-compose.yml | grep "\-.*:" | awk -F":" '{print $1}' | awk -F" " '{print $2}')
for rackshiftPort in ${rackshiftPorts}; do
checkPort $rackshiftPort
done
else
echo -ne "lsof 检测端口 \t\t........................ "
colorMsg $red "[不存在]"
fi
fi

if [ $validationPassed -eq 0 ]; then
colorMsg $red "\n${systemName} 安装环境检测未通过,请查阅上述环境检测结果\n"
exit 1
fi

printTitle "开始进行${systemName} 安装"

if [ $(grep "vm.max_map_count" /etc/sysctl.conf | wc -l) -eq 0 ]; then
echo "vm.max_map_count=262144" >>/etc/sysctl.conf
sysctl -p /etc/sysctl.conf >>$installLog
fi
}

##配置 rackshift
configuration_rackshift(){
if [ "$cmd" != "upgrade" ]; then
printTitle "配置 RackShift服务"
echo -ne "配置 RackShift服务 \t........................ "
mkdir -p /opt/rackshift/logs
if [ -f /opt/rackshift/rackhd/dhcp/config/dhcpd.conf ];then
mv -f /opt/rackshift/rackhd/dhcp/config/dhcpd.conf /tmp
fi
cp -rpf ../rackhd /opt/rackshift
if [ -f /tmp/dhcpd.conf ];then
mv -f /tmp/dhcpd.conf /opt/rackshift/rackhd/dhcp/config/dhcpd.conf
fi
cp rsctl /etc/init.d/rackshift
chmod a+x /etc/init.d/rackshift
mkdir -p /opt/rackshift/conf/mysql/sql
cp ./mysql.cnf /opt/rackshift/conf/mysql
cp ./rackshift.sql /opt/rackshift/conf/mysql/sql
cp ./.env /opt/rackshift
mkdir -p /opt/rackshift/plugins
sed -i "s/172.31.128.1/${serverIp}/g" /opt/rackshift/conf/mysql/sql/rackshift.sql
else
if [ -d /opt/rackshift/rackhd/monorail/config.json ];then
serverIp=`cat /opt/rackshift/rackhd/monorail/config.json | grep "apiServerAddress" | awk -F ':' '{print $2}' | awk -F '"' '{print $2}'`
else
serverIp=`cat /opt/rackshift/conf/rackshift.properties | grep "api.server.url" | awk -F '=' '{print $2}'`
fi
fi
cp ./rackshift.properties /opt/rackshift/conf
cp ./rackshift.properties /opt/rackshift/rackhd/conf/rackshift.properties.bak
sed -i "s/172.31.128.1/${serverIp}/g" /opt/rackshift/conf/rackshift.properties

cp ./docker-compose.yml /opt/rackshift
cp ../rackhd/conf/version /opt/rackshift/rackhd/conf/version
if [ -d ../plugins ]; then
cp -rf ../plugins/* /opt/rackshift/plugins
fi

colorMsg $green '[OK]'
}

##配置 加载
configuration_loading() {
printSubTitle "加载 Docker 镜像" ||true
docker_images_folder="../docker-images"
if [ ! -d "$docker_images_folder" ]; then
echo -ne "目录检测 \t\t........................ "
colorMsg $red "[不存在]"
else
for docker_image in ${docker_images_folder}/*; do
temp_file=$(basename $docker_image)
printf "加载镜像 %-45s ........................ " $temp_file
docker load -q -i ${docker_images_folder}/$temp_file >>$installLog
printf "\e[32m[OK]\e[0m \n"
done
fi

cp rsctl /usr/local/bin && chmod +x /usr/local/bin/rsctl
if [ -f "/usr/bin/rsctl" ]; then
rm -rf /usr/bin/rsctl
fi
ln -s /usr/local/bin/rsctl /usr/bin/rsctl ||true

chkconfig rackshift on >>/dev/null ||true
echo -ne "启动 Docker 服务 \t........................ "
systemctl restart docker
colorMsg $green "[OK]" ||true

printTitle "启动 RackShift 服务" ||true
rsctl stop
if [ "$cmd" == "online" ];then
docker pull registry.cn-qingdao.aliyuncs.com/x-lab/kvm:v1.5.1
docker pull registry.cn-qingdao.aliyuncs.com/x-lab/racadm-docker
docker pull registry.cn-qingdao.aliyuncs.com/x-lab/ipmitool
fi
rsctl reload
if [ $? -eq 0 ]; then
echo -ne "启动 RackShift 服务 \t........................ "
colorMsg $green "[OK]" ||true
else
echo -ne "启动 RackShift 服务 \t........................ "
colorMsg $red "[失败]" ||true
exit 1
fi
}

open_port() {
printTitle "正在开放必要端口"

notRunning=$(firewall-cmd --state 2>&1)
if [[ "${notRunning}" == "running" ]]; then
firewall-cmd --zone=public --add-port=80/tcp --permanent 1>>$installLog 2>/dev/null
firewall-cmd --zone=public --add-port=8082/tcp --permanent 1>>$installLog 2>/dev/null
firewall-cmd --zone=public --add-port=8083/tcp --permanent 1>>$installLog 2>/dev/null
firewall-cmd --zone=public --add-port=8443/tcp --permanent 1>>$installLog 2>/dev/null
firewall-cmd --zone=public --add-port=9080/tcp --permanent 1>>$installLog 2>/dev/null
firewall-cmd --zone=public --add-port=9090/tcp --permanent 1>>$installLog 2>/dev/null
firewall-cmd --zone=public --add-port=9030/tcp --permanent 1>>$installLog 2>/dev/null
firewall-cmd --zone=public --add-port=4011/udp --permanent 1>>$installLog 2>/dev/null
firewall-cmd --zone=public --add-port=67/udp --permanent 1>>$installLog 2>/dev/null
firewall-cmd --zone=public --add-port=69/udp --permanent 1>>$installLog 2>/dev/null
firewall-cmd --reload 1>/dev/null 2>/dev/null
firewall-cmd --zone=public --list-ports
else
echo "防火墙已关闭,无需配置端口开放"
fi
}

successful() {
echo
echo "*********************************************************************************************************************************************"
echo -e "\t $systemName 安装完成,请在服务完全启动后(大概需要等待5分钟左右)访问 http://$serverIp:8082 来访问 RackShift 控制台 默认账号密码 admin/123"
echo
echo "*********************************************************************************************************************************************"
echo
rsctl
}
main() {
Environment_Preparation
rackshift_IP
user_check
#system_check
disk_space
docker_check
docker_compose_check
port_check
configuration_rackshift
configuration_loading
#open_port
successful
}
main

note: 最简环境需要注释脚本下方函数否则检查时无法通过

image-20231011195426261

image-20231011203034227

三. 效果

安装成功后您可以通过浏览器访问 RackShift WEB 控制台

通过 rsctl status 查看服务状态

image-20231010213805197

控制命令

  • rsctl status 查看 RackShift 服务运行状态
  • rsctl start 启动 RackShift 服务
  • rsctl stop 停止 RackShift 服务
  • rsctl restart 重启 RackShift 服务
  • rsctl reload 重新加载 RackShift 服务
  • rsctl reconfig 重设 RackShift 服务 IP(PXE 网卡) 地址
  • rsctl upgrade 升级 RackShift 至最新版本
  • rsctl uninstall 卸载 RackShift 服务
  • rsctl version 查看 RackShift 版本信息

image-20231010213856292

image-20231010214004717

四. 使用

参考:

后端挂载 CentOS 镜像

  • 上传镜像文件 CentOS.iso 到 /opt/rackshift/rackhd/files/mount/common 目录
  • 执行命令 mkdir -p /opt/rackshift/rackhd/files/mount/common/centos-test(名称可以随意写,只要不重复)
  • 执行命令 mount CentOS.iso /mnt/
  • 执行 cp -r /mnt/* /opt/rackshift/rackhd/files/mount/common/centos-test
  • 在 WEB-UI 上添加镜像,选择后端挂载,URL 填 http://nodeIp:9090/common/centos-test 即可

注意

等待镜像上传完毕之后点击“提交/确定”按钮

如果需要 Minimal 版本,请到 https://docs.rackshift.io/iso/ 下载 !官网的 Minimal 镜像没有 curl 等工具会造成 RackShift 工作流不能正常结束