安装指南¶
从 PyPI 安装(您可能需要使用 virtualenv 来隔离您的环境)
pip install ironic-inspector
此外,还有一个 DevStack 插件用于 ironic-inspector - 请参阅 如何贡献 以了解当前状态。
最后,一些发行版(例如 Fedora)提供打包的 ironic-inspector,其中一些发行版使用其旧名称 ironic-discoverd。
有几个项目可用于在生产环境中设置 ironic-inspector。 puppet-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-etcd3gw或python3-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
connection在database部分 - 数据库的 SQLAlchemy 连接字符串。 默认情况下,ironic-inspector 使用 sqlite 作为数据库后端,如果您在非独立模式下运行 ironic-inspector,请更改为其他数据库后端。dnsmasq_interface在iptables部分 -dnsmasq(或其他 DHCP 服务)侦听 PXE 启动请求的接口(默认值为br-ctlplane,这对于基于 tripleo 的安装来说是一个合理的默认值,但对于其他情况可能无法工作)。如果您希望使用
dnsmasqPXE/DHCP 过滤器驱动程序而不是默认的iptables驱动程序,请参阅 dnsmasq PXE 过滤器 说明。store_data在processing部分定义了存储内省数据的位置,并采用以下三个值之一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.conf 和 rootwrap.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.kernel和ironic-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 的内省插件插入到其中。 例如,要启用一个非常方便的
logscollector(将 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
注意
您可能始终希望保留
defaultcollector,因为它提供了内省所需的基本信息。您需要 PXE 启动服务器(例如 dnsmasq)在与 ironic-inspector 相同的机器上运行。 不要进行任何防火墙配置:ironic-inspector 将为您处理它。 在 ironic-inspector 配置文件中,将
dnsmasq_interface设置为您的 PXE 启动服务器侦听的接口。 以下是示例 dnsmasq.confport=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.kernel和ironic-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 定义
ipxe和efi标签,为 IPv6 定义ipxe6和efi6。 已经支持 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.kernel和ironic-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