public boolean checkCloudAssistant()

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;
    }