How-To

使用 baremetal CLI

如果您希望以无身份验证模式使用 baremetal CLI,则有以下两种配置身份验证参数的选项。

clouds.yaml

在安装期间,Bifrost 会创建一个 clouds.yaml 文件,其中包含访问 Ironic 所需的凭据。始终可用一个名为 bifrost 的云。例如

export OS_CLOUD=bifrost
baremetal node list

注意

此前,曾提供一个名为 bifrost-inspector 的单独云用于内省命令。现在已弃用,应始终使用主要的 bifrost 云。

环境变量

为了方便起见,会在当前用户的家目录中创建一个名为 openrc 的环境变量文件,其中包含这些变量的默认值,并且可以引用该文件以允许 CLI 连接到本地 Ironic 安装。例如

. ~/openrc bifrost
baremetal node list

这应该显示一个节点表,或者如果没有在 Ironic 中注册任何节点,则不显示任何内容。

安装 OpenStack CLI

从 Victoria 版本开始,只有在启用 Keystone 时才会安装 openstack 命令。安装 python-openstackclient Python 包以获取此命令。

库存文件格式

为了注册硬件,自然需要硬件的清单。在使用动态清单模块和配套角色时,清单可以以三种方式提供,所有这些最终都转换为 Ansible 解析的 JSON 数据。

当前的方法是使用 JSON 或 YAML 文档,清单解析器将将其转换为 Ansible 的数据。

JSON 格式类似于 ironic 内部使用的数据结构。

  • nameuuiddriverproperties 字段直接映射到 ironic。只有 driver 是必需的。

    注意

    如果启用了内省,大多数属性都会自动填充。但是,建议为具有多个磁盘的节点设置 根设备

  • driver_info 字段格式与 OpenStack Ansible 集合中的一种匹配,并且出于遗留原因可以使用嵌套结构 powerdeploymanagementconsole

    注意

    使用集合的较新版本,您应该直接将所有字段放在 driver_info 下。

  • nics 字段是用于创建的端口列表。必需的字段是 mac - 端口的 MAC 地址。

示例

{
    "testvm1": {
      "name": "testvm1",
      "driver": "ipmi",
      "driver_info": {
        "ipmi_address": "192.168.122.1",
        "ipmi_username": "admin",
        "ipmi_password": "pa$$w0rd"
      },
      "nics": [
        {
          "mac": "52:54:00:f9:32:f6"
        }
      ],
      "properties": {
        "cpu_arch": "x86_64",
        "root_device": {"wwn": "0x4000cca77fc4dba1"}
      }
    }
}

覆盖实例信息

这种格式的额外优势是易于配置参数注入,这有可能允许用户通过在 instance_info 变量中定义适当的设置,将不同的操作系统镜像置备到不同的硬件机箱上,例如

{
    "testvm1": {
      "uuid": "00000000-0000-0000-0000-000000000001",
      "name": "testvm1",
      "driver": "redfish",
      "driver_info": {
        "redfish_address": "https://bmc.myhost.com",
        "redfish_system_id": "/redfish/v1/Systems/11",
        "redfish_username": "admin",
        "redfish_password": "pa$$w0rd",
      },
      "nics": [
        {
          "mac": "52:54:00:f9:32:f6"
        }
      ],
      "properties": {
        "cpu_arch": "x86_64",
        "root_device": {"wwn": "0x4000cca77fc4dba1"}
      },
      "instance_info": {
        "image_source": "http://image.server/image.qcow2",
        "image_checksum": "<md5/sha256/sha512 checksum>",
        "configdrive": {
          "meta_data": {
            "public_keys": {"0": "ssh-rsa ..."},
            "hostname": "vm1.example.com"
          }
        }
      }
    }
}

instance_info 格式在 Ironic 部署指南 中有文档说明。以这种方式填充 configdrive 是一种 Bifrost 特有的功能,但 configdrive 本身遵循 Ironic 格式。

可以使用 JSON 和 YAML 格式以及主机特定变量注入的示例,可以在 playbooks/inventory/ 文件夹中找到。

静态网络配置

