in src/main/java/com/aliyun/cloudops/acs/ecs/toolkit/CloudAssistant.java [169:206]
public boolean checkCloudAssistant(RunCommandRequest request) throws ClientException {
List<String> instanceIds = request.getInstanceIds().stream()
.filter(StringUtils::isNotEmpty).distinct() // 去除空白或重复的ECS实例ID
.collect(Collectors.toList());
request.setInstanceIds(instanceIds);
// 相关API:https://next.api.aliyun.com/document/Ecs/2014-05-26/DescribeCloudAssistantStatus
DescribeCloudAssistantStatusRequest describe = new DescribeCloudAssistantStatusRequest();
describe.setSysRegionId(request.getSysRegionId());
describe.setInstanceIds(instanceIds);
DescribeCloudAssistantStatusResponse response = this.acsClient.sendRequest(describe);
List<InstanceCloudAssistantStatus> statusSet = response.getInstanceCloudAssistantStatusSet();
if (CommandType.RunShellScript.name().equals(request.getType())) {
// RunShellScript 类型的命令,不支持在 Windows 实例上执行
if (statusSet.stream().anyMatch(vm -> OS_WINDOWS.equalsIgnoreCase(vm.getOSType()))) {
logger.error("{} request is not allowed for Windows system.", request.getType());
return false;
}
} else {
if (statusSet.stream().anyMatch(vm -> OS_LINUX.equalsIgnoreCase(vm.getOSType()))) {
logger.error("{} request is not allowed for Linux system.", request.getType());
return false;
}
}
statusSet.forEach(vm -> {
// ECS实例上没有云助手,或云不在运行中,极有可能无法将该命令发送到ECS实例上并执行。
// 安装云助手,见:https://help.aliyun.com/zh/ecs/user-guide/install-the-cloud-assistant-agent
// 排查云助手异常: https://help.aliyun.com/zh/ecs/user-guide/configure-network-permissions-for-the-cloud-assistant-agent
if (StringUtils.isEmpty(vm.getCloudAssistantVersion())) {
logger.warn("instance {} cloud assistant not installed.", vm.getInstanceId());
} else if (!STATUS_OK.equals(vm.getCloudAssistantStatus())) {
logger.info("instance {} cloud assistant not running.", vm.getInstanceId());
}
});
return true;
}