用法¶
有关 HTTP API 的信息,请参阅 API 参考。有关如何使用 CLI 和 Python 库的信息,请参阅 客户端文档。
从 Ironic API 使用¶
Ironic Kilo 引入了硬件内省的支持,名称为“inspection”。ironic-inspector 内省支持某些通用驱动程序,请参阅 Ironic inspection 文档 以获取详细信息。
节点状态¶
在进行内省之前,节点应移动到
MANAGEABLE置备状态(需要版本为 0.5.0 或更高版本的 python-ironicclient)baremetal node manage <node>
可以使用以下命令触发内省
baremetal node inspect <node>
在成功内省后,并且在部署节点之前,应通过将它们移动到
AVAILABLE状态,使它们可供 Nova 使用baremetal node provide <node>
注意
由于 Nova 与 Ironic 驱动程序的交互方式,在发出此命令后,Nova 需要等待 1 分钟才能意识到可用的节点。使用
nova hypervisor-stats命令的输出进行检查。
内省规则¶
Inspector 支持一个简单的基于 JSON 的 DSL,用于定义在内省期间运行的规则。Inspector 提供了一个 API 来管理这些规则,并在运行所有处理钩子之后自动运行它们。
一条规则由要检查的条件和要运行的操作组成。如果条件在内省数据上评估为 true,则在节点上运行操作。
请参阅以下命令以导入内省规则
baremetal introspection rule import <json file>
可用的条件和操作由插件定义,并且可以扩展,请参阅 如何贡献 以获取详细信息。请参阅 API 参考 以获取定义内省规则的具体调用。
条件¶
条件由具有字段的对象表示
op 比较操作的类型,默认可用运算符包括
eq、le、ge、ne、lt、gt- 基本比较运算符;in-net- 检查 IP 地址是否在给定的网络中;matches- 需要与给定的正则表达式完全匹配;contains- 需要值包含给定的正则表达式;is-empty- 检查字段是否为空字符串、列表、字典或 None 值。
field 一个 JSON 路径 到内省数据中用于比较的字段。
从 Mitaka 版本开始,您还可以将条件应用于 ironic 节点字段。使用模式 (data:// 或 node://) 作为字段前缀,以区分来自内省数据和节点的值。两种方案都使用 JSON 路径
{"field": "node://property.path", "op": "eq", "value": "val"}
{"field": "data://introspection.path", "op": "eq", "value": "val"}
如果缺少方案(节点或数据),则条件会将数据与内省数据进行比较。
invert 布尔值,确定是否反转比较结果。
multiple 如何处理 field 查询返回多个结果的情况(例如,该字段包含一个列表),可用选项是
any(默认)要求任何一个匹配,all要求所有都匹配,first要求第一个匹配。
所有其他字段都传递给条件插件,例如,数字比较操作需要一个 value 字段进行比较。
范围¶
默认情况下,内省规则应用于正在内省的所有节点。为了使规则仅应用于特定的节点,必须将匹配的作用域变量设置为规则和节点。要在规则中设置作用域,请在导入 JSON 文件之前包含字段 "scope"。例如
cat <json file>
{
"description": "...",
"actions": [...],
"conditions": [...],
"scope": "SCOPE"
}
在要应用规则的节点上设置属性 inspection_scope
baremetal node set --property inspection_scope="SCOPE" <node>
现在,在内省时,该规则仅应用于具有匹配作用域值的节点。它还会忽略未设置 inspection_scope 属性的节点。请注意,如果规则没有设置作用域,则它将应用于所有节点,无论它们是否设置了 inspection_scope 属性。
行动¶
操作由具有字段的对象表示
action 操作类型。可能的值由插件定义。
所有其他字段都传递给操作插件。
默认可用操作包括
fail内省失败。需要一个message参数作为失败消息。set-attribute设置 Ironic 节点上的属性。需要一个path字段,它是 ironic 中使用的属性的路径(例如,/properties/something),以及一个要设置的value。set-capability设置 Ironic 节点上的功能。需要name和value字段,它们分别是要添加的功能的名称和值。现有值将被替换。extend-attribute与set-attribute相同,但将现有值视为列表并附加值。如果可选参数unique设置为True,则如果给定值已在列表中,则不会添加任何内容。add-trait将特征添加到 Ironic 节点。需要一个name字段,其中包含要添加的特征的名称。remove-trait从 Ironic 节点中删除特征。需要一个name字段,其中包含要删除的特征的名称。
从 Mitaka 版本开始,value 字段中的操作支持使用 python 字符串格式化表示法 从内省中获取数据
{"action": "set-attribute", "path": "/driver_info/ipmi_address",
"value": "{data[inventory][bmc_address]}"}
请注意,以这种方式引用的任何值都将被转换为字符串。
如果 value 是一个字典或列表,则结构中任何级别的字符串都将被格式化
{"action": "set-attribute", "path": "/properties/root_device",
"value": {"serial": "{data[root_device][serial]}"}}
插件¶
ironic-inspector 严重依赖插件进行数据处理。即使是标准功能也主要基于插件。设置配置文件的 processing_hooks 选项以更改在内省数据上运行的插件集。请注意,在此选项中顺序 很重要,特别是对于具有依赖于其他钩子的钩子的情况。
这些插件默认启用,除非您了解自己在做什么,否则不应禁用它们
scheduler验证并更新基本的硬件调度属性:CPU 数量和架构、内存和磁盘大小。
注意
无盘节点具有磁盘大小属性
local_gb == 0。始终使用节点驱动程序root_device提示以防止意外的 HW 故障静默通过。validate_interfaces验证网络接口信息。创建新的端口,可选地删除内省数据中不存在的端口。还为 PXE 启动端口设置
pxe_enabled标志,并为所有其他端口取消设置,以避免 nova 选择随机端口来启动节点。注意
当
pxe_filter配置为仅为已知的 MAC 地址打开 DHCP 服务器时,即启用了[pxe_filter]deny_unknown_macs配置选项,则无法依赖validate_interfaces处理插件在 ironic 中创建 PXE 启动端口。在这种情况下,节点必须在内省之前至少有一个注册端口。
以下插件默认启用,但如果不需要可以禁用
ramdisk_error如果 ramdisk 设置了
error字段,则报告错误,并可选地存储来自logs字段的日志,有关详细信息,请参阅 API 参考。capabilities检测节点功能:CPU、启动模式等。有关详细信息,请参阅 功能检测。
pci_devices收集 ramdisk 返回的所有 PCI 设备列表,并与配置文件的
pci_devices部分中的alias字段中定义的 PCI 设备进行比较。然后将识别的 PCI 设备及其计数存储在节点属性中。此信息以后可用于 nova 调度的节点。
这里有一些可以额外启用的插件
example示例插件记录其输入和输出。
raid_device从 ramdisk 收集块设备并在多次运行中公开根设备。
extra_hardware将 ramdisk 返回的“data”键的值作为 JSON 编码的字符串存储在 Swift 对象中。该插件还会尝试将数据转换为内省规则可用的格式。如果成功,则新的格式将存储在“extra”键中。然后从内省数据中删除“data”键,因为除非转换,否则假定它无法被内省规则使用。
lldp_basic处理来自检查的 LLDP 数据,解析来自 Basic Management (802.1AB)、802.1Q 和 802.3 组的 TLV,并将处理后的数据存储回 Ironic inspector 数据库。要在 IPA 的库存中启用 LLDP,应将
ipa-collect-lldp=1作为内核参数传递给 IPA ramdisk。local_link_connection处理来自检查的 LLDP 数据,特别是查找端口 ID 和机箱 ID。如果找到,它将使用该数据配置 Ironic 端口上的本地链路连接信息。要在 IPA 的库存中启用 LLDP,应将
ipa-collect-lldp=1作为内核参数传递给 IPA ramdisk。为了避免两次处理原始 LLDP 数据,应先安装并运行lldp_basic插件。physnet_cidr_map如果 IP 地址在配置的 CIDR 映射中,则配置节点 Ironic 端口的
physical_network属性。CIDR 到物理网络的映射在配置中使用[port_physnet]/cidr_map选项设置,例如[port_physnet] cidr_map = 10.10.10.0/24:physnet_a, 2001:db8::/64:physnet_b
accelerators处理来自检查的 PCI 数据并与加速器库存进行比较,如果找到任何加速器设备,它将更新加速器设备信息到 ironic 节点的属性字段,例如
{'local_gb': '1115', 'cpus': '40', 'cpu_arch': 'x86_64', 'memory_mb': '32768', 'capabilities': 'boot_mode:bios,cpu_vt:true,cpu_aes:true,cpu_hugepages:true,cpu_hugepages_1g:true,cpu_txt:true', 'accel': [{'vendor_id': '10de', 'device_id': '1eb8', 'type': 'GPU', 'pci_address': '0000:82:00.0', 'device_info': 'NVIDIA Corporation Tesla T4'}] }
有关如何编写自己的插件的信息,请参阅 如何贡献。
发现¶
从 Mitaka 开始,ironic-inspector 能够在新节点上注册 Ironic。
现有的 node-not-found-hook 处理 ironic-inspector 接收到它无法识别的节点的内省数据时会发生什么情况。如果节点在未先将其注册到 Ironic 的情况下手动启动,则可能会发生这种情况。
为了进行发现,应将配置文件的 node_not_found_hook 选项设置为加载名为 enroll 的钩子。此钩子将使用 fake-hardware 硬件类型将未识别的节点注册到 Ironic。这是一个可配置的选项:在 ironic-inspector 配置文件中设置 enroll_node_driver 为您想要的硬件类型。您还可以配置在发现时设置的任意字段,例如
[discovery]
enroll_node_driver = ipmi
enroll_node_fields = management_interface:noop,resource_class:baremetal
“enroll”钩子也会在接收到的内省数据中设置新节点的“ipmi_address”属性(如果可用),请参阅 ramdisk callback。
一旦“enroll”钩子完成,ironic-inspector 将以与识别节点相同的方式处理内省数据。它运行处理 插件,然后运行内省规则,这些规则允许进行更可定制的节点配置,请参阅 规则。
用于将节点的 Ironic 驱动程序设置为“ipmi”并填充该驱动程序所需的“driver_info”的规则如下所示
[{
"description": "Set IPMI driver_info if no credentials",
"actions": [
{"action": "set-attribute", "path": "driver", "value": "ipmi"},
{"action": "set-attribute", "path": "driver_info/ipmi_username",
"value": "username"},
{"action": "set-attribute", "path": "driver_info/ipmi_password",
"value": "password"}
],
"conditions": [
{"op": "is-empty", "field": "node://driver_info.ipmi_password"},
{"op": "is-empty", "field": "node://driver_info.ipmi_username"}
]
},{
"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": "is-empty", "field": "node://driver_info.deploy_ramdisk"},
{"op": "is-empty", "field": "node://driver_info.deploy_kernel"}
]
}]
所有通过“enroll”钩子发现和注册的节点,都将在内省数据中包含一个“auto_discovered”标志。该标志使得在使用规则条件“eq”时,可以在内省规则中区分手动注册的节点和自动发现的节点。
{
"description": "Enroll auto-discovered nodes with ipmi hardware type",
"actions": [
{"action": "set-attribute", "path": "driver", "value": "ipmi"}
],
"conditions": [
{"op": "eq", "field": "data://auto_discovered", "value": true}
]
}
重新应用存储数据的内省¶
为了允许纠正内省规则中的错误,API 提供了一个触发存储数据内省的入口点。用于处理的数据与已处理的数据分开存储在 Swift 中。重新应用内省会覆盖存储中的已处理数据。目前不支持通过端点更新内省数据。在重新应用内省之前,会检查以下先决条件
请求中没有发送任何数据
Swift 存储已配置并启用
内省数据存储在 Swift 中,用于节点 UUID
数据库中保留了 UUID 的节点记录
节点 UUID 的内省目前未进行中
如果先决条件失败,将立即向用户返回响应
400如果请求包含数据,或者在配置中 Swift 存储未启用404如果 Ironic 不跟踪节点 UUID409如果节点内省已在进行中
如果满足先决条件,将执行后台任务以执行处理,并向端点用户返回 202 Accepted 响应。根据要求,将在后台任务中执行以下步骤
预处理钩子
后处理钩子,将结果存储在 Swift 中
内省规则
根据功能需求,会避免这些步骤
node_not_found_hook将被跳过电源操作
钩子执行的回滚操作
Limitations
目前无法更新未处理的数据。
未处理的数据永远不会从存储中清除
在后台执行存储数据存在性检查;缺少数据的情况仍然会返回
202响应
功能检测¶
从 Newton 版本开始,Ironic Inspector 可以选择性地发现多个节点功能。要使其工作,需要一个最新的(Newton 或更高版本)的 IPA 镜像。
启动模式¶
可以检测当前的启动模式(BIOS 或 UEFI),并将其记录为 Ironic 中的“boot_mode”功能。它将使某些驱动程序更改其行为以考虑此功能。将 capabilities.boot_mode 配置选项设置为 True 以启用。
CPU 功能¶
默认情况下会检测多个 CPU 标志,并将其记录为以下功能
cpu_aesAES 指令。cpu_vt虚拟化支持。cpu_txtTXT 支持。cpu_hugepages大页面(2 MiB)支持。cpu_hugepages_1g大页面(1 GiB)支持。
可以定义自己的规则来检测 CPU 功能。将 capabilities.cpu_flags 配置选项设置为 CPU 标志与功能之间的映射,例如
cpu_flags = aes:cpu_aes,svm:cpu_vt,vmx:cpu_vt
有关更详细的示例,请参阅此选项的默认值。
InfiniBand 支持¶
从 Ocata 版本开始,Ironic Inspector 支持检测 InfiniBand 网络接口。要使其工作,需要一个最新的(Ocata 或更高版本)的 IPA 镜像。当发现 InfiniBand 网络接口时,Ironic Inspector 会将 client-id 属性添加到 ironic 端口的 extra 属性中。应将 Ironic Inspector 配置为 iptables.ethoib_interfaces,以指示用于物理访问 DHCP 网络的以太网 Over InfiniBand (EoIB)。例如,如果 Ironic Inspector DHCP 服务器使用 br-inspector,并且 br-inspector 具有 EoIB 端口,例如 eth0,则应将 iptables.ethoib_interfaces 设置为 eth0。 iptables.ethoib_interfaces 允许根据 neighs 文件将裸机 GUID 映射到其 EoIB MAC。这对于阻止不属于内省的节点(MAC)的 DHCP 流量是必需的。
文件 /sys/class/net/<ethoib>/eth/neighs 的格式
# EMAC=<ethernet mac of the ethoib> IMAC=<qp number:lid:GUID>
# For example:
IMAC=97:fe:80:00:00:00:00:00:00:7c:fe:90:03:00:29:26:52
qp number=97:fe
lid=80:00:00:00:00:00:00
GUID=7c:fe:90:03:00:29:26:52
内容示例
EMAC=02:00:02:97:00:01 IMAC=97:fe:80:00:00:00:00:00:00:7c:fe:90:03:00:29:26:52
EMAC=02:00:00:61:00:02 IMAC=61:fe:80:00:00:00:00:00:00:7c:fe:90:03:00:29:24:4f