安装指南

PyPI 安装(您可能需要使用 virtualenv 来隔离您的环境)

pip install ironic-inspector

此外,还有一个 DevStack 插件用于 ironic-inspector - 请参阅 如何贡献 以了解当前状态。

最后,一些发行版(例如 Fedora)提供打包的 ironic-inspector,其中一些发行版使用其旧名称 ironic-discoverd

有几个项目可用于在生产环境中设置 ironic-inspectorpuppet-ironic 提供 Puppet 清单,而 bifrost 提供基于 Ansible 的独立安装程序。 如果您计划手动安装 ironic-inspector,请参阅 配置

注意

请注意在 Ubuntu 上安装 ironic-inspector 时的 可能的 DNS 问题

示例配置文件

要生成示例配置文件,请从代码树的顶层运行以下命令

tox -egenconfig

有关预生成的示例配置文件,请参阅 Ironic Inspector 配置选项

要生成示例策略文件,请从代码树的顶层运行以下命令

tox -egenpolicy

有关预生成的示例配置文件,请参阅 Ironic Inspector 策略

安装选项

从 Train 版本开始,ironic-inspector 可以在非独立模式下运行,这意味着 ironic-inspector API 和 ironic-inspector conductor 是分离的服务,它们可以安装在同一主机或不同主机上。

以下是在非独立模式下运行 ironic-inspector 时需要考虑的一些事项

  • 根据安装中使用的 tooz 后端,可能需要额外的软件包。 例如,如果后端驱动程序配置为使用 etcd3+http://,则需要 etcd3gw,要使用 memcached:// 则需要 pymemcache。 一些发行版可能提供诸如 python3-etcd3gwpython3-memcache 之类的软件包。 支持的驱动程序列在 Tooz 驱动程序 中。

  • 对于在非独立模式下运行的 ironic-inspector,仅需要在部署 ironic-inspector conductor 服务的节点上配置 PXE。

  • 切换到其他数据库后端,而不是 sqlite。

配置

将示例配置文件复制到永久位置(例如 /etc/ironic-inspector/inspector.conf)。 填写这些最小配置值

  • DEFAULT 部分中的 standalone - 这决定了 ironic-inspector 服务是否打算单独部署。

  • keystone_authtoken 部分 - 用于检查用户身份验证时使用的凭据。

  • ironic 部分 - 用于访问 ironic API 时使用的凭据。 如果 ironic 以独立方式部署且没有身份验证,请指定以下内容

    [ironic]
    auth_type=none
    

    如果 ironic 以独立方式部署且使用 HTTP Basic 身份验证,则也需要有效的凭据

    [ironic]
    auth_type=http_basic
    username=myName
    password=myPassword
    
  • connectiondatabase 部分 - 数据库的 SQLAlchemy 连接字符串。 默认情况下,ironic-inspector 使用 sqlite 作为数据库后端,如果您在非独立模式下运行 ironic-inspector,请更改为其他数据库后端。

  • dnsmasq_interfaceiptables 部分 - dnsmasq(或其他 DHCP 服务)侦听 PXE 启动请求的接口(默认值为 br-ctlplane,这对于基于 tripleo 的安装来说是一个合理的默认值,但对于其他情况可能无法工作)。

  • 如果您希望使用 dnsmasq PXE/DHCP 过滤器驱动程序而不是默认的 iptables 驱动程序,请参阅 dnsmasq PXE 过滤器 说明。

  • store_dataprocessing 部分定义了存储内省数据的位置,并采用以下三个值之一

    none

    不存储内省数据(默认值)

    database

    内省数据存储在数据库中(推荐用于独立部署)

    swift

    内省数据存储在对象存储服务中(推荐用于完整的 openstack 部署)

    注意

    可以使用 ironic_inspector.introspection_data.store 入口点创建第三方存储后端。

有关其他可能的配置选项,请参阅 示例配置 中的注释。

注意

配置文件包含密码,因此应由 root 拥有,并且应具有类似 0600 的访问权限。

这是一个示例 inspector.conf(改编自 gate 运行)

[DEFAULT]
debug = false
rootwrap_config = /etc/ironic-inspector/rootwrap.conf

[database]
connection = mysql+pymysql://root:<PASSWORD>@127.0.0.1/ironic_inspector?charset=utf8

[pxe_filter]
driver=iptables

[iptables]
dnsmasq_interface = br-ctlplane

[ironic]
os_region = RegionOne
project_name = service
password = <PASSWORD>
username = ironic-inspector
auth_url = http://127.0.0.1/identity
auth_type = password