在构建 configdrive 时,Bifrost 可以在其中嵌入静态网络配置。此配置将由 first-boot 服务(例如 cloud-initglean)应用。可以设置以下字段

ipv4_address

节点的 IPv4 地址。如果缺失,则配置不会提供在 configdrive 中。

当设置 ipv4_address 时,它也用作 ansible_ssh_host 的默认值。因此,只要您使用 Bifrost 的清单插件,就可以对已部署的主机运行 SSH 命令。

此参数也可用于 DHCP 配置

ipv4_subnet_mask

IP 地址的子网掩码。默认为 255.255.255.0

ipv4_interface_mac

要配置的接口的 MAC 地址。如果缺失,则使用库存中定义的第一个 NIC 的 MAC 地址。

ipv4_gateway

默认路由器的 IPv4 地址。仅为测试用例提供默认值。

ipv4_nameserver

用于名称解析的服务器(字符串或列表)。

network_mtu

链路使用的 MTU。

例如

{
    "testvm1": {
      "name": "testvm1",
      "driver": "redfish",
      "driver_info": {
        "redfish_address": "https://bmc.myhost.com",
        "redfish_system_id": "/redfish/v1/Systems/11",
        "redfish_username": "admin",
        "redfish_password": "pa$$w0rd",
      },
      "ipv4_address": "192.168.122.42",
      "ipv4_subnet_mask": "255.255.255.0",
      "ipv4_gateway": "192.168.122.1",
      "ipv4_nameserver": "8.8.8.8",
      "nics": [
        {
          "mac": "52:54:00:f9:32:f6"
        }
      ],
      "properties": {
        "cpu_arch": "x86_64",
        "root_device": {"wwn": "0x4000cca77fc4dba1"}
      }
    }
}

警告

静态网络配置只有在您让 Bifrost 生成 configdrive 时才以这种方式工作。

注册硬件

从 Wallaby 周期开始,您可以使用 bifrost-cli 进行注册

./bifrost-cli enroll /tmp/baremetal.json

请注意,注册是一次性操作。Ansible 模块不会同步现有节点的数据。目前您应该使用 ironic CLI 手动执行此操作。

此外,重要的是要注意,注册的 playbook 根据 ipmi_bridging 设置分为三个单独的 playbook。

部署硬件

在注册节点后,可以对其进行部署。Bifrost 旨在利用配置驱动程序向每个主机传递基本配置信息。此配置信息包括一个 SSH 密钥,允许用户登录到系统。

