In-Band Inspection

In-band inspection 涉及在目标节点上启动一个 ramdisk 并直接从中获取信息。此过程比带外 inspection 更脆弱且耗时,但它不依赖于供应商,并且适用于各种硬件。

在 2023.2 “Bobcat” 版本系列中,Ironic 收到了一种实验性的 in-band inspection 实现,该实现不需要单独的 ironic-inspector 服务。

注意

本文档中描述的实现与之前的实现(基于 ironic-inspector)并非 100% 兼容。请查阅文档和发行说明,了解当前有哪些功能可用。

对于 Ironic 2023.2 或更早版本的生产部署,请使用 Inspector 支持

从 2025.1 “Epoxy” 版本开始,inspection 规则已迁移到 Ironic 中。这不包括重新应用存储数据的 inspection 的支持,也不支持 "scope" 字段。

scope 字段允许规则仅应用于具有匹配 scope 值的特定节点,而不是应用于满足条件的所有节点。

Inspection 规则

Inspection 规则

一个 inspection 规则由要检查的条件和要运行的操作组成。如果条件在 inspection 数据上评估为 true,则在节点上运行操作。

Ironic 提供了一个 API 来管理这些规则。 还有内置规则,这些规则是预先保存的,并从 YAML 文件加载,无法通过 API 进行 CRUD 操作。

可用的条件和操作由一组可扩展的插件定义。

有关如何 CRUD inspection 规则的信息,请参阅 Ironic API 参考文档中的 inspection 规则

操作和条件

条件和操作具有相同的基本结构

  • op - 操作:布尔值(条件)或一个操作(操作)。

  • args - 一个列表(Python *args 的含义)或一个字典(Python **kwargs 的含义),其中包含参数。

条件

可用的条件包括

  • is-true(value) - 检查 value 是否评估为布尔 True。此操作支持布尔值、非零数字和字符串“yes”、“true”。

  • is-false(value) - 检查 value 是否评估为布尔 False。支持布尔值、零、None 和字符串“no”、“false”。

  • is-none(value) - 检查 value 是否为 None。

  • is-empty(value) - 检查 value 是否为 None 或一个空字符串、列表或字典。

  • eq/lt/gt(*values, *, force_strings=False) - 检查所有值是否相等、小于/大于。如果 force_strings,所有值将首先转换为字符串后再进行检查。

  • in-net(address, subnet) - 检查给定的地址是否在提供的子网中。

  • contains(value, regex) - 检查 value 是否包含给定的正则表达式。

  • matches(value, regex) - 检查 value 是否完全匹配给定的正则表达式。

  • one-of(value, values) - 检查 value 是否在提供的列表中。类似于 contains,但也可用于非字符串值。

要检查任何这些条件的相反情况,请在 op 之前加上一个感叹号(可以选择带空格)。例如,eq - !eq

行动

可用的操作包括

  • fail(msg) - 使用给定的消息使 inspection 失败。

  • set-plugin-data(path, value) - 在插件数据中设置一个值。

  • extend-plugin-data(path, value, *, unique=False) - 将插件数据中的一个值视为一个列表,并将其附加到该列表。如果 unique 为 True,则如果该项目已存在,则不要附加。

  • unset-plugin-data(path) - 在插件数据中取消设置一个值。

  • log(msg, level="info") - 将消息写入 Ironic 日志。

  • set-attribute(path, value) - 设置给定路径(JSON patch 的含义)到该值。

  • extend-attribute(path, value, *, unique=False) - 将给定路径视为一个列表,并将其附加到该列表。

  • del-attribute(path) - 取消设置给定路径。在无效节点属性上失败,但在缺少子字典字段时不失败。

  • set-port-attribute(port_id, path, value) - 设置由 MAC 或 UUID 标识的端口上的值。

  • extend-port-attribute(port_id, path, value, *, unique=False) - 将给定端口上的路径视为一个列表,并将其附加到该列表。

  • del-port-attribute(port_id, path) - 取消设置由 MAC 或 UUID 标识的端口上的值。

循环

条件和操作都接受一个可选的 loop 参数,该参数是用于相同条件或操作的要迭代的项目列表。

loop 字段支持 Ansible 风格的循环(供参考,请参阅 Ansible 循环文档)。

在条件中,还有一个额外的(可选的)multiple 字段,该字段仅在存在 loop 字段时适用。它确定所有循环迭代的结果如何组合

  • any(默认)- 如果任何迭代的结果为 True,则返回 True

  • all - 仅当所有迭代的结果都为 True 时才返回 True

  • first - 返回第一个迭代的结果,如果第一个为 True,则跳过其余迭代

  • last - 仅使用最后一个迭代的结果,忽略之前的迭代

例如,此条件检查将在迭代的任何时候,如果“system”是 loop 列表中的任何模型,则返回 true

- op: eq
args: ["{inventory.system.product_name}", "{item}"]
loop: ["HPE ProLiant DL380 Gen10", "PowerEdge R640", "Cisco UCS"]
multiple: any

在操作中,循环的每次迭代都使用当前项目值执行相同的操作。

使用循环设置多个属性的示例

- op: set-attribute
  args: ["{item[path]}", "{item[value]}"]
  loop:
    - {path: "/driver_info/ipmi_username", value: "admin"}
    - {path: "/driver_info/ipmi_password", value: "password"}
    - {path: "/driver_info/ipmi_address", value: "{inventory[bmc_address]}"}

注意

点 ("driver_info.ipmi_username") 和斜杠 ("driver_info/ipmi_username") 符号路径都受支持。

变量插值

{“action”: “set-attribute”, “path”: “/driver_info/ipmi_address”,

“value”: “{data[inventory][bmc_address]}”}

在规则执行期间,用大括号括起来的值,通常是 valuemsgaddresssubnet 字段,在操作和条件中,将被视为替换字段,并使用 python 字符串格式化符号 格式化为字符串。

如果这些键中的任何一个的值是字典或列表,则结构中任何级别的嵌套字符串都将递归地格式化

{"action": "set-attribute", "path": "/properties/root_device",
 "value": {"serial": "{data[root_device][serial]}"}}

配置

in-band inspection 受所有硬件类型支持。 要使用它,必须启用 agent inspect 接口

[DEFAULT]
enabled_inspect_interfaces = agent,no-inspect

如果您希望所有节点自动使用它,可以将其设为默认值

[DEFAULT]
default_inspect_interface = agent

当然,您可以按节点配置它

$ baremetal node set --inspect-interface agent <NODE>