发现 ironic 节点

https://bugs.launchpad.net/ironic-inspector/+bug/1524753

此规范提出自动发现 Ironic 节点的功能。

问题描述

大型网络可能包含数百台服务器。跟踪这些服务器可能是一个耗时的过程。自动发现可以简化将新服务器添加到 Ironic 的过程。它会自动识别资源,从而可以对其进行管理。目前,Ironic 无法自动检测节点。操作员必须手动创建节点并为其提供驱动程序信息。

提议的变更

即使节点不存在于 inspector 节点缓存中,仍然可以启动它们并返回检查信息进行处理,node-not-found-hook 钩子会在 inspector 收到无法识别的节点信息时运行。为了自动发现,将编写一个新的钩子,它将在此点进行插件,称为 enroll

该钩子将使用 fake 驱动程序(此驱动程序是一个可配置选项,设置配置文件中的 enroll_node_driver 允许更改 Ironic 驱动程序)将未知的节点注册到 Ironic。 此外,enroll 钩子将在我们收到的内省数据中可用时,将 ipmi_address 属性设置为新节点。

为了自定义发现,将使用内省规则,它允许操作员控制发现过程。一个简单的规则,用于匹配所有新节点并使用 agent_ipmitool 驱动程序将其注册到 Ironic,如下所示

"description": "Set IPMI driver_info if no address or credentials",
"actions": [
    {'action': 'set-attribute', 'path': 'driver', 'value': 'agent_ipmitool'},
    {'action': 'set-attribute', 'path': 'driver_info/ipmi_address',
     'value': '{data[ipmi_address]}'},
    {'action': 'set-attribute', 'path': 'driver_info/ipmi_username',
     'value': 'username'},
    {'action': 'set-attribute', 'path': 'driver_info/ipmi_password',
     'value': 'password'}
]
"conditions": [
    {'op': 'eq', 'field': 'node://driver_info/ipmi_password',
     'multiple': 'all', 'value': None},
    {'op': 'eq', 'field': 'node://driver_info/ipmi_username',
     'multiple': 'all', 'value': None}
]


"description": "Set deploy info if not already set on node",
"actions": [
    {'action': 'set-attribute', 'path': 'driver_info/deploy_kernel',
     'value': '<glance uuid>'},
    {'action': 'set-attribute', 'path': 'driver_info/deploy_ramdisk',
     'value': '<glance uuid>'},
]

"conditions": [
    {'op': 'eq', 'field': 'node://driver_info.deploy_ramdisk',
     'multiple': 'all', 'value': None},
    {'op': 'eq', 'field': 'node://driver_info.deploy_kernel',
     'multiple': 'all', 'value': None}
]

规则更改

  • 条件更改:扩展字段 field,目前它表示一个 JSON 路径,用于在内省数据中进行比较的字段。但有时需要比较来自节点的数据(例如,deploy_ramdisk 与 None 进行比较),因此为了获取来自节点的数据,建议添加 node://data:// 模式。它将允许使用来自节点信息和内省的路径获取数据(data:// 是默认模式,以保持向后兼容性)

    node://driver_info.deploy_ramdisk - ``deploy_ramdisk`` attribute from
                                          node's driver_info.
    data://memory_mb                  - ``memory_mb`` attribute from
                                          introspection data.
    
  • 动作更改:目前无法将检查数据中的值分配给节点,为了解决这个缺点,建议将标准 python 格式 Python 格式 添加到 value 字段。例如,set-attribute 在 Ironic 节点上设置一个属性。它需要 path 字段,它是 Ironic 中属性的路径,例如``driver_info/ipmi_username``,以及要设置的 value。其中 value 是一个简单的值,它被分配给路径

    {data[ipmi_address]} - ``ipmi_address`` attribute from introspection
                           data will be fetched.
    

通过 enroll 钩子发现和注册的所有节点,将在内省数据中包含一个 auto_discovered 标志,该标志可以使内省规则使用规则条件 eq 区分手动注册的节点和自动发现的节点

"description": "Enroll auto-discovered nodes with fake driver",
"actions": [
    {'action': 'set-attribute', 'path': 'driver', 'value': 'fake'}
]
"conditions": [
    {'op': 'eq', 'field': 'data://auto_discovered', 'value': True}
]

创建新的动作将允许以不同的方式使用节点信息。 提出的方法非常灵活,因此可以根据操作员的规范在此处添加更复杂的条件和动作。

操作员实现自动发现的步骤如下
  • 操作员创建一个新规则或使用预定义的 discovery rule

  • 操作员将规则导入到 Inspector;

  • 在导入规则后,所有节点都将使用它进行发现。

备选方案

继续手动注册节点并运行检查。但这对于大型重要的环境来说不是一种合适的方法。

API 影响

性能和可扩展性影响

安全影响

部署者影响

注意:在发现之前,应将配置选项 node_not_found_hook 分配给 enroll_node_not_found_hook 值;部署者需要创建规则,因此他们应该熟悉规则、规则条件和动作;对于简单的情况,可以使用示例规则。

开发者影响

开发人员可以根据他们的需求创建额外的条件和动作,以扩展发现过程。

实现

负责人

  • Anton Arefiev(aarefiev)

工作项

  • 扩展条件和动作以支持提出的格式;

  • 使用单元测试和集成测试覆盖新功能;

  • 添加示例规则;

  • 更新文档。

依赖项

测试

将添加单元、功能和集成测试。

参考资料