发现 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 值;部署者需要创建规则,因此他们应该熟悉规则、规则条件和动作;对于简单的情况,可以使用示例规则。
开发者影响¶
开发人员可以根据他们的需求创建额外的条件和动作,以扩展发现过程。
依赖项¶
无
测试¶
将添加单元、功能和集成测试。