用法

有关 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 比较操作的类型,默认可用运算符包括

  • eqlegeneltgt - 基本比较运算符;

  • 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 节点上的功能。需要 namevalue 字段,它们分别是要添加的功能的名称和值。现有值将被替换。

  • extend-attributeset-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 不跟踪节点 UUID

  • 409 如果节点内省已在进行中

如果满足先决条件,将执行后台任务以执行处理,并向端点用户返回 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_aes AES 指令。

  • cpu_vt 虚拟化支持。

  • cpu_txt TXT 支持。

  • 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 设置为 eth0iptables.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