方案基本思路:在面临大量的相似、复杂链路海量数据的排查过程中,需要申请大量的机器权限,并且很多好的排查经验积累没办法很好的沉淀及项目分享。本发明旨在通过统一的平台串联工具的方式实现安全的、可复用高效诊断实现,从而服务于运营人员快速响应、解决业务问题。
本方案由四个模块组成:
1、web服务:用于代理服务器信息留存、脚本录入、任务触发和结果展示;
2、任务分配工具:辅助web服务进行任务分配;
3、任务代理工具:串业务主体,将脚本地理到对应业务服务器进行执行,并且将业务数据串联;
4、任务执行工具:安装于全网服务器中,每个单一业务的最终执行主体。
方案主要涉及六个主要过程:
1、任务录入:运营人员和脚本提供人员可以在平台中录入相应的脚本及对应入参;
2、任务分配:负责对代理服务器任务的协调;
3、任务获取:代理服务器定时向web服务器拉取待执行任务;
4、任务执行:任务执行分为串联路执行和业务服务器执行具体脚本。
5、结果上报:代理服务器将各个业务服务器的执行结果串联之后,输出最终结论返回web服务器;
6、结果展示:web服务器对结果进行结构话展示。
过程详细介绍:
1、web任务录入:
web应用页面提供相应的脚本参数录入页面,最终形成参数的格式,如表1、2所示,
{ "task":[#任务数组 { "busi_group_id":"1",#业务组id,用于区分不同业务 "task_id":"89",#任务id "time_out":"23s",#超时间 "retry":5,#重试次数 "param":[#执行参数 { "name":"xxx",#参数名称 "value":"xxx"#参数值 } ], "script_content":"xxx",#脚本内容 "script_type":"shell"#脚本类型,目前支持python和shell两种 } ] } |
表1 web应用执行脚本数据格式
一般使用过程中,如果是相对独立的业务,则仅需要通过运行执行脚本,运营人员需要对业务进行诊断时,可以选择自己录入的任务或者同组成员分享的脚本,暨提供了脚本保存及复用功能。
执行参数:
执行环境 |
获取方式 |
shell |
“$param” |
python |
os.getenv(“param”) |
执行脚本:
根据脚本类型,入录相关类型脚本即可,此处通过提供agentcmd ‘$ip’ ‘$cmd’指令可将需要再远程机器上执行的cmd指令无感知的在代理服务中运行。
{ "last_update": 1679020805,#最后更新时间 "is_change": true,#是否变化 "data": [#数组脚本内容 { "name": "hello",#公共脚本名称 "busi_group_id": 2,#业务组id,用于区分不同业务 "chmod": "555",#脚本权限 "script_type": "shell",#脚本类型 "script_text": "xxxx"#脚本内容 } ] } |
表2 web应用公共脚本数据格式
公共脚本在同一业务的代理服务器中 当有业务需要同时请求某个或者某些第三方接口时,可以通过公共脚本进行维护,公共脚本在代理服务器上为长期存在,则需要进行权限限制,如涉及敏感数据,只需要让使用方关注到入参及出参,则设置为 111权限。
脚本类型 |
引入方式 |
shell |
source /usr/local/diagnose_agent/{id}/common/{name}.sh |
python |
import sys sys.path.append('./common') sys.path.append('/usr/local/diagnose_agent/{id}/common') |
公共脚本的引用方式:
2、任务分配:
任务代理工具根据所代理业务特性被分为不同的组别,每个业务类型根据可以设定对应的分配频率,并行任务上限,超过任务上限任务派发策略,最终决策出各个代理工具下次需要执行的任务,定义数据格式如表3所示:
{ "type1":{# 业务类型 "timerInterval":15, #定时任务执行频率 "taskLimit":10,# 并行任务数 "outOfLimitTacticsType":"discard",#超过并行任务数执行策略,快速失败或者等待 "heartbeatLimit":60 # 心跳时间,超过对应时间没有上报心跳则任务不可用 }, "type2":{ "timerInterval":15, "taskLimit":15, "outOfLimitTacticsType":"wait", "heartbeatLimit":60 } } |
表3 代理服务器任务策略格式
3、任务获取:
代理服务器,定时跟web服务器反馈心跳信息,同时web服务器返回对应任务分配结果。
4、任务执行:
代理服务器获取到待执行任务后,根据任务定义的脚本、脚本类型、超时时间开启对应的虚拟环境进行运行,当出现解析、请求、文件获取、网络波动等情况超时,根据用户定义的重试次数进行可多次执行。其中代理服务器通过识别脚本中agentcmd ‘$ip’ ‘$cmd’ 指令获取对应远程机器执行cmd命令后执行结果。
5、结果上报:
代理服务器执行完对应任务后,通过web提供的接口resultReport,进行结果反馈,如表4所示:
{ "task_id": "1", # 任务id "agent_name": "cdn-xxx", # 代理服务器名称 "cost": "12.23s",#本次执行耗时 "script_path": "/var/diagnose_agent/scripts/2023-04-28/7_65.sh", #本次执行脚本及日志 "status": 0,# 直接结果状态 "start_time": "2023-04-28 14:14:23",#开始执行时间 "output": "xxxx" # 执行结果,可为markdown格式 } |
表4 代理服务器反馈结果数据格式
6、结果展示:
为了方便运营人员阅读诊断执行结果,web应用提供了markdown格式展示功能,此部分web平台也进行了相应的markdown语法预置,脚本录入方也可自定义结果的输出格式化为自定的markdown格式,如表5所示:
<details open> <summary> 场景执行情况</summary>
+ |入口对象 | 场景对象 | 场景名称 | 场景描述 | 检测项目 | 检测状态 | 错误信息 | 根因标识 | 恢复建议 | 备注 | |---|---|---|---|---|---|---|---|---|---| | xx-xxx | xx-xxx | eck_cluster | xx集群诊断 | 创建安全组 | [92m]正常| | 否 | | | | xx-xxx | xx-xxx | xx_cluster | xx集群诊断 | 创建nat | [92m]正常| | 否 | | | | xx-xxx | xx-xxx | xx_cluster | xx集群诊断 | 创建虚机 | [92m]正常| | 否 | | | | xx-xxx | xx-xxx | xx_cluster | xx集群诊断 | 创建xx | [92m]正常 | | 否 | | | | xx-xxx | xx-xxx | xx_cluster | xx集群诊断 | 初始化k8s组件_xxx任务[ping] | [91m]异常 | 执行失败,执行时间是:2023-03-28 20:10:45 | 否 | </details>
|