根据OpenStack官网描述,代号为“ironic”的裸机服务是一个由多个组件组成的集合,旨在管理和预置物理机。裸机服务包括”ironic-api”、”ironic-conductor”和”ironic-python-agent”组件。根据配置,裸机服务可以与多个其他OpenStack服务一起运行。本教程将主要介绍如何在三种流行的Linux发行版上安装和配置OpenStackIronic裸机服务。
一、安装Ironic的项目选项
可以选择多种项目之一进行Ironic的安装,其中裸机团队提供的Bifrost可独立安装而不需OpenStack其余部分。其他OpenStack团队开发的项目还包括:
1、Kolla:将Ironic作为OpenStack的一部分在容器中安装。
2、OpenStack-Ansible:支持安装Ironic。
3、TripleO:使用Ironic来配置裸机节点,也可用于安装Ironic。
二、安装和配置先决条件
裸机服务包含管理和预置物理机的组件,这些组件可以在单独的节点或同一节点上运行。在本指南中,所有组件将运行在同一节点上,通常是计算服务的计算节点。请确保已经配置好Identity、Image、Compute和Networking服务。
三、为裸机服务设置数据库
裸机服务的信息存储在数据库中。本指南中,我们将使用其他OpenStack服务所使用的MySQL数据库。
在MySQL中,创建一个用户可访问的数据库。请替换以下密码为合适的密码:
ironicironicIRONIC_DBPASSWORD
mysql -u root -p mysql> CREATE DATABASE ironic CHARACTER SET utf8mb3; mysql> GRANT ALL PRIVILEGES ON ironic.* TO 'ironic'@'localhost' \ IDENTIFIED BY 'IRONIC_DBPASSWORD'; mysql> GRANT ALL PRIVILEGES ON ironic.* TO 'ironic'@'%' \ IDENTIFIED BY 'IRONIC_DBPASSWORD';
注意:创建数据库时,请确保字符集不是四字节的Unicode字符。这是由于内部结构约束。MySQL中的UTF8实际上是指传统的“三字节编码”的UTF-8表示,但未来可能会迁移到与Ironic不兼容的”utf8mb4″。
尽管可以使用SQLite作为裸机服务的后端数据库,但应注意以下限制:
- Ironic必须在一体化模式下运行(详见配置单进程Ironic),此模式下不能有多个导体;
- 建议使用WAL模式,Ironic会尝试为新数据库启用该模式;
- 即便在WAL模式下,SQLite的写入并发性有限,若遇到“databaseislocked”错误,应降低定期任务的频率;
- 如果问题仍然存在,建议使用基于服务器的数据库;
- 并非所有数据库迁移在SQLite上都受支持,升级时可能需要重新创建数据库。
若要使用SQLite,请按如下格式配置连接:
[database] connection = sqlite:////full/path/to/ironic.sqlite
如有疑问,请选择MySQL/MariaDB。
四、安装和配置组件
可以在RHEL/CentOS Stream和RDO软件包上使用DNF进行安装:
dnf install openstack-ironic-api openstack-ironic-conductor python3-ironicclient
在Ubuntu/Debian上:
apt-get install ironic-api ironic-conductor python3-ironicclient
在openSUSE/SLES上:
zypper install openstack-ironic-api openstack-ironic-conductor python3-ironiccli
警告:对SUSE系统的支持是有限的,未在CI中进行测试。
裸机服务通过其配置文件进行配置,默认情况下,配置文件位于”/etc/ironic/ironic.conf”。虽然本文提到了一些配置选项,建议查看所有示例配置文件,以根据需求进行相应配置。可以在同一主机或不同主机上配置服务,若需处理更多裸机节点,可以添加新的”ironic-conductor”主机。但是,额外的”ironic-conductor”服务应与现有的服务同步运行。
裸机服务需要通过数据库存储信息,需配置数据库位置。使用以下格式替换为用户密码和数据库服务器的IP地址:
connectionIRONIC_DBPASSWORDironicDB_IP
[database] # The SQLAlchemy connection string used to connect to the # database (string value) connection=mysql+pymysql://ironic:IRONIC_DBPASSWORD@DB_IP/ironic?charset=utf
接下来,配置Ironic-API服务以使用RabbitMQ消息代理,修改以下选项以替换相应的RabbitMQ服务器的详细信息和凭证:
[DEFAULT] # A URL representing the messaging driver to use and its full # configuration. (string value) transport_url = rabbit://RPC_USER:RPC_PASSWORD@RPC_HOST:RPC_PORT/
另外,可以启用JSON RPC,配置”ironic-conductor”和”ironic-api”:
[DEFAULT] rpc_transport = json-rpc [json_rpc] # Authentication type to load (string value) auth_type = password # Authentication URL (string value) auth_url=https://IDENTITY_IP:5000/ # Username (string value) username=ironic # User's password (string value) password=IRONIC_PASSWORD # Project name to scope to (string value) project_name=service # Domain ID containing project (string value) project_domain_id=default # User's domain id (string value) user_domain_id=default
如果使用非默认的8089端口,请配置为:
[json_rpc] port = 9999
接着,配置Ironic-API服务以将凭证与身份服务关联。请替换以下信息为相关的IP地址和密码:
[DEFAULT] # Authentication strategy used by ironic-api: one of # "keystone" or "noauth". "noauth" should not be used in a # production environment because all authentication will be # disabled. (string value) auth_strategy=keystone [keystone_authtoken] # Authentication type to load (string value) auth_type=password # Complete public Identity API endpoint (string value) www_authenticate_uri=http://PUBLIC_IDENTITY_IP:5000 # Complete admin Identity API endpoint. (string value) auth_url=http://PRIVATE_IDENTITY_IP:5000 # Service username. (string value) username=ironic # Service account password. (string value) password=IRONIC_PASSWORD # Service tenant name. (string value) project_name=service # Domain name containing project (string value) project_domain_name=Default # User's domain name (string value) user_domain_name=Default # memcached setting (string value) memcached_servers=MEMCACHED_SERVER:11211
创建裸机服务的数据库表:
$ ironic-dbsync --config-file /etc/ironic/ironic.conf create_schema
重启”ironic-api”服务:
对于RHEL/CentOS/SUSE:
sudo systemctl restart openstack-ironic-api
Ubuntu/Debian:
sudo service ironic-api restart
五、使用Apache配置Ironic-API
裸机服务附带了一个示例文件,可将服务配置为在带有mod_wsgi的Apache后面运行。
注意:虽然可以使用独立脚本提供HTTP服务器,但通常建议使用如Apache或Nginx这样的WSGI支持的HTTP服务器,以获得更好的性能和灵活性。
1、安装Apache服务
Fedora/RHEL8/CentOS8:
sudo dnf install httpd
Debian/Ubuntu:
apt-get install apache2
SUSE:
zypper install apache2
2、从Ironic项目树下载相关文件,并将其复制到Apache网站配置目录下:
Fedora/RHEL8/CentOS8:
sudo cp etc/apache2/ironic /etc/httpd/conf.d/ironic.conf
Debian/Ubuntu:
sudo cp etc/apache2/ironic /etc/apache2/sites-available/ironic.conf
SUSE:
sudo cp etc/apache2/ironic /etc/apache2/vhosts.d/ironic.conf
停止并禁用 ironic-api 服务。如果 ironic-api 服务是 started,则端口将被占用。Apache 将无法启动:
Fedora/RHEL8/CentOS8/SUSE 的版本:
sudo systemctl stop openstack-ironic-api sudo systemctl disable openstack-ironic-api
Debian/Ubuntu:
sudo service ironic-api stop sudo service ironic-api disable
在 site 中启用 apache 并重新加载:ironic
Fedora/RHEL8/CentOS8:
sudo systemctl reload httpd
Debian/Ubuntu:
sudo a2ensite ironic sudo service apache2 reload
SUSE:
sudo systemctl reload apache2
六、配置WSGI容器
对于不能使用 Apache 的情况,可以使用其他 WSGI 容器,例如 Gunicorn。以下是如何配置 Gunicorn 来运行 Ironic-API 服务的示例命令:
gunicorn -b 0.0.0.0:6385 'ironic.api.wsgi:initialize_wsgi_app(argv=[])'
如果需要指定配置文件,可以使用以下命令:
gunicorn -b 0.0.0.0:6385 \ 'ironic.api.wsgi:initialize_wsgi_app(argv=["ironic-api", "--config-file=/path/to/ironic.conf"])'
七、配置Ironic-Conductor服务
在 “iniironic-conductor” 的配置中,首先需要设置 Conductor 主机的 IP 地址。请替换 “HOST_IP” 为实际的主机 IP。
[DEFAULT] # IP address of this host. If unset, will determine the IP # programmatically. If unable to do so, will use "127.0.0.1". # (string value) my_ip=HOST_IP
配置 “ironic-conductor” 使用与 “ironic-api” 相同的数据库设置。如下所示:
[database] # The SQLAlchemy connection string to use to connect to the # database. (string value) connection=mysql+pymysql://ironic:IRONIC_DBPASSWORD@DB_IP/ironic?charset=utf8
八、RabbitMQ消息代理配置
确保 “ironic-conductor” 配置与 “ironic-api” 使用相同的 RabbitMQ 消息代理设置。请将 “RPC_*” 配置替换为适当的 RabbitMQ 服务器的详细信息和凭证。
[DEFAULT] # A URL representing the messaging driver to use and its full # configuration. (string value) transport_url = rabbit://RPC_USER:RPC_PASSWORD@RPC_HOST:RPC_PORT/
可以使用 JSON RPC 进行 ironic-conductor 和 ironic-api。在配置中启用它并提供 用于对传入请求进行身份验证的 Keystone 凭证(可以 与 API 相同):
[DEFAULT] rpc_transport = json-rpc [keystone_authtoken] # Authentication type to load (string value) auth_type=password # Complete public Identity API endpoint (string value) www_authenticate_uri=http://PUBLIC_IDENTITY_IP:5000 # Complete admin Identity API endpoint. (string value) auth_url=http://PRIVATE_IDENTITY_IP:5000 # Service username. (string value) username=ironic # Service account password. (string value) password=IRONIC_PASSWORD # Service tenant name. (string value) project_name=service # Domain name containing project (string value) project_domain_name=Default # User's domain name (string value) user_domain_name=Default
可以选择更改 JSON RPC 服务将要更改的主机和端口 绑定到,例如:
[json_rpc] host_ip = 192.168.0.10 port = 9999
九、访问其他 OpenStack 服务的凭证配置
为了与其他 OpenStack 服务通信,”ironic” 服务需要使用服务用户凭证进行身份验证。以下是关于如何配置与 Neutron 和其他服务通信的示例。
[neutron] auth_type = password auth_url=https://IDENTITY_IP:5000/ username=ironic password=IRONIC_PASSWORD project_name=service project_domain_id=default user_domain_id=default cafile=/opt/stack/data/ca-bundle.pem region_name = RegionTwo valid_interfaces=public
如果希望使用特定服务的不同终端节点,可以通过 “endpoint_override” 进行配置,例如:
[neutron] endpoint_override = <NEUTRON_API_ADDRESS>
将 “<NEUTRON_API_ADDRESS>” 替换为特定网络服务终端节点。
十、重启Ironic-Conductor服务
完成所有配置后,需重启 Ironic-Conductor 服务:
RHEL/CentOS/SUSE:
sudo systemctl restart openstack-ironic-conductor
Ubuntu/Debian:
sudo service ironic-conductor restart
十一、单进程模式运行 Ironic
首先设置环境,如配置 ironic-api 服务和配置 ironic-conductor 服务,但不要 启动任何服务。将配置选项合并到单个配置中 文件。
如果不打算拥有多个 Conductor,则可以禁用 RPC 完全:
[DEFAULT] rpc_transport = none
如果现有服务已启动,请停止这些服务:
RHEL/CentOS/SUSE 中:
sudo systemctl stop openstack-ironic-api sudo systemctl stop openstack-ironic-conductor
Ubuntu/Debian:
sudo service ironic-api stop sudo service ironic-conductor stop
启动或重新启动 ironic 服务:
RHEL/CentOS/SUSE 中:
sudo systemctl restart openstack-ironic
Ubuntu/Debian:
sudo service ironic restart