How to install OpenStack on CentOS (Train release) (Part 1/9)

This will be a full tutorial on installing OpenStack (minimal config). I would very much like to try open-source cloud OS, and OpenStack is one of the serious solutions, used by many institutions and businesses. Cern is one among the users, and Red Hat is strong supporter of OpenStack. 

Be aware: Even after this “ironed out” tutorial, you will be greeted with errors after you set everything up, and you will need to research more to get your OpenStack to work ok. I will write about some of the problems in a few more quick guides.

OpenStack also has reputation of being complicated to install and maintain and not very stable. I read a lot on the OpenStack topic, went through a lot of documentation and this is the result. This will cover manual installation of Train release, and this extensive series will cover every component of Minimal OpenStack install (don’t let this minimal fool you, there is plenty to do).

There are a few differences between OpenStack official documentation and deployment itself, so this tutorial should also help you save countless hours of looking for mistakes and deciphering errors through way.

Procedure is tedious, but I would highly recommend it, since at the end of it, you will have a good understanding of the basic principles of OpenStack.

More on the subject next time, let’s get to work.

There is a learning curve, and from what I read I believe that OpenStack is at this moment a stable solution for your cloud needs.

But, we’ll see along the way, lets dive in.


I will be using CentOS 7 for my installations (v.1908). I will be creating my LAB in VMware Fusion/Workstation. CentOS initial installation is minimal without GUI or any additions.

All of my VMs will have 4CPU cores and 8GB of RAM with minimum of 120GB hard drive.You can find minimum requirements here – 

Take note about additional requirements from network and drive components and add accordingly to your LAB.

My LAB has internet access.

I will be following OpenStack documentation along the way –

I will install Train build, which is the current one. I will start with Controller Node 1 and Compute Node 1.

Provider Network will be as follows (you need internet access for this configuration): – gateway – Controller Node 1 – Compute Node 1 – Block Storage Node 1 – Object Storage Node 1 – Object Storage Node 2

I will also later create network in range, that will be management network.

Here are also the names and IP addresses of the machines (you will also need them in hosts file): controller compute1 block1 object1 object2

Change Machine Hostname

For every machine in the lab change hostname. I will change my hostnames to the names I specifed just above this.

Command is below, controller is the name of one of the machines, change it to what you see fit.

sudo hostnamectl set-hostname controller

Here is what the change looks after reboot.

I named my machines – controller, compute1, block1, object1, object2.

Configure Name Resolution

Edit your network interface located in /etc/sysconfig/network-scripts

In my case, I have interface ifcfg-ens33

sudo vi /etc/sysconfig/network-scripts/ifcfg-ens33

I edited following lines (controller machine example):


Here is how it looks like

Reboot machine after you set ip configuration. Repeat these steps for all machines in the lab (of course set different IP address for each).

Update CentOS installation

Before we go any further, we will update our CentOS installations. This way we will also confirm our internet connectivity.

sudo yum update -y

Edit Hosts file

Again, we have to do that on each machine. We will edit hosts file, so that machines can see each other by the name.

sudo vi /etc/hosts/

This is what we need to enter       controller       compute1       block1       object1       object2

Here is how my file looks like

If we done everything ok, we should now be able to ping from controller to compute1 and vice versa by the name. (Make sure your ping is available through firewall)

Works.Enter these values into every hosts file on every machine and make sure you can ping each machine, and test from every machine.

Setup NTP service

Precise time measurement is important so we will set time server and attach clients to it. Time server will be our controller server and client all the other machines.

NTP server setup

We will do this on our controller server.

sudo yum install chrony -y

Enable and start service by running

sudo systemctl start chronyd
sudo systemctl enable chronyd

You can also check status of service by running

systemctl status chronyd

Next, we will edit /etc/chrony.conf file

sudo vi /etc/chrony.conf

For this tutorial I will leave default centos NTP servers. Otherwise if you want to edit NTP servers, you can, by adding command below (Replace NTP_SERVER with NTP server name)

server NTP_SERVER iburst

Also we will need to enable access for our NTP clients from local network by uncommenting and editing following line


Here is my config. Green part is where you will enter your NTP servers, and red part is enabled access from our local network for time sync.

Restart server or chrony service by typing in

sudo systemctl restart chronyd

We will check if our server is syncing time by typing in

chronyc sources

Service works for me.

We will also enable it through firewall

sudo firewall-cmd --permanent --add-service=ntp
sudo firewall-cmd --reload

NTP clients setup

These steps need to be done on the rest of the machines.

Again, we need to install chrony

sudo yum install chrony

Enable and start NTP service

sudo systemctl start chronyd
sudo systemctl enable chronyd

After that we again need to edit /etc/chrony.conf

sudo vi /etc/chrony.conf

You will need to delete all coment out all NTP servers and enter following

server controller iburst

Leave everything as is, and close file. This is how mine looks like.