从 Yoga 周期开始,您可以使用 bifrost-cli 进行部署。如果您使用 bifrost-cli 进行安装,则应传递其环境变量以及库存文件(请参阅 库存文件格式

./bifrost-cli deploy /tmp/baremetal.json \
    -e @baremetal-install-env.json

注意

默认情况下,playbook 会在部署开始后返回。传递 --wait 标志以等待完成。

库存文件可以覆盖一些部署设置,例如镜像甚至完整的 instance_info,每个节点。如果您省略它,Ironic 中的所有节点都将使用 Bifrost 默认值进行部署

./bifrost-cli deploy -e @baremetal-install-env.json

命令行参数

默认情况下,playbook 使用在安装期间下载或构建的镜像。您也可以使用自定义镜像

./bifrost-cli deploy -e @baremetal-install-env.json \
    --image http://example.com/images/my-image.qcow2 \
    --image-checksum 91ebfb80743bb98c59f787c9dc1f3cef \

注意

请参阅 OpenStack 镜像指南,了解获取客户机镜像的选项和位置。

您还可以提供自定义 configdrive URL(或其内容),而不是 Bifrost 为您构建的 configdrive

./bifrost-cli deploy -e @baremetal-install-env.json \
    --configdrive '{"meta_data": {"public_keys": {"0": "'"$(cat ~/.ssh/id_rsa.pub)"'"}}}' \

文件镜像不需要校验和

./bifrost-cli deploy -e @baremetal-install-env.json \
    --image file:///var/lib/ironic/custom-image.qcow2

注意

文件必须可供 Ironic 读取。您的家目录通常不是。

可以通过指定镜像类型来部署分区镜像

./bifrost-cli deploy -e @baremetal-install-env.json \
    --image http://example.com/images/my-image.qcow2 \
    --image-checksum 91ebfb80743bb98c59f787c9dc1f3cef \
    --partition

注意

默认根分区大小为 10 GiB。设置 deploy_root_gb 参数以覆盖或使用 first-boot 服务(例如 cloud-init)自动扩展根分区。

重新部署硬件

如果需要重新部署主机,可以使用动态重新部署 playbook

export BIFROST_INVENTORY_SOURCE=/tmp/baremetal.json
cd playbooks
ansible-playbook -vvvv -i inventory/bifrost_inventory.py redeploy-dynamic.yaml

此 playbook 将卸载主机,然后进行部署,允许在每个步骤中配置主机转换的超时时间。

使用 playbook 而不是 bifrost-cli

直接使用 playbook 允许您完全控制 Bifrost 执行的内容,使用哪些变量以及使用哪些库存。

利用动态清单模块,注册就像将 BIFROST_INVENTORY_SOURCE 环境变量设置为您的库存数据源,然后执行注册 playbook 那么简单

export BIFROST_INVENTORY_SOURCE=/tmp/baremetal.json
cd playbooks
ansible-playbook -vvvv -i inventory/bifrost_inventory.py enroll-dynamic.yaml

要使用基于动态清单的部署

export BIFROST_INVENTORY_SOURCE=/tmp/baremetal.json
cd playbooks
ansible-playbook -vvvv -i inventory/bifrost_inventory.py deploy-dynamic.yaml

如果您使用 bifrost-cli 进行安装,则应传递其环境变量

export BIFROST_INVENTORY_SOURCE=/tmp/baremetal.json
cd playbooks
ansible-playbook -vvvv \
  -i inventory/bifrost_inventory.py \
  -e @../baremetal-install-env.json \
  deploy-dynamic.yaml

操作系统部署和配置

默认情况下,Bifrost 部署一个配置驱动程序,其中包含用户的 SSH 公钥、主机名以及可以由 gleancloud-init 读取/解析的 network_data.json 形式的网络配置。这允许在裸机上部署 Ubuntu、CentOS 或 Fedora “租户”。

默认情况下,Bifrost 使用一种名为 simple-init 的实用程序,该实用程序利用前面提到的 glean 实用程序来应用网络配置。这意味着默认情况下,根文件系统可能不会自动扩展以消耗整个磁盘,这可能或可能不取决于操作需求。这取决于您使用的基本 OS 镜像,以及该镜像是否包含支持。目前,标准的 Ubuntu cloud 镜像包含 cloud-init,它将扩展根分区,但是 ubuntu-minimal 镜像不包含 cloud-init,因此不会自动扩展根分区。

由于设计的性质,用户可以轻松地将自动增长或重新配置步骤导入要部署的镜像中,或通过自定义 Ansible playbook 在部署后步骤中导入。

为了能够通过 SSH 访问节点,请确保 ./playbooks/inventory/group_vars/baremetal 中的 ssh_public_key_path 值指向有效的公钥文件,或者在命令行上设置 ssh_public_key_path 变量,例如 -e ssh_public_key_path=~/.ssh/id_rsa.pub

高级主题

使用远程 ironic

当 ironic 安装在远程服务器上时,应将包含目标服务器的常规 ansible 清单添加到 ansible。可以通过指定一个包含文件的目录来实现,该目录中的每个文件都将是 ansible 清单的一部分。请参阅 ansible 文档 https://docs.ansible.org.cn/ansible/intro_dynamic_inventory.html#using-inventory-directories-and-multiple-inventory-sources。示例

export BIFROST_INVENTORY_SOURCE=/tmp/baremetal.json
cd playbooks
rm inventory/*.example
ansible-playbook -vvvv -i inventory/ enroll-dynamic.yaml

构建自定义 Ironic Python Agent (IPA) 镜像

内容已移动,请参阅 构建自定义 Ironic Python Agent (IPA) 镜像

配置集成的 DHCP 服务器

内容已移动,请参阅 配置集成的 DHCP 服务器

将 Bifrost 与 Keystone 配合使用

内容已移动,请参阅 使用 Keystone