[keystone_authtoken]
www_authenticate_uri = http://127.0.0.1/identity
project_name = service
password = <PASSWORD>
username = ironic-inspector
auth_url = http://127.0.0.1/identity_v2_admin
auth_type = password

[processing]
ramdisk_logs_dir = /var/log/ironic-inspector/ramdisk
store_data = swift

[swift]
os_region = RegionOne
project_name = service
password = <PASSWORD>
username = ironic-inspector
auth_url = http://127.0.0.1/identity
auth_type = password

注意

如果希望查看完整的日志,请设置 debug = true

ironic-inspector 需要 root 权限才能管理 iptables。 它通过使用 sudo 运行 ironic-inspector-rootwrap 工具来获取这些权限。 为了允许它,请将文件 rootwrap.conf 和目录 rootwrap.d 复制到配置目录(例如 /etc/ironic-inspector/),并在 /etc/sudoers.d/ironic-inspector-rootwrap 中创建文件,内容如下

Defaults:stack !requiretty
stack ALL=(root) NOPASSWD: /usr/bin/ironic-inspector-rootwrap /etc/ironic-inspector/rootwrap.conf *

危险

请小心 /etc/sudoers.d/ironic-inspector-rootwrap 中的拼写错误,因为任何拼写错误都会破坏系统上所有用户的 sudo。 特别是,请确保此文件的末尾有一行新行。

注意

rootwrap.confrootwrap.d 中的所有文件只能由 root 写入。

注意

如果将 rootwrap.d 存储在不同的位置,请确保更新 rootwrap.conf 中的 filters_path 选项以反映更改。

如果您的 rootwrap.conf 位于不同的位置,则需要更新 ironic-inspector.conf 中的 rootwrap_config 选项以指向该位置。

stack 替换为您将用于运行 ironic-inspector 的用户。

配置 IPA

ironic-python-agent 是为 ironic 开发的 ramdisk,在 Liberty 周期中添加了对 ironic-inspector 的支持。 这是从 Mitaka 版本开始的默认 ramdisk。

注意

您需要在机器上至少有 2 GiB 的 RAM 才能使用使用 diskimage-builder 构建的 ironic-python-agent ramdisk,并且至少需要 384 MiB 才能使用 TinyIPA

要构建 ironic-python-agent ramdisk,请使用 ironic-python-agent-builder。 或者,您可以下载一个 预构建镜像

对于本地测试和 CI 目的,您可以使用 TinyIPA 镜像

配置 PXE

对于 PXE 启动环境,您需要

  • 正在运行且可访问的 TFTP 服务器(有关使用 dnsmasq,请参见下文)。 确保 TFTP 根目录中存在 pxelinux.0

    ironic-python-agent.kernelironic-python-agent.initramfs 复制到 TFTP 根目录。

  • 接下来,设置 $TFTPROOT/pxelinux.cfg/default,如下所示

    default introspect
    
    label introspect
    kernel ironic-python-agent.kernel
    append initrd=ironic-python-agent.initramfs ipa-inspection-callback-url=http://{IP}:5050/v1/continue systemd.journald.forward_to_console=yes
    
    ipappend 3
    

    {IP} 替换为机器的 IP(不要使用环回接口,它将在启动的机器上通过 ramdisk 访问)。

    注意

    虽然 systemd.journald.forward_to_console=yes 实际上不是必需的,但如果出现问题,它将大大简化调试。 您还可以通过附加 ipa-debug=1 来启用 IPA 调试日志记录。

    IPA 是可插拔的:您可以将称为 collectors 的内省插件插入到其中。 例如,要启用一个非常方便的 logs collector(将 ramdisk 日志发送到 ironic-inspector),请修改 $TFTPROOT/pxelinux.cfg/default 中的 append

    append initrd=ironic-python-agent.initramfs ipa-inspection-callback-url=http://{IP}:5050/v1/continue ipa-inspection-collectors=default,logs systemd.journald.forward_to_console=yes
    

    注意

    您可能始终希望保留 default collector,因为它提供了内省所需的基本信息。

  • 您需要 PXE 启动服务器(例如 dnsmasq)在与 ironic-inspector 相同的机器上运行。 不要进行任何防火墙配置:ironic-inspector 将为您处理它。 在 ironic-inspector 配置文件中,将 dnsmasq_interface 设置为您的 PXE 启动服务器侦听的接口。 以下是示例 dnsmasq.conf

    port=0
    interface={INTERFACE}
    bind-interfaces
    dhcp-range={DHCP IP RANGE, e.g. 192.168.0.50,192.168.0.150}
    enable-tftp
    tftp-root={TFTP ROOT, e.g. /tftpboot}
    dhcp-boot=pxelinux.0
    dhcp-sequential-ip
    

    注意

    dhcp-sequential-ip 用于,因为否则同时启动的许多节点会导致冲突 - 相同的 IP 地址被建议给多个节点。

