[ Server ] [ Executor ] - 添加基础初始化的核心部分

This commit is contained in:
zeaslity
2023-10-23 16:26:48 +08:00
parent d9c1c0fb91
commit b42748cfbb
9 changed files with 292 additions and 9 deletions

View File

@@ -0,0 +1,81 @@
package io.wdd.func.auto.beans;
public enum BaseFunctionEnum {
SHUTDOWN_FIREWALL(
"shutdownFirewall",
"关闭防火墙"
),
DISABLE_SWAP(
"disableSwap",
"关闭虚拟内存"
),
MODIFY_HOSTNAME(
"modifyHostname",
"修改主机名称, args 主机名"
),
INSTALL_DEFAULT_SSH_KEY(
"installDefaultSSHKey ",
"安装默认SSH-Key"
),
DISTRIBUTE_SSH_KEY(
"distributeSSHKey",
"分发SSH-Key"
),
INSTALL_DOCKER(
"installDocker",
"安装Docker, args固定为19或20"
),
INSTALL_DOCKER_COMPOSE(
"installDockerCompose",
"安装Docker Compose, 默认为2.18.0版本"
),
INSTALL_HARBOR(
"installHarbor",
"安装Harbor, 默认为2.1.0版本"
),
CHRONY_TO_PUBLIC_NTP(
"chronyToPublicNTP",
"时间同步至公网NTP服务器"
),
INSTALL_ZSH(
"installZSH",
"安装配置ZSH"
),
CHRONY_TO_MASTER(
"chronyToMaster",
"时间同步至Master, args为 Master节点IP"
);
String funcName;
String desc;
BaseFunctionEnum(String funcName, String desc) {
this.funcName = funcName;
this.desc = desc;
}
public String getFuncName() {
return funcName;
}
public String getDesc() {
return desc;
}
}

View File

@@ -0,0 +1,25 @@
package io.wdd.func.auto.beans;
import io.swagger.annotations.ApiModel;
import io.wdd.server.beans.po.ServerInfoPO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder(toBuilder = true)
@ApiModel("项目实施阶段的上下文实体类")
public class ProjectDeployContext {
Long projectId;
ServerInfoPO masterNode;
List<ServerInfoPO> agentNodeList;
}

View File

@@ -0,0 +1,125 @@
package io.wdd.func.auto.service;
import io.wdd.func.auto.beans.BaseFunctionEnum;
import io.wdd.func.auto.beans.ProjectDeployContext;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;
@Service
@Slf4j
public class BaseFuncScheduler {
@Resource
FuncService funcService;
public boolean runProcedure(ProjectDeployContext projectDeployContext) {
// before run
// check base requirement
beforeRunProcedure(projectDeployContext);
// during run
doRunProcedure(projectDeployContext);
// after run
afterRunProcedure();
return true;
}
private void afterRunProcedure() {
// 检查是否安装完成, 对安装环境进行判定
}
private void doRunProcedure(ProjectDeployContext projectDeployContext) {
// 执行 基础功能施工的内容
String masterTopicName = projectDeployContext
.getMasterNode()
.getTopicName();
List<String> agentTopicNameList = projectDeployContext
.getAgentNodeList()
.stream()
.map(agentNode -> agentNode.getTopicName())
.collect(Collectors.toList());
if (!MasterNodeProcedure(masterTopicName)) {
log.error("初始化过程错误! 即将终止!");
}
if (!AgentNodeProcedure(agentTopicNameList)) {
log.error("初始化过程错误! 即将终止!");
}
log.info("初始化过程完成!");
}
private void beforeRunProcedure(ProjectDeployContext projectDeployContext) {
// 检查是否符合规定
// 检查每一个Agent是否能够连通,调用命令返回结果
// 打印施工信息
}
private boolean MasterNodeProcedure(String masterTopicName) {
List<BaseFunctionEnum> masterNodeProcedureList = List.of(
BaseFunctionEnum.DISABLE_SWAP,
BaseFunctionEnum.SHUTDOWN_FIREWALL,
BaseFunctionEnum.CHRONY_TO_PUBLIC_NTP,
BaseFunctionEnum.INSTALL_DEFAULT_SSH_KEY,
BaseFunctionEnum.INSTALL_DOCKER,
BaseFunctionEnum.INSTALL_DOCKER_COMPOSE,
BaseFunctionEnum.INSTALL_HARBOR,
BaseFunctionEnum.INSTALL_ZSH
);
/*funcService.callBaseFuncAndJudge(
masterTopicName,
BaseFunctionEnum.MODIFY_HOSTNAME,
List.of("master-node")
);*/
for (BaseFunctionEnum procedure : masterNodeProcedureList) {
if (funcService.callBaseFuncAndJudge(
masterTopicName,
procedure,
null
)) {
log.error(
"MasterNode初始化错误 => {}",
procedure
);
return false;
}
}
return true;
}
private boolean AgentNodeProcedure(List<String> agentTopicNameList) {
return true;
}
}

View File

@@ -1,6 +1,8 @@
package io.wdd.func.auto.service; package io.wdd.func.auto.service;
import io.wdd.func.auto.beans.BaseFunctionEnum;
import java.util.List; import java.util.List;
@@ -11,4 +13,13 @@ public interface FuncService {
List<String> callAppFuncService(String agentTopicName, String appFunctionName, List<String> funcArgs); List<String> callAppFuncService(String agentTopicName, String appFunctionName, List<String> funcArgs);
/**
* 调用基本脚本,返回正确或者错误的结果
*
* @param baseFunctionEnum
* @param funcArgs
* @return
*/
boolean callBaseFuncAndJudge(String agentTopicName, BaseFunctionEnum baseFunctionEnum, List<String> funcArgs);
} }

