Install and configure prerequisites
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The Bare Metal service is a collection of components that provides support to
manage and provision physical machines. You can configure these components to
run on separate nodes or the same node. In this guide, the components run on
one node, typically the Compute Service's compute node.

It assumes that the Identity, Image, Compute, and Networking services
have already been set up.


Set up the database for Bare Metal
----------------------------------

The Bare Metal service stores information in a database. This guide uses the
MySQL database that is used by other OpenStack services.

In MySQL, create an ``ironic`` database that is accessible by the
``ironic`` user. Replace ``IRONIC_DBPASSWORD`` with a suitable password:

.. code-block:: console

   # 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';

.. note::
   When creating the database to house Ironic, specifically on MySQL/MariaDB,
   the character set *cannot* be 4 byte Unicode characters. This is due to
   an internal structural constraint. UTF8, in these database platforms,
   has traditionally meant ``utf8mb3``, short for "UTF-8, 3 byte encoding",
   however the platforms are expected to move to ``utf8mb4`` which is
   incompatible with Ironic.

Running on SQLite
^^^^^^^^^^^^^^^^^

It is possible to run the Bare Metal service with SQLite_ as the database
backend. However, take into account the following limitations:

* You have to run Ironic in the all-in-one mode (see `configuring
  single-process ironic`_). You cannot have multiple conductors this way.

* You should use `WAL mode`_ for the database. Ironic will try to enable
  it for you, but it can only be done for a fresh database.

* Even in the WAL mode, SQLite has limited write concurrency. If you
  experience "database is locked" errors, try reducing the frequency
  of periodic tasks. If that still does not help, you may need to use
  a server-based database.

* Not all database migrations are supported on SQLite. You may need
  to re-create the database on upgrades.

To use SQLite, configure your connection like this:

.. code-block:: ini

   [database]
   connection = sqlite:////full/path/to/ironic.sqlite

.. note::
   This is not a typo! A full path requires 4 slashes.

If in doubt, use MySQL/MariaDB instead.

.. _sqlite: https://www.sqlite.org
.. _WAL mode: https://www.sqlite.org/wal.html