配置 iPXE

iPXE 允许更好的扩展,因为它主要使用 HTTP 协议而不是缓慢且不可靠的 TFTP。 您仍然需要 TFTP 服务器作为不支持 iPXE 的节点的后备。 要使用 iPXE,您需要

  • 正在运行且可访问的 TFTP 服务器(有关使用 dnsmasq,请参见上述说明)。 确保 TFTP 根目录中存在 undionly.kpxe。 如果您的任何节点以 UEFI 启动,您还需要在那里获取 ipxe.efi

  • 您还需要一个能够提供静态文件的 HTTP 服务器。 将 ironic-python-agent.kernelironic-python-agent.initramfs 复制到那里。

  • 在 HTTP 根目录中创建一个名为 inspector.ipxe 的文件(您可以以不同的名称和位置命名它,只需记住调整下面的 dnsmasq.conf 示例)

    #!ipxe
    
    :retry_dhcp
    dhcp || goto retry_dhcp
    
    :retry_boot
    imgfree
    kernel --timeout 30000 http://{IP}:8088/ironic-python-agent.kernel ipa-inspection-callback-url=http://{IP}>:5050/v1/continue systemd.journald.forward_to_console=yes BOOTIF=${mac} initrd=agent.ramdisk || goto retry_boot
    initrd --timeout 30000 http://{IP}:8088/ironic-python-agent.ramdisk || goto retry_boot
    boot
    

    注意

    旧版本的 iPXE ROM 倾向于在不可靠的网络连接上表现不佳,因此我们使用带有重试的超时选项。

    就像使用 PXE 一样,您可以通过附加 ipa-inspection-collectors 内核选项来自定义 collector 列表。 例如

    ipa-inspection-collectors=default,logs,extra_hardware
    
  • 就像使用 PXE 一样,您需要一个 PXE 启动服务器。 但是,配置会有所不同。 以下是示例 dnsmasq.conf

    port=0
    interface={INTERFACE}
    bind-interfaces
    dhcp-range={DHCP IP RANGE, e.g. 192.168.0.50,192.168.0.150}
    enable-tftp
    tftp-root={TFTP ROOT, e.g. /tftpboot}
    dhcp-sequential-ip
    dhcp-match=ipxe,175
    dhcp-match=set:efi,option:client-arch,7
    dhcp-match=set:efi,option:client-arch,9
    dhcp-match=set:efi,option:client-arch,11
    # dhcpv6.option: Client System Architecture Type (61)
    dhcp-match=set:efi6,option6:61,0007
    dhcp-match=set:efi6,option6:61,0009
    dhcp-match=set:efi6,option6:61,0011
    dhcp-userclass=set:ipxe6,iPXE
    # Client is already running iPXE; move to next stage of chainloading
    dhcp-boot=tag:ipxe,http://{IP}:8088/inspector.ipxe
    # Client is PXE booting over EFI without iPXE ROM,
    # send EFI version of iPXE chainloader
    dhcp-boot=tag:efi,tag:!ipxe,ipxe.efi
    dhcp-option=tag:efi6,tag:!ipxe6,option6:bootfile-url,tftp://{IP}/ipxe.efi
    # Client is running PXE over BIOS; send BIOS version of iPXE chainloader
    dhcp-boot=undionly.kpxe,localhost.localdomain,{IP}
    

    首先,我们配置与 PXE 相同的通用参数。 然后,我们为 IPv4 定义 ipxeefi 标签,为 IPv6 定义 ipxe6efi6。 已经支持 iPXE 的节点被命令下载并执行 inspector.ipxe。 没有 iPXE 引导的 UEFI 节点将获得 ipxe.efi 固件来执行,而其余节点将获得 undionly.kpxe

配置 aarch64 的 PXE