View File

@@ -1,9 +1,11 @@
package io.wdd.func.auto.service; package io.wdd.func.auto.service;
import io.wdd.func.auto.beans.BaseFunctionEnum;
import io.wdd.rpc.execute.ExecutionMessageType; import io.wdd.rpc.execute.ExecutionMessageType;
import io.wdd.rpc.execute.service.ExecutionService; import io.wdd.rpc.execute.service.ExecutionService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.ArrayList; import java.util.ArrayList;
@@ -39,6 +41,45 @@ public class FuncServiceImpl implements FuncService {
); );
} }
@Override
public boolean callBaseFuncAndJudge(String agentTopicName, BaseFunctionEnum baseFunctionEnum, List<String> funcArgs) {
log.debug(
"调用基本脚本 => {}",
baseFunctionEnum.getDesc()
);
List<String> syncResultLog = syncCallFunction(
agentTopicName,
ExecutionMessageType.BASE,
baseFunctionEnum.getFuncName(),
funcArgs
);
if (CollectionUtils.isEmpty(syncResultLog)) {
log.error("基本脚本调用失败!");
return false;
}
if (syncResultLog
.get(0)
.endsWith("true")) {
log.debug(
"基本脚本调用成功 => {}",
syncResultLog
);
return true;
}
log.error(
"基本脚本调用失败 !! => {}",
syncResultLog
);
return false;
}
// 归一化调用 // 归一化调用
private List<String> syncCallFunction(String agentTopicName, ExecutionMessageType emType, String funcName, List<String> funcArgs) { private List<String> syncCallFunction(String agentTopicName, ExecutionMessageType emType, String funcName, List<String> funcArgs) {

View File

@@ -70,7 +70,7 @@ public class ProjectController {
@PostMapping("/delete") @PostMapping("/delete")
@ApiOperation("项目-删除一个项目") @ApiOperation("项目-删除一个项目")
public R<String> projectDelete( public R<String> projectDelete(
@RequestParam(value = "projectId", name = "项目的Id") @ApiParam(value = "项目的Id") Long projectId @RequestParam(value = "projectId", name = "projectId") @ApiParam(name = "projectId", value = "projectId") Long projectId
) { ) {
String result = "删除项目成功!"; String result = "删除项目成功!";

View File

@@ -56,7 +56,7 @@ public class RoleController {
@PostMapping("/delete") @PostMapping("/delete")
@ApiOperation("角色-删除一个角色") @ApiOperation("角色-删除一个角色")
public R<String> roleDelete( public R<String> roleDelete(
@RequestParam(value = "roleId", name = "角色的Id") @ApiParam(value = "角色的Id") Long roleId @RequestParam(value = "roleId", name = "roleId") @ApiParam(value = "roleId") Long roleId
) { ) {
String result = "删除角色成功!"; String result = "删除角色成功!";

View File

@@ -6,7 +6,7 @@ spring:
allow-circular-references: true allow-circular-references: true
allow-bean-definition-overriding: true allow-bean-definition-overriding: true
rabbitmq: rabbitmq:
host: 42.192.52.227 host: 192.168.35.71
port: 20672 port: 20672
username: boge username: boge
password: boge8tingH password: boge8tingH
@@ -21,7 +21,7 @@ spring:
max-interval: 65000 max-interval: 65000
initial-interval: 65000 initial-interval: 65000
redis: redis:
host: 42.192.52.227 host: 192.168.35.71
port: 21370 port: 21370
database: 0 database: 0
password: boge8tingH password: boge8tingH
@@ -50,7 +50,7 @@ spring:
time-between-eviction-runs: 50000 time-between-eviction-runs: 50000
datasource: datasource:
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://42.192.52.227:21306/octopus_server?autoReconnect=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8 url: jdbc:mysql://192.168.35.71:21306/octopus_server?autoReconnect=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
username: boge username: boge
password: boge8tingH password: boge8tingH
type: com.zaxxer.hikari.HikariDataSource type: com.zaxxer.hikari.HikariDataSource

View File

@@ -6,7 +6,7 @@ spring:
allow-circular-references: true allow-circular-references: true
allow-bean-definition-overriding: true allow-bean-definition-overriding: true
rabbitmq: rabbitmq:
host: 192.168.35.71 host: 42.192.52.227
port: 20672 port: 20672
username: boge username: boge
password: boge8tingH password: boge8tingH
@@ -21,7 +21,7 @@ spring:
max-interval: 65000 max-interval: 65000
initial-interval: 65000 initial-interval: 65000
redis: redis:
host: 192.168.35.71 host: 42.192.52.227
port: 21370 port: 21370
database: 0 database: 0
password: boge8tingH password: boge8tingH
@@ -50,7 +50,7 @@ spring:
time-between-eviction-runs: 50000 time-between-eviction-runs: 50000
datasource: datasource:
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.35.71:21306/octopus_server?autoReconnect=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8 url: jdbc:mysql://42.192.52.227:21306/octopus_server?autoReconnect=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
username: boge username: boge
password: boge8tingH password: boge8tingH
type: com.zaxxer.hikari.HikariDataSource type: com.zaxxer.hikari.HikariDataSource