Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录
切换导航
U
ubains-module-test
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
1
议题
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
郑晓兵
ubains-module-test
Commits
2ead8f25
提交
2ead8f25
authored
5月 18, 2026
作者:
陈泽健
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
docs(PRD): 更新远程自动化部署需求文档,增加约束描述。
上级
c5d81db5
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
214 行增加
和
2 行删除
+214
-2
auto_deploy_wrapper.sh
AuxiliaryTool/ScriptTool/RemoteDeploy/auto_deploy_wrapper.sh
+50
-0
deploy_interactive.py
AuxiliaryTool/ScriptTool/RemoteDeploy/deploy_interactive.py
+146
-0
_PRD_远程自动化部署_需求文档.md
Docs/PRD/远程自动化部署/_PRD_远程自动化部署_需求文档.md
+18
-2
没有找到文件。
AuxiliaryTool/ScriptTool/RemoteDeploy/auto_deploy_wrapper.sh
0 → 100644
浏览文件 @
2ead8f25
#!/bin/bash
# 自动化部署包装脚本 - 自动应答所有交互式提示
# 解决whiptail终端问题,提供所有自动应答
#
# 使用方式:
# 1. 上传本脚本到服务器 /data/offline_auto_unifiedPlatform/
# 2. 赋权:chmod +x auto_deploy_wrapper.sh
# 3. 执行:./auto_deploy_wrapper.sh
#
# 原理:
# - TERM=dumb 使whiptail无法渲染,自动回退到默认值(如默认IP)
# - 通过管道预输入所有y/n应答
# - new_auto.sh --all 跳过系统选择菜单,默认部署所有系统
#
# 应答顺序说明(根据new_auto.sh交互流程):
# y - 是否继续执行脚本
# y - 确认网口信息是否正确
# y - 确认日期时间
# y - 确认服务器IP(whiptail回退后仍需应答)
# y - 确认系统类型
# y - 确认部署参数
# y - 确认开始部署
# n - 无企业NTP服务器
export
TERM
=
dumb
cd
/data/offline_auto_unifiedPlatform
echo
"======== 开始自动化部署 ========"
echo
"时间:
$(
date
)
"
echo
"TERM=
$TERM
(禁用whiptail交互对话框)"
# 检查部署脚本是否存在
if
[
!
-f
"./new_auto.sh"
]
;
then
echo
"[错误] 未找到 ./new_auto.sh,请确认部署目录正确"
exit
1
fi
# 使用yes自动应答,配合管道输入
# 应答顺序:y(继续执行) y(网口确认) y(日期确认) y(IP确认) y(系统类型) y(部署参数) y(开始部署) n(无企业NTP)
printf
'y\ny\ny\ny\ny\ny\ny\nn\n'
| ./new_auto.sh
--all
EXIT_CODE
=
$?
echo
""
echo
"======== 部署脚本执行完毕 ========"
echo
"退出码:
$EXIT_CODE
"
echo
"时间:
$(
date
)
"
exit
$EXIT_CODE
AuxiliaryTool/ScriptTool/RemoteDeploy/deploy_interactive.py
0 → 100644
浏览文件 @
2ead8f25
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
自动化部署交互式脚本
使用paramiko处理new_auto.sh --all的交互式部署
通过TERM=dumb禁用whiptail,用管道输入预定义应答
"""
import
paramiko
import
time
import
sys
import
re
import
os
from
datetime
import
datetime
# 服务器配置
HOST
=
"192.168.5.52"
PORT
=
22
USERNAME
=
"root"
PASSWORD
=
"Ubains@123"
# 部署应答序列(与auto_deploy_wrapper.sh一致)
# y(继续执行) y(网口确认) y(日期确认) y(IP确认) y(系统类型) y(部署参数) y(开始部署) n(无企业NTP)
DEPLOY_ANSWERS
=
"y
\n
y
\n
y
\n
y
\n
y
\n
y
\n
y
\n
n
\n
"
# 日志文件
LOG_DIR
=
os
.
path
.
join
(
os
.
path
.
dirname
(
os
.
path
.
abspath
(
__file__
)),
"reports"
)
os
.
makedirs
(
LOG_DIR
,
exist_ok
=
True
)
LOG_FILE
=
os
.
path
.
join
(
LOG_DIR
,
f
"deploy_log_{datetime.now().strftime('
%
Y
%
m
%
d_
%
H
%
M
%
S')}.txt"
)
class
InteractiveDeploy
:
def
__init__
(
self
):
self
.
ssh
=
paramiko
.
SSHClient
()
self
.
ssh
.
set_missing_host_key_policy
(
paramiko
.
AutoAddPolicy
())
self
.
shell
=
None
self
.
log_file
=
None
self
.
start_time
=
None
self
.
output_buffer
=
""
def
connect
(
self
):
"""连接服务器"""
print
(
f
"[*] 连接服务器 {HOST}:{PORT}..."
)
self
.
ssh
.
connect
(
HOST
,
PORT
,
USERNAME
,
PASSWORD
,
timeout
=
30
)
self
.
shell
=
self
.
ssh
.
invoke_shell
(
term
=
'xterm'
,
width
=
200
,
height
=
50
)
self
.
shell
.
settimeout
(
10
)
time
.
sleep
(
2
)
# 清空连接输出
if
self
.
shell
.
recv_ready
():
self
.
shell
.
recv
(
4096
)
print
(
"[+] 服务器连接成功"
)
def
send_command
(
self
,
cmd
,
wait
=
2
):
"""发送命令"""
self
.
shell
.
send
(
cmd
+
"
\n
"
)
time
.
sleep
(
wait
)
def
read_output
(
self
,
timeout
=
30
):
"""读取输出"""
output
=
""
end_time
=
time
.
time
()
+
timeout
while
time
.
time
()
<
end_time
:
if
self
.
shell
.
recv_ready
():
try
:
chunk
=
self
.
shell
.
recv
(
4096
)
.
decode
(
'utf-8'
,
errors
=
'replace'
)
output
+=
chunk
if
self
.
log_file
:
self
.
log_file
.
write
(
chunk
)
self
.
log_file
.
flush
()
clean
=
re
.
sub
(
r'\x1b\[[0-9;]*[mGKHJ]'
,
''
,
chunk
)
if
clean
.
strip
():
print
(
clean
,
end
=
''
,
flush
=
True
)
except
Exception
:
pass
else
:
time
.
sleep
(
0.5
)
self
.
output_buffer
+=
output
return
output
def
handle_deployment
(
self
):
"""处理部署 - 使用TERM=dumb + 管道输入方式"""
self
.
start_time
=
datetime
.
now
()
self
.
log_file
=
open
(
LOG_FILE
,
'w'
,
encoding
=
'utf-8'
)
try
:
self
.
connect
()
# 进入部署目录
print
(
"[*] 进入部署目录..."
)
self
.
send_command
(
"cd /data/offline_auto_unifiedPlatform"
)
self
.
read_output
(
2
)
# 检查部署脚本是否存在
print
(
"[*] 检查部署脚本..."
)
self
.
send_command
(
"ls -la new_auto.sh"
)
output
=
self
.
read_output
(
3
)
if
"No such file"
in
output
:
print
(
"[-] 错误:未找到 new_auto.sh"
)
return
# 使用TERM=dumb + 管道输入方式执行部署
# 这种方式比逐行匹配交互更可靠
print
(
"[*] 启动部署脚本(TERM=dumb + 管道输入)..."
)
deploy_cmd
=
f
'export TERM=dumb && printf
\'
{DEPLOY_ANSWERS}
\'
| ./new_auto.sh --all'
self
.
shell
.
send
(
deploy_cmd
+
"
\n
"
)
# 持续读取输出,等待部署完成
# 部署通常需要20-30分钟
print
(
"[*] 等待部署完成(预计20-30分钟)..."
)
self
.
read_output
(
timeout
=
3600
)
# 执行 source /etc/profile
print
(
"
\n
[*] 执行 source /etc/profile ..."
)
self
.
send_command
(
"source /etc/profile"
,
wait
=
2
)
self
.
read_output
(
3
)
# 检查docker容器状态
print
(
"[*] 检查Docker容器状态..."
)
self
.
send_command
(
"docker ps --format 'table {{.Names}}
\t
{{.Status}}
\t
{{.Ports}}'"
)
output
=
self
.
read_output
(
5
)
print
(
output
)
# 检查对外服务接口
print
(
"[*] 检查对外服务接口..."
)
self
.
send_command
(
"curl -sk https://192.168.5.52/exapi/message/getMsgPageList"
)
output
=
self
.
read_output
(
10
)
print
(
output
)
end_time
=
datetime
.
now
()
duration
=
end_time
-
self
.
start_time
print
(
f
"
\n
[+] 部署总用时: {duration}"
)
except
Exception
as
e
:
print
(
f
"[-] 部署异常: {e}"
)
import
traceback
traceback
.
print_exc
()
finally
:
if
self
.
log_file
:
self
.
log_file
.
close
()
self
.
ssh
.
close
()
print
(
f
"[*] 日志已保存到: {LOG_FILE}"
)
if
__name__
==
"__main__"
:
deploy
=
InteractiveDeploy
()
deploy
.
handle_deployment
()
Docs/PRD/远程自动化部署/_PRD_远程自动化部署_需求文档.md
浏览文件 @
2ead8f25
...
...
@@ -170,4 +170,20 @@
3.
部署到使用的时长记录要求在1小时内完成。
4.
部署过程中无异常日志输出。
5.
部署脚本日志打印清晰明了。
6.
多个维度来分析。
\ No newline at end of file
6.
多个维度来分析。
## 部署注意事项
### SSH远程执行部署脚本
-
`new_auto.sh`
内部使用了
`whiptail`
组件进行交互式对话框(如服务器IP确认),在非交互式SSH会话中
`whiptail`
无法正常渲染,会导致脚本卡住。
-
解决方案:执行部署脚本前先设置环境变量
`export TERM=dumb`
,使
`whiptail`
自动回退,脚本将使用默认值(如通过
`hostname -I`
获取的默认IP)继续执行。
-
辅助脚本路径:
`AuxiliaryTool/ScriptTool/RemoteDeploy/auto_deploy_wrapper.sh`
,该脚本封装了
`TERM=dumb`
设置和自动应答管道输入,可直接上传到服务器使用。
### 维护平台(Web界面)操作
-
维护平台中每次敏感操作(下载激活文件、上传授权文件、重启服务)都会弹出"校验身份"对话框,需要重新输入密码和验证码。
-
验证码固定为:
`csba`
。
-
超管账号密码:
`superadmin`
/
`Ubains@1357`
。
### 服务重启后验证
-
服务重启后(运维系统、预定系统2.0),等待约10分钟让服务完全启动。
-
运维集控接口可能需要重试1-2次才能正常响应,属于正常现象。
-
按接口调用要求中的重试机制执行即可。
\ No newline at end of file
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论