对于 aarch64 Bare Metals,PXE 启动环境基本上与 x86_64 相同,您需要

  • 正在运行且可访问的 TFTP 服务器(有关使用 dnsmasq,请参见下文)。 确保 TFTP 根目录中存在 grubaa64.efi。 可以从 aarch64 的安装发行版中获取固件。

  • ironic-agent.kernelironic-agent.initramfs 复制到 TFTP 根目录。 请注意,ramdisk 需要使用诸如 ironic-python-agent-builder 之类的工具在 aarch64 机器上预构建,请参阅 https://docs.openstack.org/ironic-python-agent-builder/2025.2/admin/dib.html 以了解如何为 aarch64 构建 ramdisk。

  • 接下来,设置 $TFTPROOT/EFI/BOOT/grub.cfg,如下所示

    set default="1"
    set timeout=5
    
    menuentry 'Introspection for aarch64' {
        linux ironic-agent.kernel text showopts selinux=0 ipa-inspection-callback-url=http://{IP}:5050/v1/continue ipa-inspection-collectors=default ipa-collect-lldp=1 systemd.journald.forward_to_console=no
        initrd ironic-agent.initramfs
    }
    

    {IP} 替换为机器的 IP(不要使用环回接口,它将在启动的机器上通过 ramdisk 访问)。

  • 更新 aarch64 的 DHCP 选项,以下是示例 dnsmasq.conf

    port=0
    interface={INTERFACE}
    bind-interfaces
    dhcp-range={DHCP IP RANGE, e.g. 192.168.0.50,192.168.0.150}
    enable-tftp
    dhcp-match=aarch64, option:client-arch, 11 # aarch64
    dhcp-boot=tag:aarch64, grubaa64.efi
    tftp-root={TFTP ROOT, e.g. /tftpboot}
    dhcp-sequential-ip
    

配置多架构 PXE

如果环境由具有不同架构的裸机组成,通常需要为每个架构不同的 ramdisk。 grub 内置变量 grub_cpu 可用于找到每个架构的正确配置文件。

例如,设置 $TFTPROOT/EFI/BOOT/grub.cfg,如下所示

set default=master
set timeout=5
set hidden_timeout_quiet=false

menuentry "master"  {
configfile /tftpboot/grub-${grub_cpu}.cfg
}

为每个现有的架构准备特定的 grub 配置,例如,ARM64 的 grub-arm64.cfg 和 x86_64 的 grub-x86_64.cfg

更新 dnsmasq 配置以包含支持的架构的选项。

管理 ironic-inspector 数据库

ironic-inspector 提供了一个命令行客户端来管理其数据库。 此客户端可用于使用 alembic 迁移来升级和降级数据库。

如果这是您第一次运行 ironic-inspector 以迁移数据库,只需运行

ironic-inspector-dbsync --config-file /etc/ironic-inspector/inspector.conf upgrade

如果您之前运行过早于 2.2.0 版本的 ironic-inspector,最安全的方法是删除现有的 SQLite 数据库并运行如上所示的 upgrade。 但是,如果您想保存现有的数据库,以确保您的数据库将与迁移一起工作,您只需要在第一次运行版本 2.2.0 或更高版本时运行额外的步骤。

如果您是从 ironic-inspector 2.1.0 或更低版本升级

ironic-inspector-dbsync --config-file /etc/ironic-inspector/inspector.conf stamp --revision 578f84f38d
ironic-inspector-dbsync --config-file /etc/ironic-inspector/inspector.conf upgrade

如果您是在 rules 引入后从 git master 安装的 ironic-inspector

ironic-inspector-dbsync --config-file /etc/ironic-inspector/inspector.conf stamp --revision d588418040d
ironic-inspector-dbsync --config-file /etc/ironic-inspector/inspector.conf upgrade

其他可用命令可以通过运行来发现

ironic-inspector-dbsync --help

运行

独立模式下运行

执行

ironic-inspector --config-file /etc/ironic-inspector/inspector.conf

非独立模式下运行

API 服务可以使用以下命令在开发模式下启动

ironic-inspector-api-wsgi -p 5050 -- --config-file /etc/ironic-inspector/inspector.conf

对于生产环境,ironic-inspector API 服务应该托管在一个 Web 服务下。以下是使用 mod_wsgi 模块的 Apache 的示例配置

Listen 5050

<VirtualHost *:5050>
    WSGIDaemonProcess ironic-inspector user=stack group=stack threads=10 display-name=%{GROUP}
    WSGIScriptAlias / /usr/local/bin/ironic-inspector-api-wsgi

    SetEnv APACHE_RUN_USER stack
    SetEnv APACHE_RUN_GROUP stack
    WSGIProcessGroup ironic-inspector

    ErrorLog /var/log/apache2/ironic_inspector_error.log
    LogLevel info
    CustomLog /var/log/apache2/ironic_inspector_access.log combined

    <Directory /opt/stack/ironic-inspector/ironic_inspector/cmd>
        WSGIProcessGroup ironic-inspector
        WSGIApplicationGroup %{GLOBAL}
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

您可以参考 ironic 安装文档 获取更多指导。

ironic-inspector conductor 可以使用以下命令启动

ironic-inspector-conductor --config-file /etc/ironic-inspector/inspector.conf