Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FEATURE] 订阅支持按操作系统等主机属性进行范围筛选 #1452

Closed
pagezz-canway opened this issue Feb 21, 2023 · 3 comments
Closed
Assignees
Labels
done 已上线到正式环境并验收通过

Comments

@pagezz-canway
Copy link

你想要什么功能
节点管理动态TOPO下发问题-支持按主机属性(如操作系统类型)筛选

为什么需要
日志产品具备采集windows事件日志的功能,并使用节点管理的能力支持动态TOPO下发。windows事件日志只有windows系统才会有,但是现在节点管理动态TOPO下发不支持指定系统类型下发,导致linux系统也会下发windows事件日志的采集配置文件,导致垃圾配置数据。

建议如何实现
日志中心目前使用的是节点管理的订阅接口,节点管理订阅任务下发实例为节点时,支持指定操作系统类型进行下发操作。
image

@ZhuoZhuoCrayon
Copy link
Member

方案

接口

订阅相关接口的 scope 新增 instance_selector 参数

instance_selector 参数为列表类型,结构同 apps/node_man/serializers/base.py HostSearchSerializer 中的 conditions

{
    "instance_selector": [{"key": "os_type", "value": ["Windows"]}]
}

订阅范围二次过滤

apps/backend/subscription/tools.py get_instances_by_scope 末尾,返回前进行二次过滤

二次过滤复用 apps/core/ipchooser/tools/base.py multiple_cond_sql,筛选条件:

  • 主机 ID 列表(防止过滤条件全表查询):instances_dict 可以获取所有的 bk_host_id
  • instance_selector

以下是一个 instance 的结构:

企业微信截图_916dbcac-05e3-4a6d-9629-8dac0ee8139b

需要注意的地方

  • 第一次安装 Agent 没有 bk_host_id,并且表里也没有数据,这部分实例不能被过滤掉
  • instance_selector 值为 [] 表示过滤掉全部,None 表示不进行过滤

自测

  • 原订阅(没有 instance_selector):不做二次过滤
  • instance_selector:过滤出订阅里的的 Windows 机器
  • 第一次安装 Agent
  • 重装 Agent
  • 重装 Agent(带上 instance_selector
  • 订阅(按服务实例/拓扑下发),测试 instance_selector

@ZhuoZhuoCrayon ZhuoZhuoCrayon changed the title [FEATURE]节点管理动态TOPO下发问题-支持按主机属性(如操作系统类型)筛选 [FEATURE] 订阅支持按操作系统等主机属性进行范围筛选 May 15, 2023
@neko12583
Copy link
Collaborator

neko12583 commented Jun 13, 2023

大概设计

订阅相关接口的参数 scope 增加 instance_selector ,对订阅范围进行二次过滤,在 get_instances_by_scope 中借助 multiple_cond_sql 增加第二层过滤

序列化器

instance_selector 数据结构为列表,元素为二次过滤参数的字典

创建新序列化器 SubscriptionScopeInstanceSelectorSerializer

序列化器 ScopeSerializer 继承 SubscriptionScopeInstanceSelectorSerializer

SubscriptionScopeInstanceSelectorSerializer 中:

instance_selector = serializers.ListField(
    child=serializers.DictField(),
    required=False,
    default=[],
    label="实例筛选器"
)

参数合法性

理论上该值为主机属性

不对字典中键值进行限制,该需求主要为 os_type 字段做二次过滤

原有 apps/core/ipchooser/tools/base.py -> multiple_cond_sql 中有对操作系统的处理,不需额外操作

multiple_cond_sql 中已做防注入处理

根据筛选条件生成查询语句(考虑查询性能)

查询性能

get_instances_by_scopeinstance 中带有 bk_host_id ,先提取 bk_host_id 为列表

bk_host_id_list 作为 multiple_cond_sql 二次筛选的条件之一,避免全表扫描

第一次安装agent时,instance 中没有 bk_host_id,不进行二次过滤,原因为该需求为针对插件类操作

instance_selectorNone 时,不做二次过滤

instance_selector[] 时,过滤全部

@neko12583
Copy link
Collaborator

功能自测

安装 agent

安装 agent 实际请求后台创建订阅接口为 saas 层代码控制,不带 instance_selector

1、新安装 agent,不过滤
第一次安装agent不过滤

2、重装 agent 不过滤
重装agent不过滤

安装插件

1、安装插件,不带主机属性过滤,执行预览
安装插件正常执行预览

2、安装插件,不带主机属性过滤,任务详情
正常下发插件

3、修改其中一台主机操作系统为 windows
修改主机操作系统

4、安装插件,携带主机属性过滤,发起请求
安装插件增加过滤条件

5、安装插件,携带主机属性过滤,执行预览
预安装增加筛选条件

6、安装插件,携带主机属性过滤,任务详情
安装插件过滤结果

策略部署

1、策略部署,不带主机属性过滤,不选择手动修改操作系统的机器
部署策略不带主机属性筛选

2、策略部署,不带主机属性过滤,其中一台为手动修改操作系统的机器
策略部署带主机属性过滤

策略部署带主机属性过滤效果

任务巡检

1、将手动修改的操作系统改回linux
将主机属性变更回linux

2、执行任务巡检,由于会检测 is_running 需将前面插件进程由成功改为失败,然后后台手动触发
主动触发任务巡检

任务巡检根据主机属性进行计算

服务模板

1、查询服务模板下主机
服务模板下主机情况

2、修改其中一台主机操作系统为 windows
修改主机架构为windows

3、发起请求,携带主机属性过滤
saas发起任务

saas发起任务1

4、查看任务情况
数据库任务详情

数据库任务详情1

@wyyalt wyyalt added tested 已经在测试环境验收通过 done 已上线到正式环境并验收通过 and removed tested 已经在测试环境验收通过 labels Sep 5, 2023
@github-project-automation github-project-automation bot moved this to Done in v2.4.1 Aug 29, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
done 已上线到正式环境并验收通过
Projects
Status: Done
Development

No branches or pull requests

5 participants