Again, restart NTP service

sudo systemctl restart chronyd

And lets check if it works

chronyc sources

It works, client is communicating with NTP server.

And, on NTP server if we enter command 

chronyc clients

We will se that compute1 is NTP client

Repeat the step on the rest of the machines.

OpenStack Packages

These steps must be done on all nodes. If you haven’t update your CentOS installation, and also disable EPEL Repo.



subscription-manager repos --enable=rhel-7-server-optional-rpms \
  --enable=rhel-7-server-extras-rpms --enable=rhel-7-server-rh-common-rpms



Run following command (we are installing Train release)

sudo yum install centos-release-openstack-train

Next command we will run is

sudo yum upgrade

Reboot after it, and select new kernel to activate it.

Next command will be

sudo yum install python-openstackclient

And at last, we need integrate our OpenStack install into SELinux

sudo yum install openstack-selinux

SQL Database

Database will be installed on controller node.We will install MariaDB.

sudo yum install mariadb mariadb-server python2-PyMySQL

After installation is done, we will need to edit a openstack.conf located in /etc/my.cnf.d

sudo vi /etc/my.cnf.d/openstack.conf

We will create mysqld section with following info (make sure bind-address is address of your controller)

bind-address =

default-storage-engine = innodb
innodb_file_per_table = on
max_connections = 4096
collation-server = utf8_general_ci
character-set-server = utf8

Here is how it looks like in my case

Enable and start MariaDB

sudo systemctl enable mariadb.service
sudo systemctl start mariadb.service

We will also add firewall exception

sudo firewall-cmd --permanent --add-service=mysql
sudo firewall-cmd --reload

Finally we will secure our installation and set password for root sql user

sudo mysql_secure_installation

Message Queue

OpenStack uses message queue to coordinate operations and status between services. It usually runs on controller, so we will install it on controller. We will install RabbitMQ


sudo yum install rabbitmq-server

Start and enable service

sudo systemctl enable rabbitmq-server.service
sudo systemctl start rabbitmq-server.service

Add openstack user to it. Replace RABBIT_PASS with your password.

sudo rabbitmqctl add_user openstack RABBIT_PASS

Set permissions

rabbitmqctl set_permissions openstack ".*" ".*" ".*"

These are firewall settings for RabbitMQ

sudo firewall-cmd --zone=public --permanent --add-port=4369/tcp --add-port=25672/tcp --add-port=5671-5672/tcp --add-port=15672/tcp  --add-port=61613-61614/tcp --add-port=1883/tcp --add-port=8883/tcp
sudo firewall-cmd --reload

Optional SELinux command

setsebool -P nis_enabled 1


The Identity service authentication mechanism for services uses Memcached to cache tokens. The memcached service typically runs on the controller node, so I will install it on controller node.


sudo yum install memcached python-memcached

Next, we will edit /etc/sysconfig/memcached

sudo vi /etc/sysconfig/memcached

controller should be added to OPTIONS line, like this


At last, we will enable and start service

sudo systemctl enable memcached.service
sudo systemctl start memcached.service

Optional firewall settings for memcached

sudo firewall-cmd --new-zone=memcached --permanent
sudo firewall-cmd --zone=memcached --add-port=11211/udp --permanent
sudo firewall-cmd --zone=memcached --add-port=11211/tcp --permanent
sudo firewall-cmd --zone=memcached --add-source= --permanent
sudo firewall-cmd --reload


Short explanation from – OpenStack services may use Etcd, a distributed reliable key-value store for distributed key locking, storing configuration, keeping track of service live-ness and other scenarios.

Etcd should be installed on controller node.


sudo yum install etcd

Next we will edit /etc/etcd/etcd.conf

sudo vi /etc/etcd/etcd.conf

You should edit file like this and change values below to match your controller IP or name.


This is how my file looks like

Enable and start service

sudo systemctl enable etcd
sudo systemctl start etcd

Additional firewall settings

sudo firewall-cmd --add-port={2379,2380}/tcp --permanent
sudo firewall-cmd --reload

So, we are more or less “done” with initiall part, we will now be doing Minimal deployment for Train.

Minimal Deployment for Train

Ok, so we were successfull so far. We will now be doing minimal service deployment for Train. More details can be found here –

Services need to be installed in specified order, like depicted below

Since this tutorial is going a bit long already, I’m going to finish it here, and cover each of the services above in separate tutorial.

Important thing is to do all the services in exact order as they are below.

Here are the links

  1. Identity service – keystone installation for Train 

2. Image service – glance installation for Train

3. Placement service – placement installation for Train

4. Compute service – nova installation for Train

5. Networking service – neutron installation for Train

We advise to also install the following components after you have installed the minimal deployment services:

6. Dashboard – horizon installation for Train

7. Block Storage service – cinder installation for Train

8. Object Storage service – swift installation for Train

Additional links for after installation for errors you may encounter: